Skip to content
A2PExpert

Troubleshooting guide

A2P approved but SMS not delivering? Trace one failed message

Campaign approval does not explain why an individual text failed. Start with one message attempt, its actual sender, current status and exact error. First determine whether the application attempted to send it at all; then investigate the stage where it stopped.

This guide covers US A2P 10DLC delivery investigation in GoHighLevel/LC Phone and direct Twilio setups. The decision tree and comparison tests are a practical method, not a claim that every failure has the same cause.

5 sectionsOfficial references cited

On this page
  1. 1. Freeze a small evidence set
  2. 2. Follow the diagnostic decision tree
  3. 3. Reproduce manual-versus-workflow differences
  4. Hypothetical example: manual works, automation fails
  5. 4. Escalate with a trace, not “SMS is broken”

1. Freeze a small evidence set

Choose a recent failure and, if available, a successful message from the same period. Preserve the evidence before changing sender routing, workflow content or campaign associations.

  • Record
    Setup
    What to capture
    Platform, account/subaccount and LC Phone versus direct Twilio
    Why it matters
    Prevents inspecting a different account
  • Record
    Attempt
    What to capture
    Timestamp with timezone; manual, workflow or API
    Why it matters
    Aligns logs and configuration history
  • Record
    Message
    What to capture
    Message identifier; current status; exact error
    Why it matters
    Provides a traceable provider record
  • Record
    Actual sender
    What to capture
    Number shown on the message, not only the intended default
    Why it matters
    Exposes routing differences
  • Record
    Destination
    What to capture
    Private recipient reference; consent/suppression state at the time
    Why it matters
    Helps distinguish recipient-specific behavior
  • Record
    Content
    What to capture
    Purpose and exact test-message version, retained privately
    Why it matters
    Makes comparisons interpretable
  • Record
    Changes
    What to capture
    Recent sender, workflow or registration changes and timestamps
    Why it matters
    Separates current settings from settings used during the failure

If a field is unavailable, write unknown. Do not infer a Message SID from a workflow execution ID; they identify different records.

In HighLevel, inspect the failed message in Conversations and its error details. For automation, also inspect the workflow execution at the time of the attempt. HighLevel’s common SMS error guide warns against repeatedly resending without identifying the cause.

2. Follow the diagnostic decision tree

Start at D1. Each row tells you where to go next; reaching a branch identifies the next investigation, not a guaranteed diagnosis.

  • Step
    D1
    Question
    Is there a platform send attempt or provider message record?
    Yes
    Go to D2.
    No / unknown
    Branch A: inspect execution and record visibility.
  • Step
    D2
    Question
    Is the exact returned error 30034?
    Yes
    Branch B: verify the actual sender association.
    No / unknown
    Go to D3.
  • Step
    D3
    Question
    Is the exact returned error 30035?
    Yes
    Branch C: inspect number configuration status.
    No / unknown
    Go to D4.
  • Step
    D4
    Question
    Is the exact returned error 30007?
    Yes
    Branch D: investigate filtering.
    No / unknown
    Go to D5.
  • Step
    D5
    Question
    Is another error or restriction reported?
    Yes
    Branch E: use that provider definition and restriction details.
    No / unknown
    Branch F: examine status progression and missing delivery evidence.

Branch A: no visible send attempt

Check whether the test contact entered the intended workflow, reached the SMS action and met its conditions. Record whether it was waiting, skipped, suppressed or failed. Compare the contact and sender selected at that point with what you intended.

If you can see an execution but cannot see a message record, first rule out the wrong account, time filter or missing log access. Absence from the screen you can access is not proof that no provider request exists. Ask platform support to trace the execution if necessary.

Exit: identify an execution-level issue or obtain a message record/error and return to D2. Do not resubmit the A2P campaign solely because a workflow did not reach its send step.

Branch B: 30034, unregistered sender association

Twilio defines 30034 as sending from a number not associated with an approved A2P campaign. In direct Twilio, trace these three links:

  1. 1

    Message → number: which From number actually sent the failed message?

  2. 2

    Number → Messaging Service: is that number in the intended service’s Sender Pool?

  3. 3

    Messaging Service → campaign: is that service associated with the intended approved campaign?

Also inspect number-level registration status. A campaign badge alone does not answer these questions. Twilio’s Sole Proprietor campaign path supports one registered 10DLC sender per campaign; do not assume every added number is covered.

For LC Phone, use the account’s available sender/registration views and HighLevel support rather than assuming you can edit the underlying Twilio account.

Exit: document the confirmed association or the unresolved link. If the records appear correct but the error persists, escalate that trace instead of moving numbers repeatedly.

Branch C: 30035, number still being configured

Twilio’s 30035 documentation distinguishes pending registration or deregistration from a completed registered state. It advises against removing and re-adding the number as a reaction to this error. Its current guidance allows up to 24 hours for processing and directs users to Support if pending persists beyond that period; this is provider guidance, not an activation guarantee.

