Outbound funnel
Stages
flowchart TD A["Marketplace row\nSmartScout search result"] --> B["Seller row\nsellers.lifeCycleStage = new"] B --> C["Enriched seller\nwebsite, LinkedIn, contacts\nlifeCycleStage = enriched"] C --> D["Scored seller\npayoutPainScore 0-100"] D --> E["HubSpot Company\n+ associated Contacts"] E --> F["Outreach\nemail campaign / AI dialer"] F --> G["Engagement signal\nclick, reply, call outcome, account created"] G --> H["Re-engagement segment\nBigQuery view membership"] H --> I["Daily call list\ncall_list_date + call_priority + owner"] I --> J["Rep call\nFive9 or Nooks"] J --> K["Follow-up task\nfollow_up_tasks + HubSpot Task"] K --> L["Deal\nHubSpot Deal / demo booked"] J -->|no answer, stale| H L -->|lost or stalled| H
Who owns each transition
| Transition | Owner | Rule reference |
|---|---|---|
Marketplace row → seller row |
|
|
Seller row → enriched |
|
|
Enriched → scored |
|
|
Scored → HubSpot Company + Contacts |
|
|
HubSpot → outreach |
The Payability web application (campaigns, sequences, AI dialer) — outside this repository |
— |
Outreach → engagement signal |
HubSpot engagements, |
|
Engagement signal → segment membership |
BigQuery views in |
|
Segment → daily call list |
Five scheduled handlers across |
|
Call list → materialised HubSpot list |
|
|
Rep call → logged call |
|
|
Call → follow-up task |
|
|
Task → completion or failure |
|
|
Deal stage changes |
|
Seller lifecycle stages
sellers.lifeCycleStage (SellerLifeCycleStage enum). The pipeline only ever
writes new (at ingest) and enriched (after a successful enrichment pass).
The later stages exist for the wider platform.
new → raw_lead → enriched → in_sequence → engaged → qualified
→ bdr_handoff → demo_scheduled → opportunity → customer
(or disqualified)
Two columns act as pipeline gates rather than stages:
| Column | Gate |
|---|---|
|
Non-null means the enrichment pass has run. |
|
Non-null means the scoring pass has run. |
Contact lifecycle stages
contacts.lifecycleStage mirrors HubSpot’s lifecyclestage. Morpheus only ever
promotes, never demotes: maybe_promote_lifecycle_stage() in
lambdas/morpheus_hubspot/services/lifecycle_stage.py ranks the current stage and
writes marketingqualifiedlead only when the current rank is lower.
| Stage | Rank |
|---|---|
|
0 |
|
1 |
|
1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
The whole function is best-effort: a CRM read or write failure is logged and the caller continues. See lifecycle promotion.
Two directions of travel
- Forward — new sellers
-
Discovery → enrichment → scoring → CRM. Driven by SmartScout and queue messages. This path creates records.
- Backward — existing contacts
-
Engagement signal → BigQuery segment → call list. Driven by schedules and CRM data. This path creates attention, not records. It is where most of the business logic now lives, because the CRM already contains far more contacts than discovery adds.
Both converge on the same asset: a prioritised, owned, dated call list that a human works top-down.