30909: Campaign rejected: Message Flow or Call to Action incomplete/unverified
This error occurs when an A2P 10DLC campaign's Message Flow or Call to Action does not provide enough information to verify how users consent to receive messages. The Message Flow is the message_flow field on the UsAppToPerson resource. In the Twilio Console at 1console.twilio.com, it appears as How do end-users opt in to receive messages? under End user consent (message flow).
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:
- 30543 - Live opt-in link not provided
- 30544 - Call-to-Action does not state the message purpose
- 30545 - Call-to-Action does not state message frequency
- 30547 - Call-to-Action is missing opt-out instructions
- 30549 - No Terms of Service link found in the opt-in flow
- 30550 - No Privacy Policy link found in the opt-in flow
- 30551 - Consent does not specify SMS or text messaging
- 30556 - SMS consent is bundled with other communication channels
- 30568 - Call-to-Action is missing the business or brand name
- 30569 - Call-to-Action is missing the message and data rates disclosure
- 30570 - Call-to-Action is missing customer-support instructions
- 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.
- The
message_flowdoes not clearly describe how users opt in, or does not describe every opt-in method the campaign uses. - A keyword flow omits the keyword, destination number, or where users encounter the opt-in instructions.
- A paper, verbal, QR-code, in-store, or non-public opt-in flow lacks publicly accessible supporting evidence.
- A verbal opt-in is described with a one-line summary instead of the full script.
-
Open the rejected campaign and update its message flow:
- In the Twilio Console at
1console.twilio.com, open A2P 10DLC Campaigns. Select the campaign, select Edit & resubmit, and then select Start. Update the Message Flow: How do end-users consent to receive messages? field. - In the Legacy Console, go to Messaging > Regulatory Compliance > Campaigns and select the failed campaign. Select Fix Campaign, then update How do end-users consent to receive messages? (40-2048 characters) in the Edit A2P Campaign Details dialog.
- If you use the API, update the corresponding
message_flowfield.
Provide a complete, end-to-end description of each opt-in path in 40 to 2048 characters.
- In the Twilio Console at
-
Make sure the consent language users see at opt-in names your brand and states what messages they'll receive, and describe it in
message_flow. A missing brand name returns 30568. A missing message purpose returns 30544. -
For keyword opt-in, include the exact keyword, destination number, and where the instructions appear. Populate
opt_in_keywordsandopt_in_message, which are required when users can subscribe by texting a keyword. -
For website opt-in, provide the page URL and ensure that the consent experience:
- Clearly requests permission to send SMS messages.
- If it uses a checkbox or similar consent control, the control is optional and unchecked by default.
- Includes message frequency, a "message and data rates may apply" disclosure, opt-out instructions such as "Reply STOP to unsubscribe," and customer-support instructions such as "Reply HELP for help."
-
For paper, verbal, in-store, or other offline opt-in, describe the complete process and provide a publicly accessible URL with supporting evidence, such as hosted screenshots, a photo of the form, or the verbal script. For verbal opt-in, provide the full script that staff read to users, not a one-line summary.
-
Provide publicly accessible Privacy Policy and Terms and Conditions URLs. In the Legacy Console and the Twilio Console at
1console.twilio.com, include them in the opt-in description. If you use the API, set theprivacy_policy_urlandterms_and_conditions_urlfields. A missing Privacy Policy URL returns 30933, and a missing Terms and Conditions URL returns 30934. The Privacy Policy must state that mobile numbers aren't shared with third parties and include the messaging disclosures. The Terms and Conditions page must be publicly accessible and hosted on the business website. See Acceptable vs. unacceptable privacy policy and T&C URLs. -
Correct every rejection reason, then review and resubmit the campaign:
- In the Twilio Console at
1console.twilio.com, select I confirm the information entered here is ready to submit for review, select Run error check (1-2 min), and follow the prompts to resubmit. - In the Legacy Console, review and select the agreement below the campaign fields, then select Update.
- In the Twilio Console at
Info
These changes make the consent flow easier to verify, but they do not guarantee approval. Review the rejection details for any additional or more specific error codes.
1Customers visit www.acmecoffee.example/sms, enter their phone number, and select an optional checkbox that is unchecked by default to agree to recurring promotional messages from Acme Coffee.2Message frequency varies. Message and data rates may apply. Reply STOP to unsubscribe. Reply HELP for help.3Terms: www.acmecoffee.example/terms. Privacy Policy: www.acmecoffee.example/privacy.
1Customers opt in by either (1) visiting www.acmecoffee.example/sms and selecting the optional, unchecked SMS consent box, or (2) following instructions on Acme Coffee receipts to text JOIN to (555) 123-4567.2The keyword flow sends a confirmation of enrollment in recurring Acme Coffee promotional messages.3Message frequency varies. Message and data rates may apply. Reply STOP to unsubscribe. Reply HELP for help.4Terms: www.acmecoffee.example/terms. Privacy Policy: www.acmecoffee.example/privacy.
Adapt the description to your actual consent process. Do not describe an opt-in path that users do not encounter.
Follow the Console-specific steps in Possible solutions to edit and resubmit the existing campaign. Resubmitting retains the campaign and avoids a second vetting fee, but it starts a new review that can take up to several weeks. You can also fetch the UsAppToPerson resource and check campaign_status.
API-based campaign updates are available only to accounts with access to the relevant Private Beta. Without access, API customers can delete and recreate the campaign, but the replacement campaign incurs a new vetting fee.
For detailed instructions, see Troubleshooting and rectifying A2P Campaigns.