Record the last assignment change and current number status. Follow the relevant account’s support route if configuration remains unresolved.

Exit: a confirmed registered state and an appropriate limited retest, or a support investigation. Do not “fix” a processing delay with repeated reassignment.

Branch D: 30007, filtering

Twilio describes 30007 as filtering by Twilio or a carrier. Review message purpose, recipient consent, content and the affected pattern. The code does not, by itself, reveal the particular word or rule that caused filtering.

If you believe the traffic meets the applicable policies, Twilio asks for at least three Message SIDs with undelivered status and error 30007 for support review. Use existing failures; do not generate repeated unwanted sends to reach a sample count.

Exit: a supported correction to the messaging practice or a provider review with evidence. Do not rotate numbers or disguise content to bypass filtering.

Branch E: another error or account restriction

Read that exact error’s official definition. Check the affected sender, recipient and account state before retrying. A recipient issue, unsupported media type, suppression or account restriction is not automatically an A2P registration defect.

Exit: follow the documented correction or escalation route for the actual condition. Do not force every failed message into 30007 or 30034.

Branch F: no useful error, or a status that has not resolved

Record when the status last changed and whether the platform exposes later updates. Direct Twilio integrations can use message status callbacks to capture lifecycle changes. A “sent” label is not evidence that a person read the message.

Compare destination patterns and gather the message IDs for provider investigation. One successful handset test does not establish delivery across all destinations.

Exit: a later status/error, a documented recipient-specific issue or a support trace. Keep “cause unknown” if the evidence does not resolve it.

3. Reproduce manual-versus-workflow differences

Use an authorized test contact with valid consent for the test message. Keep the account, intended sender, destination and content constant where the platform allows. Record the actual values afterward; a requested sender and the selected sender may differ.

  1. 1

    Save the current configuration and test-message version.

  2. 2

    Send one appropriate manual test and capture its record.

  3. 3

    Trigger one isolated workflow test for the same purpose. Avoid enrolling the contact into unrelated production sequences.

  4. 4

    Compare actual sender, rendered content, execution time, suppression state, status and error.

  5. 5

    Change only one evidence-supported variable, document it and repeat only the necessary test.

  6. 6

    Stop if the recipient is opted out, a restriction is active or the failure remains unexplained. Do not clear a real opt-out to make a test pass.

  • Run
    A
    Route
    Manual
    Actual sender
    ______
    Message version
    ______
    Execution / message ID
    ______
    Status + error
    ______
    Next check
    ______
  • Run
    B
    Route
    Workflow
    Actual sender
    ______
    Message version
    ______
    Execution / message ID
    ______
    Status + error
    ______
    Next check
    ______
    ______
  • Run
    C
    Route
    After one documented correction
    Actual sender
    ______
    Message version
    ______
    Execution / message ID
    ______
    Status + error
    ______
    Next check
    ______

If the routes produce different content or sender selection, the comparison is not yet controlled. That difference is something to investigate, not proof that the workflow engine or carrier is at fault.

Hypothetical example: manual works, automation fails

Illustration only. This is not a client case, live log or demonstrated resolution.

  • Run
    Manual
    Observation
    Sender A; delivered status
    Supported interpretation
    That attempt progressed successfully according to the recorded status.
  • Run
    Workflow
    Observation
    Sender B; error 30034
    Supported interpretation
    Investigate Sender B’s association before changing message copy.
  • Run
    Configuration review
    Observation
    Workflow sender setting differs from intended Sender A
    Supported interpretation
    A configuration difference exists; confirm the intended sender and its eligibility.

If both attempts instead used Sender A and the workflow showed no send attempt, return to Branch A. If the workflow returned 30007, use Branch D. Similar symptoms can require different investigations.

4. Escalate with a trace, not “SMS is broken”

Send platform support the account/subaccount, timestamps with timezone, actual sender, message IDs, statuses/errors, relevant registration state and the single correction already tested. Include a comparison success if available. Keep recipient details and message content private and use the provider’s support channel.

State the unresolved question precisely: “This message used Sender B and returned 30034. Please confirm the number’s association and registration status in this account.” For a missing send, identify the workflow execution instead of inventing a message ID.

If registration itself is rejected, return to the brand failure guide or campaign diagnosis. If the evidence shows the collection process and SMS enrollment disagree, use the opt-in diagnostic tests.

For a scoped investigation, request GoHighLevel help or describe your direct Twilio issue. Send the error and setup details first. Any account access or implementation work must be agreed separately; approval and delivery are not guaranteed.

Official sources

Provider rules change. Always confirm against the current official documentation.

Get a clear next step for your A2P 10DLC issue

Whether you are troubleshooting one rejected campaign or trying to create a more reliable A2P process across multiple GoHighLevel sub-accounts, start with the evidence and the actual failure point.

Request an A2P Review