Skip to content
Start free trial

Contacts and the Lifecycle

A Contact is a person you do business with. HARi keeps a single record per person and tracks where they are in your buyer journey via a Lifecycle Stage field. There’s no separate Lead entity to maintain in parallel — you don’t end up with the same person tracked twice.

Every Contact has a lifecycle_stage value drawn from a fixed list. The stage is what HARi uses to decide which views, dashboards, and automations a contact appears in.

StageWhenWhat it means
LeadDefault for new contacts created through intake forms or importsA prospect you haven’t yet qualified — minimal information, no commitment
QualifiedAfter your sales process flags them as worth pursuingActive opportunity territory — they fit the customer profile and have budget/intent
CustomerAfter they sign / pay / convertExisting customer relationship — visible in customer-success views and renewal pipelines
LostWhen a Lead or Qualified prospect doesn’t convertArchived for funnel analysis — not deleted, but filtered out of active sales views

Default for freshly-created contacts is Lead so anyone landing in your CRM via a web form or chrome-extension capture starts as a prospect. You move them through stages as the relationship develops — either manually, via the contact’s edit form, or automatically via workflow actions.

The stage field appears in three places by default:

  1. Active Leads view — filtered to Lifecycle Stage IN (Lead, Qualified). Replaces the old /lead workspace; the URL is /contact?view=contacts_leads.
  2. Dashboard chart — pre-built grouping by lifecycle stage so you can see your funnel composition at a glance.
  3. Per-record badge — visible on the contact’s detail page next to their name, colored to match the stage (Lead = amber, Qualified = blue, Customer = green, Lost = red).

You can build additional saved views on the Contact entity that filter by stage — e.g. “My Customers” filtered to Lifecycle Stage = Customer AND owner = me, or “Lost prospects to re-approach” filtered to Lifecycle Stage = Lost AND last_activity > 90 days ago.

Workspaces created before April 2026 had a separate lead entity that’s now retired. Existing Lead records aren’t touched automatically — your admin runs a one-shot migration during a maintenance window:

  1. The migration creates a Contact for each active Lead, copying source + description into notes, setting lifecycle_stage = Lead.
  2. If a Lead had a non-zero estimated value AND a linked Contact AND no existing Opportunity on that Contact, the migration also creates an Opportunity at the “Qualification” stage with the Lead’s amount.
  3. The old Lead row is soft-archived but the table stays in place for one quarter as a safety net (full table drop ships in a future release after admins confirm zero reads against it).

Until your admin runs the migration, your old Lead records stay accessible from the Lead workspace exactly as before. The transition is on your timeline, not ours.

  • Companies — still a separate entity. Companies represent organizations; Contacts represent the people inside those organizations who you talk to.
  • Opportunities — still a separate entity. An Opportunity is a deal-in-progress (with stage, amount, close date); a Contact is a person you might have many deals with over time.
  • Owner / Team — every Contact still has an owner and an optional team for permission scoping. Lifecycle Stage is independent of ownership.
  • Don’t use Lifecycle Stage as a status field. If you need finer-grained stages for your own pipeline (e.g. “trial signup” → “trial active” → “paying”), build them as a separate select field. Lifecycle Stage is the canonical Lead/Customer signal that workflows + AI assistants read; keeping it simple makes those work.
  • Bulk-update lifecycle stage on imports. When you import a list of existing customers, set lifecycle_stage = “Customer” in the CSV — otherwise they all default to “Lead” and your funnel charts misread.
  • Use lifecycle filters in workflow triggers. Instead of “fired on every new contact”, scope to “fired on contacts where Lifecycle Stage changes to Qualified” so onboarding flows don’t fire on every cold lead.