Easy A2P

A2P approved but messages not sending in GoHighLevel

Your GoHighLevel campaign says approved and the texts still fail. The code in Conversations tells you which problem you have. This guide maps the delivery-time errors (30007, 30033, 30034, 30990) to their verbatim GoHighLevel and Twilio labels, separates filtering from suspension, and shows which ones trace back to the registration copy Easy A2P reviews.

By Gary Vogt · · 14 min read

An approved campaign and a failing send are two different problems. Registration rejections arrive as 308xx and 309xx codes before approval. Delivery failures arrive afterward as 30007, 30033, 30034 and their neighbours, from the carrier rather than the registry. Find the code in Conversations first, then fix what it actually points at.

The two code sets, and why mixing them up wastes a week

Everything written about A2P registration stops at the word “approved.” The agency’s next hour is usually spent on something nobody wrote down: the campaign shows approved in the Trust Center, the workflow fires, and the message sits in Conversations marked failed.

There are two completely separate families of error code in play, and they arrive at different moments from different actors.

Registration codes Delivery-time codes
When you see them Before approval, on the Trust Center submission After approval, on an individual send
Where they show up Trust Center rejection notice Conversations, the contact timeline, workflow logs
Examples 30883, 30897, 30910 to 30937, 30940 to 30964 30007, 30023, 30032, 30033, 30034, 30037, 30990, 21610
Who issued it The campaign review chain The carrier, or your phone provider’s filter
What fixes it Usually the copy in a Trust Center field Depends entirely on the code

Our rejection code index maps the left column, code by code, to the Trust Center field each one points at. This page is the right column. If your campaign has not been approved yet, you want the index, not this page.

Step one: get the actual code, not the word “failed”

GoHighLevel’s own troubleshooting article makes this the second step of a nine-step checklist: “Open the failed message in Conversations and note the status (e.g., failed, undelivered) and the exact error code displayed” (GoHighLevel: Troubleshooting SMS Delivery, last modified September 3, 2026). The same code also surfaces in the contact timeline, in workflow execution logs, and in the LC Phone or Twilio provider logs.

Three or four of the codes below look similar and mean wildly different things, so guessing from the symptom costs you more time than opening the message does.

The delivery-time codes, with their live labels

GoHighLevel publishes two code lists that overlap but do not match word for word, and Twilio publishes its own underneath. Where the wording differs, all of them are current, so here is each code with the labels as they read today.

Code GoHighLevel label What it actually means
30007 “Message filtered” A carrier or your provider’s filter blocked this message on content or sender reputation
30023 “Daily Message Cap Reached” You hit the T-Mobile daily cap for the EIN
30032 “Toll-Free Number Has Not Been Verified” Toll-free number, verification not finished
30033 “US A2P 10DLC - Campaign Suspended” The campaign was suspended after approval
30034 “Message from an Unregistered Number” The sending number is not tied to an approved campaign
30035 “US A2P 10DLC: Message from a number still being configured.” The number is mid-configuration
30037 “Outbound Messaging Disabled” Outbound sending is switched off on the number or account
21610 “Attempt to send to unsubscribed recipient” This contact replied STOP, or is on DND

Labels quoted from the LC Phone System error code and warning dictionary (last modified September 8, 2026). GoHighLevel’s shorter common SMS delivery errors list (last modified September 4, 2026) words several of them differently, most notably 30034 as “Number not fully registered for A2P messaging” and 21610 as “Recipient unsubscribed or SMS DND is enforced.” Both articles are live. Search for a code and you will find either string, which is why the code matters more than the sentence next to it.

Two of these are already covered elsewhere on this site and are not repeated here. 30023 is a throughput problem, and the cap, the midnight Pacific reset, and the fact that it is shared across every brand under one EIN are in the Trust Score and throughput guide. 30032 belongs to the other registration track entirely, covered in toll-free verification vs A2P 10DLC.

30034: approved, and the number still is not registered

This is the most common “but it says approved” code, and it is almost never a copy problem.

