Skip to contentSkip to navigationSkip to topbar
Page tools
Useful for sharing or LLM
Accelerate development with AI

On this pageProducts used
Looking for more inspiration?Visit the
Error
Twilio error

30909: Campaign rejected: Message Flow or Call to Action incomplete/unverified

Twilio Messaging DocumentationMessaging

Description

description page anchor

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).

(information)

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:

See Why Was My A2P 10DLC Campaign Registration Rejected?(link takes you to an external page) for the full list of rejection codes.

Possible causes

possible-causes page anchor
  • The message_flow does 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.
  1. Open the rejected campaign and update its message flow:

    • In the Twilio Console at 1console.twilio.com, open A2P 10DLC Campaigns(link takes you to an external page). 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_flow field.

    Provide a complete, end-to-end description of each opt-in path in 40 to 2048 characters.

  2. 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.

  3. For keyword opt-in, include the exact keyword, destination number, and where the instructions appear. Populate opt_in_keywords and opt_in_message, which are required when users can subscribe by texting a keyword.

  4. 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."
  5. 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.

  6. 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 the privacy_policy_url and terms_and_conditions_url fields. 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.

  7. 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.
(information)

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.

Website opt-in

website-opt-in page anchor
1
Customers 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.
2
Message frequency varies. Message and data rates may apply. Reply STOP to unsubscribe. Reply HELP for help.
3
Terms: www.acmecoffee.example/terms. Privacy Policy: www.acmecoffee.example/privacy.
1
Customers 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.
2
The keyword flow sends a confirmation of enrollment in recurring Acme Coffee promotional messages.
3
Message frequency varies. Message and data rates may apply. Reply STOP to unsubscribe. Reply HELP for help.
4
Terms: 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.