# CMP-176 — Declaring opt-in requires opt-in keywords where the provider pairs them

> Where the provider ties the two fields together, declaring subscriberOptin true requires optinKeywords to be populated.

- **Rule ID:** CMP-176
- **Layer:** Campaign (`CAMPAIGN`)
- **Checks:** `campaign.optin_keywords + campaign.subscriber_optin`
- **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:** Deterministic (settled in code from the submitted values)
- **Fix type:** Fix the field — a better value in the form clears it
- **Required by:** Bird
- **Applies:** Applies to every 10DLC registration.
- **Canonical URL:** https://ekas.io/rules/10dlc/campaign/cmp-176/

## Why this rule exists

The provider models opt-in as keyword-driven and validates the pair, so a web-form programme that has no keyword to give is rejected for a field it had no reason to fill in. The fix is not to invent a keyword but to declare the ones the programme already honours — START and its variants are answered by every platform whether or not anyone advertises them.

## How to fix it

Populate the opt-in keyword field with the keywords your platform actually answers — START and UNSTOP at minimum, plus any keyword your signage advertises. Done when the field is non-empty and every keyword in it triggers a subscription on your side.

## Example of a compliant value

```text
subscriberOptin: true · optin_keywords: START, UNSTOP, JOIN
```

## Notes

Bird's campaign form makes optinKeywords conditionally mandatory on subscriberOptin. The condition is applied inside the check rather than as a `providers` tag, because a tag resolves YES on an unknown submission target and would then demand opt-in keywords from every web-form and checkout registration in the registry — TCR requires them only for keyword opt-in (CMP-096).