Twilio’s own dictionary calls it “30034: US A2P 10DLC - Message from an Unregistered Number” and defines it as: “Twilio blocks messages to U.S. numbers when you send from a +1 10DLC number that is not associated with an approved A2P 10DLC Campaign” (Twilio error 30034, last modified April 21, 2026). Approval of the campaign and association of the number are two separate things. The campaign can be approved while a particular number is still attached to nothing.

LeadConnector publishes the fix as a click path: Settings, then Phone System, then Phone Numbers, find the number, open the three-dot menu, click “Select A2P campaign to Link,” choose the approved campaign, and confirm the green “A2P Verified” label appears (LeadConnector: Error 30034, last modified September 10, 2026).

The second cause catches Sole Proprietor clients specifically. Sole Prop registrations are “limited to 1 campaign and 1 phone number per campaign,” so adding a second local number to a Sole Prop client’s sub-account produces 30034 on every send from the extra number. Twilio states the same constraint from its side: “You added multiple +1 10DLC numbers to a Sole Proprietor Campaign. Only one 10DLC number can be registered for that Campaign.” If you are working a Sole Prop registration, the Sole Proprietor guide covers the tier’s other limits.

30007: what filtering is, and what it is not

30007 is the code agencies most often misread as an A2P problem. It is not one.

GoHighLevel describes it as “a carrier-side error that indicates your message was filtered due to content, sender identity, or compliance reasons,” triggered by messages that “Violate a carrier’s messaging policy,” “Appear similar to spam or illegal traffic,” or are “missing required compliance elements, like opt-in consent or sender identification” (GoHighLevel: How to prevent SMS filtering by carriers, error 30007, last modified July 23, 2026).

Twilio’s entry is narrower and worth reading closely, because of what it leaves out. “30007: Message filtered” is defined as “Your message was filtered (blocked) by Twilio or by the carrier. This may be done by Twilio for violating Twilio’s Messaging Policy or Acceptable Use Policy, or by a wireless carrier for violating carrier rules or regulations” (Twilio error 30007). The two causes it lists are spam identification and carrier blocking. Registration mismatch is not among them, and the page does not mention A2P 10DLC at all.

That distinction matters because of a claim circulating in GoHighLevel guides: that content drifting from what you registered causes filtering. It does not, at least not according to either vendor’s documentation. Drift causes suspension, which is the next section. Filtering keys off the individual message: the link in it, the wording, the sending number’s reputation.

Twilio’s remedy for a genuine 30007 is procedural rather than editorial. Review the message against the messaging policy, then collect at least three Message SIDs showing undelivered status with the code and take them to Support. GoHighLevel’s prevention list is the practical version: get explicit opt-in, name the sender in the message, carry opt-out instructions, use a branded domain instead of a public link shortener, keep the caps and emoji down, and process DND requests daily.

One note on retrying. Resending the same message to the same number after a 30007 achieves nothing and adds to the sender’s filtering history. Change something first.

30033 and 30990: suspension, and the one cause that is about your copy

Suspension is the serious one, and it is the only delivery-time code that leads back to what you wrote on the registration.

Twilio’s 30033 is titled “US A2P 10DLC - Campaign Suspended” and reads: “Your message could not be sent because the sending campaign is suspended. A campaign can be suspended on its own or because the associated Brand is suspended” (Twilio error 30033, last modified March 26, 2026). The listed cause is a carrier or ecosystem review that “found a campaign-to-traffic mismatch, spam, controlled substances, phishing, excessive complaints, illicit content, fraudulent messages, affiliate marketing, promotional gambling, missing age gating, illegal sweepstakes, or another policy violation.”

Twilio’s companion code 30990, “Campaign Suspension,” says the same thing in plainer words: “Your campaign was suspended after a carrier or ecosystem review found that your live traffic does not match the registered campaign” (Twilio error 30990, last modified April 21, 2026). Its remediation line is the single most useful sentence in any of these documents for a GoHighLevel agency: “Make sure your live traffic matches the registered use case, campaign description, sample messages, and consent flow for the campaign.”

Campaign-to-traffic mismatch is first on Twilio’s suspension list in both places, and its campaign troubleshooting doc states it as “In-market traffic does not match with the campaign registered” (Twilio: troubleshooting and rectifying A2P campaigns, date modified August 4, 2026).

