SMS Engine

Bulk texting, gated end to end · no send without approval + transport
Checking transport… Caps: 1/number/day · 3/number/30d · 500/campaign · 1000 segments/day Consent ledger: — Send window 8:00 AM–9:00 PM recipient local time

Composer

Templates use merge variables only — first name, county, sale date, callback number, company. No fee percentages and no dollar claims are allowed in copy: the surplus 30% is surplus-only with a per-deal override, and wholesale spread is per-deal. Every message must carry a Reply STOP footer.

—
Preview · synthetic contact, never a real lead—

Consent ledger

Record consent before anyone is queued. A number with no opted-in ledger row never sends — the send path fails closed. STOP replies from the inbound webhook land here automatically. Source and date are required: a guess is not consent.

PhoneStateSourceRecorded
Sign in, then the ledger loads here.

Campaigns

A campaign sends only after an explicit approval record (approver + note + timestamp) and only while the transport gate is ready. Dry-run first: it evaluates scrub, consent, quiet hours, and caps for every recipient and sends nothing.

NameStatusAudienceSent / BlockedApproved byActions
No campaigns yet. Create one from the composer.

Audience builder

Stage recipients for the selected campaign. Each recipient needs the stored skip-trace flags observed for that number (DNC / litigator / trace checked) — the engine re-checks the stored flags and the consent ledger at send time, and a number with no matching stored trace entry is blocked. Nothing here imports a lead list: every recipient is entered deliberately.

PhoneName / CountyTrace flagsAction
No staged recipients. Stage at least one, then queue.

Before any bulk send

10DLC registration is Emanuel's entity action: brand registration needs the legal name, EIN, registered address, website, and documented opt-in flow, plus a registered campaign with sample messages. This code registers nothing and files nothing.
Consent posture: texting skip-traced numbers needs counsel's word on TCPA prior express written consent before any bulk send — the vendor pick does not solve consent. Until counsel clears it, this engine stays in draft/dry-run.
Mechanics enforced here: opt-in ledger with source + timestamp · STOP/HELP handling with suppression · quiet hours 8 AM–9 PM recipient local · DNC/litigator scrub from stored flags, fail closed · per-number and per-campaign caps, metered from day one · delivery-status tracking with aggregate counts only.
Activation needs from Emanuel: Twilio Account SID + Auth Token + sending number in Vercel env, TWILIO_SMS_ENABLED=1, the Wave 4 SMS migrations applied, 10DLC brand/campaign registered, counsel's consent posture. Until then every send attempt refuses with an explicit not-configured state.