Architecture

Built into every send.

Compliance isn't a checkbox bolted on top. Every send is built around it.

STOP opt-out handling is synchronous in the webhook pipeline — the suppression record is created inline before the status callback completes. Not a background job, not eventual consistency. The moment a contact replies STOP, the platform-wide suppression engages.

DNC checks run inline before every broadcast send. A number hitting DNC is skipped, never queued to the carrier. The platform protects itself before the regulator can.

The master suppression list is a global E.164 cross-account blocklist. If one user's contact says STOP, that number is blocked across every account on the platform — for every account, for every send.

The audit event log is append-only. No update or delete paths exist in the codebase. The audit trail is immutable by design — which is what regulators and lawyers actually want.

Auto-pause triggers when stop rates exceed a configurable threshold. The platform pulls the cord on a bad campaign before carriers do.

Built-in compliance

Four checks that run on every send.

Every list, every send, every dial is screened against the registry, the carrier, and your own suppression list — automatically.

DNC

Multi-source DNC verification

Third-party DNC lookup via Apeiron, plus local caching, plus your master suppression list — all checked before any contact goes out.

STOP

Account-wide opt-out

STOP, UNSUBSCRIBE, CANCEL, END, QUIT, OPT OUT, REMOVE ME — synchronous suppression in the webhook handler. Auto-confirmation reply sent.

Spam

45-rule template scoring

Templates run through a deterministic compliance engine before they can ship. Critical violations (loan, cash advance, guaranteed, click here) block the send entirely.

Errors

Smart auto-suppression

Eleven carrier error codes are handled automatically — bad numbers suppress, spam-flagged DIDs retire, A2P caps alert admins. See the table below.

Import

Bring your own suppression list

Bulk-import existing DNC and opt-out records via API at onboarding. Merges into the master suppression list with source attribution.

Architecture

TCPA-compliant by design.

STOP handling, DNC checks, and opt-out footers are first-class platform behaviors — not bolted on. Every screening event is logged immutably and exportable for legal review.

Exposure

Run your TCPA exposure.

TCPA stacks per-violation: $500 minimum, $1,500 if a court finds the violation was knowing or willful. A 10,000-contact list that's 0.5% non-compliant is 50 violations. Slide to see your exposure.

List size 10,000
Non-compliant rate 0.5%
Willful violation finding Court finds violation was knowing or willful · multiplier becomes $1,500
Estimated exposure
$25,000
Range: $25,000 — $75,000
50 violations · 10,000 contacts × 0.5%
Math under 47 U.S.C. § 227. Class actions multiply this by jurisdiction-class-size effects.
Audit log

Every screening event, timestamped.

Pull a compliance report for any send, in any window, in three clicks. Each row shows what was checked, when, and against which registry — ready for legal, ready for court.

Compliance log · Batch 023-2034 Export CSV
TimestampContactCheckSourceResult
14:00:18.412+1 415 555 0182DNC lookupApeiron (cached)✓ CLEAR
14:02:33.901+1 312 555 0147DNC lookupApeiron (cached)✓ CLEAR
14:05:11.847+1 718 555 0291Master suppressionAccount list✕ SUPPRESSED
14:07:42.034+1 206 555 0119Spam scoringInternal rule engine✓ PASS · 18 / 60
14:09:08.288+1 702 555 0163DNC lookupApeiron (cached)✓ CLEAR
14:13:55.411+1 404 555 0125STOP keywordMasterSuppression✕ OPT-OUT
14:14:02.654+1 213 555 0701Number typeApeiron lookup✓ MOBILE
Every check logged · exportable as CSV or JSON
Deliverability

Eleven carrier error codes, handled automatically.

Every Twilio status callback is inspected. Bad numbers get suppressed, spam-flagged DIDs get retired, A2P daily caps trigger admin alerts — all without a human touching it.

CodeMeaningPlatform response
30003Unreachable destinationSuppress after 3+ fails from 2+ unique senders
30004Carrier spam flagDID flagged for replacement after 3 hits in 24h
30005Unknown handsetAuto-suppress immediately
30006Landline / unreachableAuto-suppress immediately
30007Carrier violationLogged · flagged in template compliance
30008Unknown errorLogged for analysis
21610Twilio opt-out (STOP synced)Synced to UserInboxBlock for all agents
14107A2P daily cap reachedRedis flag · admin notified
30034A2P throughput exceededRedis flag · admin notified
30023A2P send-rate limitRedis flag · admin notified

The table is the shorthand. What follows is what each code actually means in production — drawn from real failure distributions, not vendor docs.

30000Generic Filter

The catch-all carrier block.

Carrier-side content filtering. The "we blocked it but won't tell you why." Often triggered by message velocity or pattern detection.

35.4% of one production org's failures in May 2026 — the single biggest failure category.

30003Unreachable

Phone off, out of area, or disconnected.

The most common "bad number" signal. 28.9% of May failures.

Platform behavior: tracked in PhoneFailureHistory. Suppressed only after 3 fails from 2+ distinct senders. Weekly rollback every Monday 3 AM ET resets suppression and gives numbers a second chance.

30004Carrier Spam Flag

The carrier accused this message, by name.

The carrier's spam filter explicitly flagged this message. Different from 30000 — this is a targeted accusation, not a generic filter. Rare but serious.

Platform behavior: per-DID tracking. When a sending number accumulates enough 30004s in a window, it's flagged for replacement. The DID gets swapped out, not the message.