In GoHighLevel terms, that is the trap our use case guide already describes from the registration side. A client registers as Marketing because that is what they said they do. Six weeks later somebody adds appointment reminders to a workflow. Now transactional traffic is running under a Marketing-only campaign, against a consent flow that never covered it, and the registered sample messages no longer look anything like what is going out. That is campaign-to-traffic mismatch, and the registered copy is the half of it you can change.

Three things about a suspension that are worth knowing before you promise a client a timeline. A suspended campaign “cannot be used to send messages” and “cannot be deleted via self-service,” and monthly registration and phone number fees keep running while it is suspended. A suspended brand takes every campaign attached to it down with it, so fix the brand first. And Twilio’s instruction for a campaign that fails review is consistent: “edit and resubmit it rather than deleting it and creating a new one,” because “The vetting fee is only charged once per Campaign, at its first vetting decision, and resubmitting keeps that fee from being charged twice.”

What suspension is not

Suspension is not a rejection and it is not filtering, and treating it as either sends you down the wrong path.

A rejection happens before approval and names a Trust Center field. Filtering happens per message and leaves the campaign intact. Suspension takes the whole campaign offline after approval, and it arrives by email and in the Twilio Support Center rather than in the Trust Center. Twilio’s advice on all three suspension pages is the same: read the suspension notice, fix the underlying issue, and do not try to move the same traffic onto another campaign while the review is open.

None of this is TCR’s doing. TCR runs brand identity verification, matching legal name, EIN and address against registries. Campaign review, approval and suspension all happen in the carrier and ecosystem review chain downstream of it.

The short triage list

The code you see Where to start
30034 Link the number to the approved campaign in Settings, Phone System, Phone Numbers. Sole Prop clients: one number per campaign
30035 The number is still configuring. Recheck before changing anything
30007 Review the message content, links and opt-out language. Gather three Message SIDs if clean messages keep failing
30033 or 30990 Read the suspension notice. Compare live traffic against the registered use case, description, samples and consent flow
30023 Throughput, not registration. See the Trust Score guide
30032 Toll-free track. Verification is not finished
30037 Outbound messaging is disabled on the number or account
21610 The contact opted out. Nothing to fix, and nothing you should work around

21610 deserves one extra line. A contact who replied STOP is off limits, and the opt-out obligations behind that are getting stricter rather than looser. Our opt-in and consent guide covers what the federal rules currently require on revocation.

Where Easy A2P fits, and where it does not

Easy A2P reviews and drafts US A2P 10DLC registration copy. That is registration copy, before you submit it, across ten Trust Center sections: Brand Registration, Campaign Description, Sample Message 1, Sample Message 2, Opt-In Flow Description, Opt-In Confirmation Message, the marketing and non-marketing consent checkboxes, and the SMS sections of your Privacy Policy and Terms of Service.

It does not watch your deliverability, unblock a filtered message, or lift a suspension. Nobody’s software does the last two. The carriers and their review chain decide what sends.

The honest connection between this page and the product runs one way. When a campaign is suspended for campaign-to-traffic mismatch, Twilio tells you to make the live traffic match “the registered use case, campaign description, sample messages, and consent flow.” Four of those five artifacts are Trust Center fields, and those are the fields we read. Review runs a pattern check across all ten and returns findings plus specific remediation for each one, for 1 credit. Fix My Copy returns paste-ready corrected copy for 1 credit, and Draft writes fresh copy for 2. Signup includes 3 free credits, no card required.

Which is worth saying plainly: the cheapest version of this whole article is registering a campaign that describes what the client is actually going to send. Pick the use case that covers next quarter’s workflows, write samples that look like the real messages, and the mismatch never happens. Ship it Clean!

Frequently Asked Questions

