Dispo Lifecycle Hub

This hub covers the buyer-side disposition pipeline — from a deal graduating out of acquisitions through 4-channel buyer blast and TC handoff. It is the downstream continuation of acquisitions-lifecycle and the orchestration layer for the dispo-blast skill. Read this hub when a deal has been qualified by acquisitions and is ready for buyer outreach. For blast engine mechanics, go to buyer-blast.

⚠️ NEVER bypass —dry-run

The blast engine (dispo-blast-engine.js) MUST be run with --dry-run unless you have explicit blast auth from Henry. No exceptions. Bypassing dry-run fires live SMS to potentially hundreds of buyers.

Quick reference

FieldValue
StagesDeal qualification → HubSpot dispo pipeline (816046) → Pre-blast checks → 4-channel blast → TC handoff
Primary agent_summary
Supporting agents_summary (IB scoring), _summary (TC ops)
Agent handoff chainacquisitions (Category F inbound) → dispo (blast coordinator) → atlas (IB scoring) → betterfiles (TC / CDA / docs)
Compliance gates listdefer to compliance-gates
Skills invokeddispo-blast, hubspot-deal-ingest, betterfiles-dispo-emails
Success metricsBuyer replies per deal; blast open rate; days-to-contract; IB score distribution
Cost per stagePre-blast: ~0.01 SMS × recipients per channel
Throughput~5-20 active dispo deals; blast runs on-demand or weekly w4 broadcast
Last run resultSee ib_blast_history table + webhook_audit_log (Supabase CCP)
Failure modes0 buyers matched (threshold too high), 429 from SalesMsg/OpenPhone, CRMLS auth fail, suppressed buyer slip-through

Stage 1 — Deal Graduation from Acquisitions

Triggered when acquisitions-lifecycle Stage 4 inbound classifies as Category F (Buyer interest) OR Henry manually moves a deal to the dispo pipeline.

Entry conditions:

  • acquisition_deals row has qualification_status='qualified'
  • HubSpot deal exists in acq pipeline 877963314
  • hubspot-deal-ingest has created a corresponding dispo deal in pipeline 816046 (dual-write)
  • Deal status: dispositioning

Key action:

  • createDealFromParsed() in workspace/scripts/hubspot-deal-creator.js (1006 lines, 11 exports) handles dedup, contact find-or-create, dual-pipeline write, deal-to-deal association
  • Skill: hubspot-deal-ingest

Stage 2 — Pre-Blast Checks (4 history checks)

Before any blast is fired, ib-blast-history.js runs 4 checks per buyer:

  1. Already-blasted check — sent this exact deal to this buyer in last 7d? → skip
  2. Recent-engagement check — buyer replied to ANY blast in last 14d? → lower priority
  3. Saturation check — sent ≥3 blasts to this buyer in last 7d? → skip
  4. Suppression check — buyer in messaging_suppression table? → skip

Any check fails → blast skipped, reason logged to ib_blast_history.

Run preview first:

node -e "const p = require('/home/opsadmin/.openclaw/workspace/scripts/lib/blast-preview.js'); p.preview({ dealId: 'X', channels: [3,4] }).then(r => console.log(JSON.stringify(r, null, 2)));"

Stage 3 — 4-Channel Buyer Blast

Full mechanics:buyer-blast Skill:dispo-blast

The 4 channels:

#ChannelCohortDedup window
1Showing-dayAll prior buyers + watchlist24h pre-showing
2CRMLS agentsActive LA agents (recent sales by zip+price)30d per agent
3InvestorBase end-buyersIB platform buyers (fit score ≥60)7d per (deal, buyer)
4PropStream flippersCold flippers (≥3 recent purchases)90d per flipper

Coordinator: workspace/scripts/dispo-blast-engine.js

# ALWAYS dry-run first
node /home/opsadmin/.openclaw/workspace/scripts/dispo-blast-engine.js \
  --deal-id=<HS dispo deal ID> --channels=1,2,3,4 --dry-run
 
# Live blast — requires explicit Henry auth
node /home/opsadmin/.openclaw/workspace/scripts/dispo-blast-engine.js \
  --deal-id=<HS dispo deal ID> --channels=1,2,3,4

InvestorBase scoring details → buyer-blast §IB-scoring.


Stage 4 — Blast Response Handling + TC Handoff

Buyer replies route back through acquisitions-lifecycle Stage 4 inbound handlers:

  • OpenPhone webhook (port 18792): webhooks/quo-handler-enhanced.js
  • SalesMsg webhook (port 18793): webhooks/salesmessage-handler-v4-complete.js
  • conversation-classifier.js handles buyer-side classification
  • acquisitions-followup routes buyer F-category to TC

TC handoff triggers _summary for:


Weekly w4 Broadcast

Every Wednesday morning, all dispo pipeline deals blast to all buyer cohorts:

node /home/opsadmin/.openclaw/workspace/scripts/w4-broadcast-blast.js --dry-run

Post-Blast Audit

node /home/opsadmin/.openclaw/workspace/scripts/audit-blast-responses.js --deal-id=X

Returns: buyer replies, classification, stage transitions triggered.

Agents that touch this

  • _summary — primary coordinator
  • _summary — InvestorBase scoring + CRMLS enrichment
  • _summary — TC ops (CDA, dispo emails, docs)
  • _summary — inbound buyer reply classification

Skills that invoke this

Plans that govern this

Feedback rules

KB / source docs

  • API — InvestorBase buyer API
  • API — CRMLS agent lookup
  • API — PropStream flipper search
  • API — SalesMsg send API
  • API — HubSpot dual-pipeline

System maps

Open issues / TODOs

  • 10DLC A2P repeat-denial blocks ALL SMS blast channels until resolved. See osil-twilio-10dlc-resubmission-2026-05-03 B14.
  • InvestorBase acquisition.sqlite anomaly (1 chunk) may impact IB scoring memory. Investigate per openclaw-fragmentation-fix-2026-05-01 §A2.3.
  • CRMLS auth token rotation schedule not documented. Cross-check master.env CRMLS section quarterly.
  • PropStream daily quota not tracked in dashboard — add to cost-tracking hub.

Recent activity

  • 2026-05-03: hub created by W1-S9
  • 2026-05-03: 4-stage dispo lifecycle map with 4-channel blast reference authored