CRM — Leads, Contacts, Accounts, Opportunities
Hydra's CRM has four core objects. Each one has a clear purpose and a strict relationship to the others, modeled on the standard Salesforce/HubSpot pattern.
The four objects
| Object | What it is | Required field |
|---|---|---|
| Lead | An unidentified person who hasn't shared an email yet | None |
| Contact | An identified person you know by email | Must be linked to an Account |
| Account | A company or organization | Name |
| Opportunity | A potential deal attached to an Account | Account, name |
How they relate
- A Lead has no account. They're anonymous visitors or inbound form submissions where you don't yet know which company they belong to.
- A Contact is always linked to exactly one Account.
- An Account can have many Contacts and many Opportunities.
- An Opportunity always belongs to an Account, and optionally has one primary Contact.
- Lifecycle stage (Prospect / Active / At Risk / Churned) lives on the Account, not on individual people. A person doesn't churn — their company does.
Leads
Creating a lead manually
Go to Leads → New Lead. Fill in whatever you know — name, phone, company, and optional notes. Email is optional; if you know it, fill it in, but a Lead doesn't require one.
Auto-created leads
Leads can be created automatically from a few sources:
- Anonymous widget chat — when an unidentified visitor chats in via the widget, Hydra creates a Lead for them. If they share their email mid-conversation, the Lead can be converted to a Contact (but only if they can also be linked to an Account).
- Bot capture (behaviors) — when a bot pursues a behavior with capture fields and successfully collects the visitor's info, that creates a Lead with
source = bot. The Lead is linked back to the originating bot and conversation via thesource_conversation_idprovenance column. - Marketing site forms — submissions to the public waitlist endpoint create a Lead (or update one if the email already exists).
Bot-captured Leads are de-duplicated by email — if the same visitor is captured twice, you get one Lead with the original provenance preserved, not two.
View originating conversation
Any Lead or Contact with at least one conversation shows a → View originating conversation link in the detail header. Clicking it opens the inbox with that conversation pre-selected and the correct tab (messaging or email) auto-focused.
For bot-captured Leads, the link points at the exact conversation where capture happened (stored in source_conversation_id). For anonymous widget-created Leads — where no capture event ever fired — the link falls back to the oldest conversation on the record, which is the interaction that caused the Lead to be inserted in the first place. Leads with zero conversations (e.g. pure manual creation) don't render the link.
Editing the name or email
On a Lead or Contact detail page, click the name in the header (or the "Anonymous" placeholder for unidentified leads) to edit it inline. The same applies to the email line directly below — click an existing email to change it, or click + Add email when none is set. Press Enter to save, Esc to cancel, or click outside to save.
Adding an email to a Lead does not convert it to a Contact — emails captured by chat or by manual edit both stay on the Lead until someone clicks Convert to Contact and picks an Account. The two-step flow is deliberate: every Contact in Hydra is bound to an Account, so promotion has to be explicit.
Converting a lead to a contact
From a Lead's detail page, click Convert to Contact. A modal opens and collects:
- Email (required) — pre-filled if the Lead already has one
- Account — pick an existing account OR create a new one inline
- Opportunity (optional) — check the box to also create an opportunity during conversion (Growth plan or higher)
On success, the Lead becomes a Contact linked to the chosen Account, and if an Opportunity was requested, it's created and linked to both.
Contacts
Contacts are identified people, always tied to an Account.
Creating a contact manually
Go to Contacts → New Contact. The form collects name, email (required), phone, job title, and notes — plus an Account section with two tabs:
- Existing Account — pick from a dropdown of accounts you've already created
- New Account — fill in company name, domain, industry, website, and phone to create an account inline
A contact cannot be saved without an account.
Demoting a contact to a lead
If you realize a record shouldn't be a contact (bad data, wrong person, etc.), click Demote to Lead on the contact detail page. The person is moved back to Leads and the account association is cleared.
This is the only way to remove a contact's account — direct "unlink" is not supported because contacts must always have an account.
Reassigning to a different account
Use the Account dropdown on the contact's profile to switch them to a different account. The lifecycle events timeline records the move.
Accounts
Accounts are companies. Every Account has a lifecycle stage:
| Stage | Meaning |
|---|---|
| Prospect | Not yet a paying customer |
| Active | Active customer relationship |
| At Risk | Showing churn signals |
| Churned | Ended their relationship |
Creating an account
Click New Account on the Accounts page. Account name is the only required field.
Adding a contact to an account
On any account detail page, click + Add Contact in the Contacts section. You'll be taken to the New Contact form with this account pre-selected.
Account fields
Accounts track industry, website, phone, MRR, health score (0–100), renewal date, and renewal status. You can also attach custom fields from Settings → Custom Fields.
Onboarding plans
An onboarding plan is a checklist of milestones for a new account. Create one from the account detail page, add milestones with due dates, and check them off as completed. Milestone completions can trigger Flows.
Deleting an account
An account can only be deleted once all of its Contacts and Opportunities have been moved or deleted. This prevents accidental data loss — the alternative would be silently orphaning records.
Opportunities
Growth plan or higher. Opportunities are not available on the Starter plan.
An Opportunity is a potential deal — a specific thing you're trying to sell to an Account.
Stages
Opportunities move through six standard stages:
- Prospecting — early, qualifying the need
- Qualification — confirmed fit and budget
- Proposal — formal offer delivered
- Negotiation — working through terms
- Closed Won — deal signed
- Closed Lost — deal lost or abandoned
Creating an opportunity
Three entry points:
- Opportunities → New Opportunity — full form
- Account detail → Opportunities → + New Opportunity — account pre-filled
- Contact detail → Opportunities → + New Opportunity — account and contact pre-filled
- Lead convert modal — check "Also create an opportunity" when converting a lead
Required fields: name, account. Optional: primary contact (from the account's contact list), stage, amount, close date, probability, notes.
Pipeline view
The Opportunities page groups opportunities by stage and shows totals at the top:
- Open Pipeline — sum of amounts on all non-closed opportunities
- Weighted — amount × probability on all open opportunities (forecast)
- Won — sum of Closed Won amounts
Moving through stages
On an opportunity's detail page, click Advance to [next stage] for the quick forward action, or use Mark Won / Mark Lost to close the deal. Stage changes emit lifecycle events so Flows can react (e.g. send a congratulations email on Closed Won).
Plan gating
| Feature | Starter | Growth | Scale |
|---|---|---|---|
| Leads | ✅ | ✅ | ✅ |
| Contacts | ✅ | ✅ | ✅ |
| Accounts | — | ✅ | ✅ |
| Opportunities | — | ✅ | ✅ |
Lifecycle events
Every person, account, and opportunity has an append-only timeline recording conversions, stage changes, account links, and custom events raised by Flows. Events are never deleted — it's your audit trail.
Visitor timeline
Open any Lead or Contact detail page and you'll see a Site activity card mounted directly below the Profile card, above Latest report / Tickets / Conversations. It's a chronological view of everything that person did on your site — pageviews, sessions, custom events, and identify calls — pulled from the same data source as the global Site Activity dashboard but scoped to this one record.
The card only has data for people who have browsed a page where a tracking-enabled widget is embedded. If you're not seeing anything yet, see Site Activity tracking for how to turn tracking on for a widget.
Summary tiles
The top of the card has four tiles:
- Sessions — count of distinct browsing sessions. A session is contiguous activity with no more than 30 minutes of silence between events; once that gap opens, the next event starts a new session.
- Time on site — sum of session durations across every session, formatted human-readable (e.g.
12m,1h 5m). - Last seen — date and time of the most recent event of any kind.
- Custom events — count of events fired via
hydra.track()from your site code. Pageviews and session-starts don't count toward this number.
Top pages
Below the tiles is a Top pages list — the five most-viewed page paths for this person, with view counts. If they've only visited one or two pages, the list is shorter; if they've visited fewer than five distinct paths, there's no padding.
Timeline
The chronological Timeline sits below Top pages. Events are grouped into sessions, newest session first, and each session shows its start time, end time, and total event count. Within a session, events render with:
- An icon —
📄pageview,✨session start,👤identify,🎯custom event - The page path (for pageviews) or event name (for custom / identify events)
- A property summary for custom events, when properties were attached via
hydra.track('name', { ... }) - A relative timestamp —
3m ago,2h ago,5d ago, or an absolute date for older events
Empty state
If the person has no recorded site activity, the card shows: "No site activity captured for this contact." Two reasons this typically appears:
- Tracking isn't enabled on the widget they used. Site Activity is per-widget and off by default. The empty state is the same whether tracking was never turned on or the widget they encountered didn't have it on.
- They never browsed a tracked page. A Lead created manually, or one that came in via an inbound email, has no widget script in their history to record events from.
Pre-chat events show up too
Hydra stitches anonymous browsing history to the CRM record once a visitor identifies themselves — typically by chatting and giving the bot a name and email, or by your site code calling hydra.identify() after they log in. The timeline shows everything the person did before they were identified as well as everything after.
This is what makes the timeline useful for sales context — you can see which pricing page a Lead read, how long they spent on the docs, and what custom events they hit before they ever opened a chat.
Custom fields
You can add custom fields to Contacts, Accounts, and Opportunities under Settings → Custom Fields. Field types: text, number, date, select (dropdown), boolean.