My A2P campaign is approved but messages still fail. What is wrong? +
Open the failed message in Conversations and read the error code. Approval does not guarantee a send. The usual causes are 30034 (the number is not linked to the approved campaign), 30007 (the message was filtered), or 30033 and 30990 (the campaign was suspended after approval).
What does error 30034 mean in GoHighLevel? +
The sending number is not associated with an approved A2P campaign. Twilio's label is "US A2P 10DLC - Message from an Unregistered Number". GoHighLevel's two help articles label it "Message from an Unregistered Number" and "Number not fully registered for A2P messaging". Link the number to the campaign in Settings, Phone System, Phone Numbers, and check for the green "A2P Verified" label.
Does error 30007 mean my A2P registration is wrong? +
No. Twilio defines 30007 as a message filtered by Twilio or a carrier for a policy violation, and its page does not mention A2P 10DLC registration at all. GoHighLevel attributes it to content, sender identity, or "compliance reasons" on the carrier side. It is a per-message block, not a registration problem.
Can an approved A2P campaign be suspended? +
Yes. Twilio lists campaign-to-traffic mismatch first among the reasons a carrier or ecosystem review suspends a campaign, along with spam, excessive complaints, missing age gating and other policy violations. A suspended brand suspends every campaign under it.
What is campaign-to-traffic mismatch? +
Your live sends do not match what you registered. Twilio's remedy is to "Make sure your live traffic matches the registered use case, campaign description, sample messages, and consent flow for the campaign." The common GoHighLevel version is a Marketing-only campaign that later starts carrying transactional messages.
Should I delete a suspended or rejected campaign and start over? +
No. Twilio's guidance is to "edit and resubmit it rather than deleting it and creating a new one", because the vetting fee is charged once per campaign at its first vetting decision. A suspended campaign cannot be deleted through self-service anyway, and the monthly fees keep running.
Is error 30023 an A2P problem? +
No, it is a throughput limit. You hit the T-Mobile daily cap, which applies at the EIN level and resets at midnight Pacific.
Does Easy A2P fix delivery errors? +
No. Easy A2P reviews and drafts A2P 10DLC registration copy before you submit it, across the ten Trust Center sections. It does not monitor deliverability, unblock filtered messages, or lift suspensions. Where it helps after the fact is the one delivery code that traces back to copy: when a campaign is suspended for campaign-to-traffic mismatch, the registered description, samples and consent flow are what we review.

Get notified when we publish new guides

Pillar guides on TCR rejection codes, GHL Trust Center walkthroughs, and industry-specific A2P 10DLC registration — delivered when they go live. No spam, unsubscribe anytime.

The sign-up form is provided by HighLevel (LeadConnector) and loads only if you ask for it. Loading it lets HighLevel (LeadConnector) receive your request and set its own cookies. Cookie policy

Stop guessing whether your A2P submission will pass.

Easy A2P reviews your full submission against current TCR and GHL standards before you submit. Catch the rejection causes others miss — including the Sole Proprietor traps in this guide.

Try Easy A2P with 3 free credits →

No credit card · ~90 seconds to review · pay-as-you-go after

YOUR PRIVACY

Cookie preferences

Choose categories or individual services. You can change your choices at any time using Cookie settings.

Necessary storage remembers your cookie choices. It is always on and does not enable optional tracking.

Measure visits to easya2p.app pages after explicit permission. Page addresses keep campaign tags (utm_*) and drop every other query parameter

Involves sale or sharing of data. Restricted when Global Privacy Control is active.

Storage details
  • _ga (cookie): Google browser and session identifiers. Duration: Up to 400 days (about 13 months). Scope: This host/. Accessible browser storage can be removed on withdrawal.
  • _ga (cookie): Google browser and session identifiers. Duration: Up to 400 days (about 13 months). Scope: easya2p.app/. Accessible browser storage can be removed on withdrawal.
  • _ga_E9MYKG489Y (cookie): Google browser and session identifiers. Duration: Up to 400 days (about 13 months). Scope: This host/. Accessible browser storage can be removed on withdrawal.
  • _ga_E9MYKG489Y (cookie): Google browser and session identifiers. Duration: Up to 400 days (about 13 months). Scope: easya2p.app/. Accessible browser storage can be removed on withdrawal.

Record how pages are used (clicks, scrolling and layout) as session replays and heatmaps, to find what confuses visitors. Clarity masks text typed into forms

Involves sale or sharing of data. Restricted when Global Privacy Control is active.

