# CMP-100 — The declared opt-in methods must match the flow described

> The opt-in methods ticked on the form must be the ones the message flow describes, in both directions.

- **Rule ID:** CMP-100
- **Layer:** Campaign (`CAMPAIGN`)
- **Checks:** `campaign.opt_in_methods[] + campaign.message_flow`
- **Severity:** BLOCKING — Breaking this rule gets the submission rejected outright.
- **When it bites:** Gates approval — get this wrong and registration is refused
- **How it is detected:** AI judgement over the submitted form
- **Fix type:** Fix the field — a better value in the form clears it
- **Required by:** Twilio, Telnyx
- **Applies:** Applies to every 10DLC registration.
- **Canonical URL:** https://ekas.io/rules/10dlc/campaign/cmp-100/

## Why this rule exists

The structured list is what routes the submission to the right evidence checks, and the narrative is what a human reads; when they disagree the campaign is graded against a rule set that does not fit it. A flow describing a QR poster with only "web form" ticked will be checked for a web opt-in page that does not exist, and the rejection names the missing page rather than the missing tick.

## How to fix it

Tick exactly the methods your flow describes — MOBILE_QR_CODE for a scanned code, PAPER_FORM for a signed sheet, and so on — and delete any tick with no paragraph behind it. Done when each ticked method has a paragraph and each paragraph has a tick.

## Example of a compliant value

```text
The flow describes a poster QR and a checkout box → opt-in methods MOBILE_QR_CODE and WEB_FORM, and nothing else.
```

## Common mistakes

- Fixing the mismatch by deleting the paragraph rather than ticking the box hides a collection surface you are still using, which is the more serious of the two failures.

## Provider rejection codes

| Provider | Code | Resubmission allowed |
| --- | --- | --- |
| Twilio | `30909` | yes |

## Notes

One rule for two catalog rows: CMP-100 requires MOBILE_QR_CODE to be declared for a QR flow and CMP-106 requires PAPER_FORM for a paper one, which is a single enum-versus-narrative consistency check with the value changing. Deliberately not tagged to those two consent methods — the mismatch is worth catching whichever method is involved, and tagging it would exclude precisely the registrations whose ticks are wrong.
