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
| Field | Value |
|---|---|
| Stages | Deal 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 chain | acquisitions (Category F inbound) → dispo (blast coordinator) → atlas (IB scoring) → betterfiles (TC / CDA / docs) |
| Compliance gates list | defer to compliance-gates |
| Skills invoked | dispo-blast, hubspot-deal-ingest, betterfiles-dispo-emails |
| Success metrics | Buyer replies per deal; blast open rate; days-to-contract; IB score distribution |
| Cost per stage | Pre-blast: ~0.01 SMS × recipients per channel |
| Throughput | ~5-20 active dispo deals; blast runs on-demand or weekly w4 broadcast |
| Last run result | See ib_blast_history table + webhook_audit_log (Supabase CCP) |
| Failure modes | 0 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_dealsrow hasqualification_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()inworkspace/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:
- Already-blasted check — sent this exact deal to this buyer in last 7d? → skip
- Recent-engagement check — buyer replied to ANY blast in last 14d? → lower priority
- Saturation check — sent ≥3 blasts to this buyer in last 7d? → skip
- Suppression check — buyer in
messaging_suppressiontable? → 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:
| # | Channel | Cohort | Dedup window |
|---|---|---|---|
| 1 | Showing-day | All prior buyers + watchlist | 24h pre-showing |
| 2 | CRMLS agents | Active LA agents (recent sales by zip+price) | 30d per agent |
| 3 | InvestorBase end-buyers | IB platform buyers (fit score ≥60) | 7d per (deal, buyer) |
| 4 | PropStream flippers | Cold 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,4InvestorBase 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.jshandles buyer-side classification- acquisitions-followup routes buyer F-category to TC
TC handoff triggers _summary for:
- Dispo email drafts → betterfiles-dispo-emails
- CDA generation → betterfiles-cda
- Document upload and TC coordination
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-runPost-Blast Audit
node /home/opsadmin/.openclaw/workspace/scripts/audit-blast-responses.js --deal-id=XReturns: buyer replies, classification, stage transitions triggered.
Cross-links
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
- dispo-blast — 4-channel blast engine (canonical)
- hubspot-deal-ingest — dual-pipeline deal creation
- betterfiles-dispo-emails — TC email drafts
- betterfiles-cda — Commission Disbursement Allocation
Plans that govern this
- openclaw-fragmentation-fix-2026-05-01 — governance gates
- openclaw-self-improvement-layer-2026-05-03 — OSIL adds scoring model optimization
Feedback rules
- feedback_dispo_scorer_rules — IB scoring rules; do not override thresholds without review
- feedback_blast_inbox_required — blast must hit inbox not spam
- feedback_sms_160_char_at_scale — 160-char limit enforced at scale
- feedback_no_em_dash — no em-dashes in outbound copy
- feedback_salesmsg_mention_syntax — SalesMsg mention syntax
- feedback_never_send_without_auth — explicit auth required for live blast
- feedback_dispo_sip_vs_tenant — SIP vs tenant routing
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
- vm-dispo-blast-flow — dispo blast data flow
- vm-hubspot-dual-pipeline — dual pipeline view
Related cluster
- acquisitions-lifecycle — upstream hand-off (Category F)
- buyer-blast — blast engine mechanics (deep dive)
- compliance-gates — pre-send compliance
- hubspot — dual pipeline 877963314 (acq) + 816046 (dispo)
- salesmsg — blast transport
- openphone-quo — blast transport (alt channel)
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.sqliteanomaly (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.envCRMLS 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