Storage details
  • _clck (cookie): Clarity visitor identifier. Duration: Up to 1 year. Scope: This host/. Accessible browser storage can be removed on withdrawal.
  • _clck (cookie): Clarity visitor identifier. Duration: Up to 1 year. Scope: easya2p.app/. Accessible browser storage can be removed on withdrawal.
  • _clsk (cookie): Clarity session identifier. Duration: Up to 1 day. Scope: This host/. Accessible browser storage can be removed on withdrawal.
  • _clsk (cookie): Clarity session identifier. Duration: Up to 1 day. Scope: easya2p.app/. Accessible browser storage can be removed on withdrawal.
  • _cltk (sessionStorage): Clarity session tracking. Duration: Until the tab closes. Scope: This host/. Accessible browser storage can be removed on withdrawal.
  • CLID (cookie): Clarity visitor identifier (third-party, set by Microsoft). Duration: Up to 1 year. Scope: www.clarity.ms/. Cannot be removed by this site’s JavaScript.
  • MUID (cookie): Microsoft visitor identifier (third-party, set by Microsoft). Duration: Up to 13 months. Scope: clarity.ms/. Cannot be removed by this site’s JavaScript.
  • MUID (cookie): Microsoft visitor identifier (third-party, set by Microsoft). Duration: Up to 13 months. Scope: bing.com/. Cannot be removed by this site’s JavaScript.
  • SRM_B (cookie): Microsoft identifier synchronisation (third-party, set by Microsoft). Duration: Up to 13 months. Scope: c.bing.com/. Cannot be removed by this site’s JavaScript.
  • MR (cookie): Microsoft identifier refresh (third-party, set by Microsoft). Duration: Up to 7 days. Scope: c.bing.com/. Cannot be removed by this site’s JavaScript.
  • MR (cookie): Microsoft identifier refresh (third-party, set by Microsoft). Duration: Up to 7 days. Scope: c.clarity.ms/. Cannot be removed by this site’s JavaScript.
  • SM (cookie): Microsoft session marker (third-party, set by Microsoft). Duration: Until the browser closes. Scope: c.clarity.ms/. Cannot be removed by this site’s JavaScript.
  • ANONCHK (cookie): Microsoft identifier check (third-party, set by Microsoft). Duration: A few minutes. Scope: c.clarity.ms/. Cannot be removed by this site’s JavaScript.

Let Google Ads credit a sign-up to the ad click that brought you, through Google Analytics 4. Ad click IDs (gclid, gbraid, wbraid) stay in page addresses only while this is allowed. Advertising personalization and remarketing stay off

Involves sale or sharing of data. Restricted when Global Privacy Control is active.

Requires Google Analytics 4. Enable those services first.

Storage details
  • _gcl_au (cookie): Google Ads click and conversion identifiers. Duration: Up to 90 days. Scope: This host/. Accessible browser storage can be removed on withdrawal.
  • _gcl_au (cookie): Google Ads click and conversion identifiers. Duration: Up to 90 days. Scope: easya2p.app/. Accessible browser storage can be removed on withdrawal.
  • _gcl_aw (cookie): Google Ads click and conversion identifiers. Duration: Up to 90 days. Scope: This host/. Accessible browser storage can be removed on withdrawal.
  • _gcl_aw (cookie): Google Ads click and conversion identifiers. Duration: Up to 90 days. Scope: easya2p.app/. Accessible browser storage can be removed on withdrawal.
  • _gcl_gb (cookie): Google Ads click and conversion identifiers. Duration: Up to 90 days. Scope: This host/. Accessible browser storage can be removed on withdrawal.
  • _gcl_gb (cookie): Google Ads click and conversion identifiers. Duration: Up to 90 days. Scope: easya2p.app/. Accessible browser storage can be removed on withdrawal.
  • _gcl_ag (cookie): Google Ads click and conversion identifiers. Duration: Up to 90 days. Scope: This host/. Accessible browser storage can be removed on withdrawal.
  • _gcl_ag (cookie): Google Ads click and conversion identifiers. Duration: Up to 90 days. Scope: easya2p.app/. Accessible browser storage can be removed on withdrawal.

Cookie controls are unavailable. You can still contact us by email. Contact us