30909: Campaign rejected: Message Flow or Call to Action incomplete/unverified
This error appears when your A2P 10DLC campaign is rejected because the Message Flow or Call to Action does not give reviewers enough information to verify how end users consent to receive messages. Include a complete description of every opt-in path you use and the required disclosures so the campaign can be reviewed successfully.
Info
Your campaign rejection may also return a more specific error code. If you received one of these alongside or instead of 30909, follow the linked page for targeted guidance:
- 30896 - Opt-in Error
- 30907 - Website URL Validation Issue
- 30908 - Compliant Privacy Policy Required
- 30917 - All opt-in methods must include complete workflow descriptions
- 30919 - Website lacks sufficient business or messaging use case info
- 30921 - Website requires authentication and cannot be reviewed
- 30924 - Missing or non-compliant consent agreement language in opt-in flow
- 30925 - Opt-in must be unchecked by default; active consent required
- 30933 - Privacy Policy URL is required
- 30934 - Terms and Conditions URL is required
See Why Was My A2P 10DLC Campaign Registration Rejected? for the full list of rejection codes.
- Your Message Flow does not clearly explain how end users opt in, especially when consent is collected outside a public website through verbal, paper, in-store, QR, or other offline flows.
- Your submission does not list every opt-in method used for the same campaign in the
message_flowfield. - Your website opt-in flow is missing required information such as links to terms and conditions, a privacy policy, message frequency, or the "message and data rates may apply" disclosure.
- Your opt-in evidence cannot be verified because the website is private, behind a login, incomplete, or missing publicly accessible screenshots of the consent flow.
- Your keyword opt-in flow is incomplete because required keyword details or related
opt_in_message,opt_out_message, orhelp_messageinformation is missing when you manage those flows yourself.
- Rewrite the
message_flowfield so it explains exactly how consent is collected from start to finish. If you use more than one opt-in method, list all of them in the same submission. - If you collect consent on a website, include the website URL, a link to your privacy policy, and a link to your terms and conditions. Make sure the privacy policy states that mobile numbers are not shared, and includes message frequency and "message and data rates may apply."
- If your opt-in flow is not publicly visible at the website you provide, add a public URL with hosted screenshots or other proof that shows the full consent experience.
- If users can opt in by texting a keyword, provide the keyword list and the required opt-in confirmation details. If you manage help and opt-out yourself instead of using default or Advanced Opt-Out behavior, provide the corresponding
help_message,opt_out_message,help_keywords, andopt_out_keywordsvalues as required. - After you correct the CTA details, update the rejected campaign and retry review in Console or resubmit the campaign through the API with the required campaign fields.
Campaign reviewers at The Campaign Registry (TCR) verify each of the following before approving a campaign:
- Collection mechanism — the
message_flowdescribes every way end users give consent, such as a website form, SMS keyword, paper form, or QR code. - Required disclosures — the opt-in flow includes a privacy policy link, terms and conditions link, message frequency, and a "message and data rates may apply" statement.
- Public verifiability — reviewers can access and confirm the opt-in experience. If the flow is behind a login or offline, hosted screenshots or other publicly accessible evidence must be provided.
- All paths listed — if the campaign uses more than one opt-in method, every method is described in the same
message_flowfield.
Run through this list before submitting or resubmitting your campaign:
message_flownames the URL, keyword, paper form, or other mechanism where consent is collected.message_flowincludes a link to your privacy policy and a link to your terms and conditions.- Your privacy policy states that mobile numbers aren't shared with third parties, includes message frequency, and includes a "message and data rates may apply" disclosure.
- If opt-in happens on a website, the URL is publicly accessible. If it isn't public, you have provided a URL with hosted screenshots of the full consent flow.
- If end users opt in by texting a keyword,
opt_in_message,opt_in_keywords,help_message,help_keywords,opt_out_message, andopt_out_keywordsare populated (when you manage these yourself rather than using Twilio defaults). - If the campaign uses multiple opt-in paths, all paths are described in the same
message_flowfield. - Sample messages match the declared use case, identify the Brand by name, and include opt-out language.
| API field | What TCR checks | Details |
|---|---|---|
message_flow | End-to-end description of every opt-in path; links to privacy policy and terms | 40 to 2049 characters. Field reference |
opt_in_message | Auto-reply confirming enrollment, including Brand name and opt-out instructions | 20 to 320 characters. Required when keyword opt-in is offered. Field reference |
help_message | Auto-reply with support options when users send a help keyword | 20 to 320 characters. Required when managing help replies independently. Field reference |
opt_out_message | Acknowledgment of opt-out and confirmation no further messages will be sent | 20 to 320 characters. Required when managing opt-out independently. Field reference |
Warning
Unacceptable message_flow
End users opt in on our website.
This doesn't name the URL, link to a privacy policy or terms page, or describe the consent mechanism.
Info
Acceptable message_flow
End users opt in by visiting www.acmesandwich.com/sms-signup and entering their phone number. They check a box agreeing to receive recurring promotional text messages from Acme Sandwich Company. Message frequency varies. Message and data rates may apply. Terms and Conditions: www.acmesandwich.com/terms. Privacy Policy: www.acmesandwich.com/privacy (states mobile numbers are not shared with third parties).
Passes because it names the URL, describes the consent action, discloses frequency and rates, and links to both required legal pages.
Warning
Unacceptable message_flow
Customers text us to sign up.
This doesn't specify the keyword, the phone number, or the required auto-reply content.
Info
Acceptable message_flow
End users opt in by texting JOIN to (555) 123-4567. They receive an auto-reply: "Acme Sandwich Co: You are now subscribed to weekly deals. Msg frequency varies. Msg & data rates may apply. Reply HELP for help, STOP to cancel." Terms: www.acmesandwich.com/terms. Privacy: www.acmesandwich.com/privacy.
Passes because it identifies the keyword and number, shows the confirmation message content, and links to legal pages. The corresponding opt_in_message, help_message, and opt_out_message fields must also be populated.
Warning
Unacceptable message_flow
We collect consent in our stores.
This doesn't describe the paper form or explain how reviewers can verify the flow.
Info
Acceptable message_flow
End users opt in by filling out a paper form at Acme Sandwich Company retail locations. The form collects the customer's mobile number and includes checkboxes for consent to receive recurring promotional messages from Acme Sandwich Company. The form text states message frequency varies and message and data rates may apply, and provides links to www.acmesandwich.com/terms and www.acmesandwich.com/privacy. A photo of the form is hosted at www.acmesandwich.com/opt-in-evidence.
Passes because it describes the physical form, lists the required disclosures, and provides a publicly accessible URL where reviewers can verify the consent experience.
Warning
Unacceptable message_flow
Users scan a QR code to opt in.
This doesn't explain where the QR code leads or what disclosures the user sees.
Info
Acceptable message_flow
End users scan a QR code displayed at Acme Sandwich Company locations, which opens www.acmesandwich.com/sms-signup in their mobile browser. On that page they enter their phone number and check a box agreeing to receive promotional messages. Message frequency varies. Message and data rates may apply. Terms: www.acmesandwich.com/terms. Privacy: www.acmesandwich.com/privacy.
Passes because the QR code destination is a publicly accessible web page with the same disclosures required for any website opt-in.
If your campaign uses more than one opt-in method, describe every path in the same message_flow field. Reviewers reject campaigns when the submission accounts for only one of several active opt-in paths.
Info
Example combining website and keyword opt-in
End users opt in by (1) visiting www.acmesandwich.com/sms-signup and entering their phone number, checking a box agreeing to receive recurring promotional text messages, or (2) texting JOIN to (555) 123-4567 and receiving a confirmation auto-reply. Message frequency varies. Msg & data rates may apply. Terms: www.acmesandwich.com/terms. Privacy: www.acmesandwich.com/privacy.
Edit the rejected campaign rather than deleting and recreating it. A vetting fee is assessed only once per campaign, so resubmitting the same campaign avoids a new fee.
- Console: go to Messaging > Regulatory Compliance > Campaigns, click the failed campaign, then click Edit Campaign to correct the fields and resubmit.
- API: update the campaign resource with corrected field values. See Troubleshooting and rectifying A2P Campaigns for detailed instructions.