Campaign Control — how this works
In the app: /campaigns
How it works
Each campaign can define one or more multi-step sequences (email/SMS/LinkedIn/call touches) and enroll Leads into them. Building a sequence and enrolling a Lead are this app's own writes; the cadence walker then advances each enrollment through its steps over time, guard()-gating and firing every send via n8n (Instantly for email, Telnyx for SMS) — mocked (logged, not sent) until CALLHQ_MOCK_N8N is off. Sent/bounce/reply stats sync from real send data as each vendor leg comes online (SMS reads directly from our own outbox today; email/LinkedIn sync lands with the real Instantly/HeyReach connection). "Automate this" on a sequence saves a lead.enriched → enroll rule (the same automation engine /flows uses) scoped to leads matching this campaign's brand + track — once on, a newly-enriched matching Lead enrolls with zero manual pushes.
Data source
src/lib/campaigns/sequencesRepo.ts (Sequence/SequenceStep/SequenceEnrollment) + src/lib/cadence/walkerRepo.ts (the dispatch walker) + src/lib/campaigns/campaignSmsStats.ts (live SMS stats) + src/lib/flow/flowRuleRepo.ts (auto-enroll rules).
Troubleshooting
An enrollment never seems to progress past step 0? Check /tools for n8n's live/mocked status — under CALLHQ_MOCK_N8N, sends are logged, not delivered, so nothing a vendor reports back will ever confirm a step. A stat column showing — (not 0) means it genuinely hasn't synced yet, not that it's zero.
Vendors: n8n — check Tools for live/mocked status.
Who can see this: admin