30005Unknown Number

Number doesn't exist.

Never been assigned by a carrier, or was ported away and the routing table hasn't caught up.

Platform behavior: permanent auto-suppression on first failure. One strike.

30006Landline / Unreachable

Wrong number type for SMS.

Number is a landline, VoIP that doesn't accept SMS, or a number type that can't receive text messages.

Platform behavior: same as 30005 — permanent auto-suppression on first failure.

30007Carrier Violation

The carrier read your message and rejected it.

Carrier-level content policy violation. The carrier inspected the message content and rejected it — not a rate issue, a content issue. Often triggered by financial terms, urgency language, or patterns that look like spam.

20.1% of May failures. The signal that your message template needs work, not your sending infrastructure.

30008Unknown Error

Black-box carrier error.

Twilio received an error from the carrier but couldn't categorize it. A black box. Counted as undeliverable, no auto-suppression (too ambiguous to act on).

21610STOP Reply

You tried to message someone who said STOP.

Recipient previously replied STOP and is on the carrier opt-out list. You're attempting to message someone who explicitly unsubscribed.

Should never happen if suppression is working — indicates a gap between the carrier's opt-out list and the platform's MasterSuppression table.

30023Messaging Service Error

Sender pool, not recipient.

Problem with the carrier-side messaging service configuration, not the recipient. Misconfigured sender pool or compliance settings. Operational alert — check sender configuration.

30024Toll-Free Verification

TFN didn't pass verification.

Toll-free number hasn't completed verification, or verification was rejected. Carriers block TFN traffic until verification completes.

60005Account / Billing

Account-level, not message-level.

Account-level issue — suspended, out of funds, or compliance hold. Nothing wrong with the message or recipient itself.

Top three failure codes (30000 + 30003 + 30007) account for 84.4% of all failures in production data. Content filtering alone (30000 + 30007) accounts for 55.5% — more than unreachable numbers. Bad content causes more failures than bad numbers.

30003 logic 3 / 2 fails / unique senders

Smart 30003 suppression — and a weekly rollback.

A single 30003 doesn't mean the number is dead. Carriers route the same handset differently on different days. So Fivra waits for evidence: 3 unreachable returns from at least 2 unique sender DIDs before account-wide suppression kicks in.

Every Monday, suppressed numbers roll back into the send pool for one supervised retry. If the next attempt also fails 30003, suppression sticks. If it succeeds, the number is cleared — no permanent damage from a transient carrier hiccup.

Floor guardrails

Keep texting tied to real outreach.

High-volume SMS without genuine engagement is exactly what carriers filter for. Call Quota requires selected agents to place real calls before SMS and broadcast tools unlock — keeping message volume anchored to live conversations, not blast-only behavior.

Call Quota Requirement

Selected agents must make calls before they can text or send broadcasts.

Configured per agent on the dialer. Anchors SMS volume to live calls · reduces carrier filtering risk
FAQ

Compliance, answered.

How does Fivra screen against DNC lists? +

Every number is checked against a third-party DNC lookup service (Apeiron). Results are cached locally for performance and refreshed on a rolling basis. Each screening event is logged with its source and timestamp for audit review.

What happens if a number gets added to DNC after a send? +

Your master suppression list catches the change on the next lookup refresh. Future sends to that contact are blocked automatically. Your audit log shows the exact lookup state at the time of every prior send, so you can defend any historical message that was provably clear when it was sent.

Can I export logs for legal review? +

Yes. Every screening event is exportable as CSV or JSON with timestamps, source, and result code. The underlying log is append-only — entries cannot be edited or deleted, which is enforced at the application layer.

How does the spam-scoring engine work? +

An internal rule engine scores templates before they ship. It flags scam phrases, excessive all-caps (>60%), shortened or IP-based URLs, leet-speak obfuscation, and missing opt-out language. Templates over a 60-point threshold get blocked. Separately, if Twilio returns a carrier spam flag (error 30004) on a live send, the affected DID is automatically replaced after 3+ hits in 24 hours.

What happens when a contact replies STOP? +

Synchronous suppression in the webhook handler — STOP, UNSUBSCRIBE, CANCEL, END, QUIT, OPT OUT, REMOVE ME all trigger immediate account-wide blocking. The contact is added to the master suppression list, an auto-confirmation reply goes out, and no future broadcast or dial can reach that number.

DNC lookup · Apeiron API
+1 415 555 0182✓ Clear
+1 718 555 0291DNC ✕
Local cachehit · 38ms
source = apeiron · refresh rolling
Lookup state · captured at send
09:14:02 · sendclear ✓
11:47:31 · refreshDNC added
14:02:18 · next sendblocked ✕
prior send defensible · state frozen
Audit export
screening_log.csv screening_log.json
Retention4 years
Append-onlyenforced ✓
Template score · sample
18 / 60
All-caps > 60%+0
Scam phrases+0
Shortened URLs+18
threshold = 60 · status PASS
Opt-out keywords · synchronous
STOP UNSUBSCRIBE CANCEL END QUIT OPT OUT REMOVE ME
Suppressionimmediate ✓

Compliance you can defend.

Audit trails, registry timestamps, suppression logs — everything stored, exportable, ready for legal.

Get Started Book a demo
  • Real-time DNC + TCPA screening
  • Apeiron-backed DNC source
  • Every send logged + exportable
  • Auto STOP/UNSUBSCRIBE handling
  • CSV/JSON export for legal