Pillar Guide
Sample Messages That Pass A2P 10DLC: Compliant SMS Templates for GoHighLevel Agencies
Curly-brace merge fields left in sample messages are the #1 documented A2P 10DLC rejection cause. This guide gives you paste-ready compliant sample messages for every GHL use case — Marketing, Mixed, Account Notification, Customer Care, Delivery Notification, and 2FA — plus the 5 things every sample must include and the 6 patterns that auto-fail TCR review.
If you run a GoHighLevel agency and have ever submitted an A2P 10DLC campaign, you know how much weight TCR puts on the two sample messages you paste into Trust Center. They’re the smallest fields on the form, but they fail more registrations than any other section — and the failures are usually preventable. This guide walks through every pattern that gets sample messages approved, every pattern that auto-fails, and gives you paste-ready compliant samples for every GHL use case.
The short version
Every compliant A2P 10DLC sample message includes four elements:
- Identification of the sender by actual business name (not “us,” “we,” or “your team”)
- Specific message content showing the kind of message the campaign actually sends
- A name placeholder that’s either a real example “Hi Sarah” or square brackets [Customer Name] — never curly braces
- STOP to unsubscribe language in both samples
If your samples have all four elements and align with your registered use case, they pass. If they’re missing any element, they fail — and “Sample Messages” is the section TCR reviewers reject most often.
Why sample messages drive the #1 rejection cause
Across thousands of GHL agency submissions, the single most documented rejection trigger is curly-brace merge field variables left unfilled in sample messages. Patterns like {{contact.first_name}}, {{location.name}}, and {{user.email}} get pasted directly from GHL workflow templates into the Trust Center sample fields, and TCR reviewers see them as broken code. The system has no way to know whether {{contact.first_name}} is a placeholder or actual content the user intended to submit.
The fix is trivial in concept: replace the curly-brace variables with either real example names or square-bracket placeholders. But because most agency owners build their workflow templates with curly braces and copy-paste them into Trust Center, the mistake happens constantly. We covered this in the 27 TCR rejection causes guide but it’s worth repeating: this is the easiest rejection to avoid and the most common rejection to receive.
The five things every compliant sample message must include
Different from the four elements above (which describe what’s IN the sample), these are the five things the sample as a unit must demonstrate to TCR:
1. Specific business name in the body
The sample must identify the actual business sending the message. “from [Business Name]” or “from [Brand Name]” is acceptable when the brackets get filled with a real name. “from us,” “from our team,” “from your dental office,” and other generic phrasings are not. The reviewer needs to be able to read the sample and identify which registered brand the message originates from.
Use the consumer-facing brand — the name your recipients will actually see on the message. For most businesses without a DBA, that’s the legal entity name (matching the Brand Registration record). For businesses operating under a DBA, that’s the DBA — provided you’ve declared the relationship in the Campaign Description with “We are doing business as [DBA Name].” Per GHL’s Understanding A2P Campaign Rejection Reasons & Required Fixes article, sample messages that use the DBA are compliant when the relationship is declared. Without the declaration, the sample-vs-brand mismatch reads as a use-case inconsistency.
For Sole Proprietor brands, the business name is the proprietor’s legal name (or a state-registered DBA on file) — see our Sole Proprietor guide for the rules. For Standard tier brands, samples can use the legal name or the DBA per the rule above.
2. Specific message content
A sample that says “Reminder from Acme Dental” with no further content tells the reviewer nothing. Samples need to show what the message actually communicates: which appointment, what offer, which order, what update. The more specific the content, the easier the alignment check between sample and use case becomes.
3. A name placeholder in compliant format
Three options, in order of cleanest to most fragile:
- Real example name:
Hi Sarah,orHello Marcus,— what the message will look like once personalized for a real recipient - Square-bracket placeholder:
Hi [First Name],orHello [Customer Name],— explicitly accepted by GHL Trust Center - No personalization:
Hi there,— works but reads less natural and limits how the rest of the sample can reference the recipient
What’s never accepted: curly-brace template variables like {{contact.first_name}}. These look like broken code to TCR reviewers and cause automatic rejection. If your GHL workflow uses curly braces (which is GHL’s native merge-field syntax), strip them before pasting into Trust Center sample fields. The curly braces are for the actual production messages your campaign sends; the samples should show what the personalized output looks like.
4. STOP opt-out language
At minimum, STOP opt-out language must appear in at least one of your two samples. Best practice is to include it in both — that’s what GHL Trust Center’s own template samples do, and it eliminates any reviewer guesswork about which sample is the canonical one.
GHL Trust Center samples use “Reply STOP to unsubscribe” and “Reply STOP to opt-out” interchangeably; both pass review. The one common exception is 2FA samples, which the user receives only when they trigger them via login or transaction — STOP is acceptable but not always present in 2FA templates because the messaging is user-initiated rather than ongoing.
5. Use case alignment
If the campaign is registered as Marketing, both samples must be promotional content. If it’s registered as Customer Care, the message must be related to that use case. Mixed campaigns can have both promotional and transactional samples — but they should be in clearly separate samples, not combined into one. We covered the use case framework in detail in How to Choose the Right A2P 10DLC Use Case.
A quick terminology note that confuses a lot of agency owners: in A2P 10DLC contexts, “transactional” doesn’t refer to a sales transaction the way it does in marketing-speak. It’s a catch-all for all the non-promotional use cases — appointment reminders, account notifications, customer care responses, delivery updates, 2FA codes, security alerts. Anything that isn’t promotional content is treated as “transactional” for use-case-alignment purposes.
The use case alignment check is what catches Marketing campaigns submitted with appointment reminders, or Customer Care campaigns submitted with promotional offers. The reviewer reads samples as the canonical demonstration of what the campaign actually sends.
The six patterns that auto-fail
These are the patterns that consistently cause sample-message rejection in GHL agency submissions:
-
Curly-brace merge fields:
{{contact.first_name}},{{custom_value.appointment_time}},{{user.email}}. The #1 documented cause. -
Deceptive eligibility language: “You’ve been selected,” “Congratulations, you qualify,” “You may have been pre-approved,” “You are one of the few,” “Exclusively selected.” These mimic phishing patterns and violate CTIA guidelines on deceptive language. Auto-fail even when the sample is otherwise compliant.
-
Use case mismatch: Promotional content in a non-marketing campaign, or transactional content in a Marketing campaign. The samples must match the registered use case.
-
Missing STOP language in both samples: At least one sample must include opt-out instructions. Submitting two samples that both lack STOP language causes rejection.
-
Generic brand identification: “from us,” “from our team,” “from [Generic Service].” TCR needs to identify the specific registered brand from the sample text.
-
Insufficient sample count: Every GHL Trust Center campaign requires two distinct sample messages — Mixed, Marketing, and every non-marketing category (Customer Care, Account Notification, Delivery Notification, 2FA). Submitting only one sample causes rejection regardless of use case.
Mixed campaigns: two distinct samples, never combined
If your client’s campaign is registered as Mixed (or Low Volume Mixed), you need two sample messages that show the two sides of the program. The most common mistake is combining both content types into one sample:
❌ “Hi Sarah, your dental cleaning is confirmed for Tuesday at 2pm. Save 20% on whitening through Friday with code BRIGHT20. Reply STOP to opt-out.”
This combined message creates a use case mismatch because TCR reads it as either Marketing (the offer) or Customer Care (the appointment confirmation) — and registers an error if the campaign is Mixed. The compliant approach is two separate samples:
✓ Sample 1 (transactional): “Hi Sarah, your dental cleaning with Acme Dental is confirmed for Tuesday at 2pm. Reply 1 to confirm or call us to reschedule. Reply STOP to opt-out.”
✓ Sample 2 (promotional): “Save 20% on whitening at Acme Dental through Friday with code BRIGHT20. Book online at example.com/whitening. Reply STOP to opt-out.”
This pattern — one transactional, one promotional, both with brand name and STOP language — is exactly what TCR reviewers expect to see for Mixed campaigns. It also documents that your client’s program legitimately sends both content types, which is what justifies the Mixed registration in the first place.
We covered the consent-checkbox side of Mixed campaigns in the opt-in guide — Mixed requires two checkboxes on the opt-in form to match the two-sample structure.
Bracket placeholders vs. curly braces vs. real names
The three personalization formats GHL agencies use, with TCR’s read on each:
| Format | Example | TCR result |
|---|---|---|
| Real example name | Hi Sarah, | ✓ Passes — cleanest |
| Square-bracket placeholder | Hi [First Name], | ✓ Passes — explicitly accepted |
| Curly-brace merge field | Hi {{contact.first_name}}, | ❌ Auto-fails — reads as broken code |
Square brackets are GHL Trust Center’s native placeholder convention, and they’re explicitly endorsed in GHL’s own Understanding A2P Campaign Rejection Reasons & Required Fixes article (under error code 30893):
“Messages should reflect actual content to be sent, indicate templated fields with brackets (e.g., [First Name])…”
Curly braces are GHL’s production merge-field syntax — they get filled in when the campaign actually sends messages — but they’re not what reviewers want to see in the samples.
When you copy a sample message from a GHL workflow template that uses curly braces, do a find-and-replace to swap them for either real names or square-bracket placeholders before pasting into Trust Center.
Templates by use case
Paste-ready compliant samples for every GHL use case. Replace [Business Name] with the registered legal name, [Customer Name] with either a real example name or kept as a placeholder, and adapt the specifics (dates, offers, product names) to match what your client actually sends.
Marketing
Marketing campaigns require two distinct promotional samples. (Note: there’s no separate “Low Volume Marketing” use case in GHL Trust Center — Low Volume is a brand-tier designation, not a use case modifier. To get lower throughput on a Marketing program, register at Low Volume Standard tier and pick Marketing.)
Sample 1 — Offer announcement:
“Hi Sarah, [Business Name] is running a Mother’s Day sale: 20% off all jewelry through Sunday. Shop online at example.com/sale or stop by the store. Reply STOP to unsubscribe.”
Sample 2 — Product announcement:
“Hi [Customer Name], just landed at [Business Name] — our new spring collection. Browse it at example.com/spring. Reply STOP to opt-out.”
Mixed (or Low Volume Mixed) — TWO samples required
Sample 1 — Transactional:
“Hi [Customer Name], your appointment at [Business Name] is confirmed for [Date] at [Time]. Reply 1 to confirm or call us to reschedule. Reply STOP to unsubscribe.”
Sample 2 — Promotional:
“Hi [Customer Name], [Business Name] is offering 15% off your next visit through Friday with code SAVE15. Book at example.com/book. Reply STOP to opt-out.”
Account Notification
Sample 1 — Status update:
“Hi [Customer Name], your [Business Name] account balance is $124.50 and your next payment of $42.00 is due [Date]. View details at example.com/account. Reply STOP to unsubscribe.”
Sample 2 — Scheduled reminder:
“Hi Sarah, your [Business Name] subscription renews [Date] for $19.99. To make changes, log in at example.com/account before that date. Reply STOP to opt-out.”
Customer Care
Sample 1 — Inquiry response:
“Hi [Customer Name], this is [Agent Name] from [Business Name] customer support. I have an update on your case #12345. Please call us at 555-555-5555 or reply with questions. Reply STOP to unsubscribe.”
Sample 2 — Follow-up:
“Hi Marcus, following up on your support ticket from yesterday. Did our last response resolve the issue? Reply YES or reply with details. [Business Name] support. Reply STOP to opt-out.”
Delivery Notification
Sample 1 — Shipment update:
“Hi [Customer Name], your [Business Name] order #12345 has shipped and will arrive [Date]. Track at example.com/track/12345. Reply STOP to unsubscribe.”
Sample 2 — Delivery confirmation:
“Hi Sarah, your [Business Name] order has been delivered. If you have any issues, contact us at example.com/support. Reply STOP to opt-out.”
2FA / One-Time Passcode
Sample 1 — Login code:
“Your [Business Name] verification code is 123456. This code expires in 10 minutes. If you didn’t request this code, ignore this message or contact support.”
Sample 2 — Transaction verification:
“Hi [Customer Name], your [Business Name] transaction code is 654321. Enter this code to complete your purchase. Code expires in 5 minutes.”
(Note: 2FA samples don’t typically need STOP language because the user receives messages only when they trigger them through their own login or transaction. Including STOP is still acceptable and harmless if you prefer consistency across all your samples.)
Industry-specific examples
The patterns above adapt to any industry. A few common GHL agency verticals with example samples:
Real estate (Mixed)
Sample 1 — Showing reminder:
“Hi Sarah, your showing of 123 Maple St with [Agent Name] at [Brokerage Name] is confirmed for [Date] at [Time]. Reply CANCEL to reschedule. Reply STOP to opt-out.”
Sample 2 — New listing alert:
“Hi [Customer Name], new listing in your search area: 456 Oak Ave, $425K, 3BR/2BA. View at example.com/456oak. [Brokerage Name]. Reply STOP to unsubscribe.”
Dental practice (Mixed)
Sample 1 — Appointment reminder:
“Hi [Customer Name], your cleaning at [Practice Name] is [Date] at [Time]. Reply 1 to confirm or call 555-555-5555 to reschedule. Reply STOP to unsubscribe.”
Sample 2 — Promotional offer:
“Hi Sarah, [Practice Name] is offering free whitening with any cleaning booked through Friday. Book at example.com/dental. Reply STOP to opt-out.”
Fitness studio (Marketing)
Sample 1 — Class promotion:
“Hi [Customer Name], [Studio Name] added new spin classes Tuesdays at 6pm. First class free with code SPIN. Sign up at example.com/spin. Reply STOP to unsubscribe.”
Sample 2 — Member offer:
“Hi Marcus, members save 20% on personal training sessions through Sunday at [Studio Name]. Book at example.com/pt. Reply STOP to opt-out.”
Salon / spa (Mixed)
Sample 1 — Appointment confirmation:
“Hi [Customer Name], your appointment at [Salon Name] is [Date] at [Time] with [Stylist Name]. Reply C to confirm. Reply STOP to opt-out.”
Sample 2 — Seasonal offer:
“Hi Sarah, [Salon Name] is offering 25% off color services through Friday. Book online at example.com/color. Reply STOP to unsubscribe.”
Professional services / consulting (Customer Care)
Sample 1 — Document request:
“Hi [Customer Name], [Firm Name] received your file. We’ll have an update by [Date]. Reply with any questions or call 555-555-5555. Reply STOP to opt-out.”
Sample 2 — Status update:
“Hi Marcus, [Firm Name] filed your paperwork today. Tracking ID: 12345. Full update by [Date]. Reply STOP to unsubscribe.”
STOP language: “unsubscribe” vs. “opt-out” vs. “cancel”
The honest answer here is more nuanced than “any word works.” GHL Trust Center’s published sample templates uniformly use “unsubscribe” in samples — that’s the safest exact match. “Opt-out” is what GHL uses in checkbox copy, and it’s widely accepted by carriers and aggregators in samples too. “Cancel” appears in some industry templates outside GHL but isn’t documented as part of GHL’s sample standard — I haven’t independently verified that “cancel” passes GHL Trust Center review consistently.
Recommended order from safest to least documented:
- “Reply STOP to unsubscribe.” ← GHL’s documented sample standard
- “Reply STOP to opt-out.” ← Accepted by carriers/aggregators broadly; matches GHL’s checkbox copy
- “Text STOP to unsubscribe.” ← Variant of the standard; passes
- “Reply STOP to cancel.” ← Used in some non-GHL industry templates; uncertain status in GHL Trust Center specifically — use at your own risk
- “Reply STOP.” ← Works but minimum information; leaves the recipient to infer what STOP does
If you want a single rule of thumb: use “Reply STOP to unsubscribe” in samples. It’s GHL’s documented standard, it’s the exact phrasing their templates use, and it removes any reviewer guesswork.
What we’ve seen fail or warn:
- “Reply STOP to stop receiving promotional messages.” (scoped opt-out — once the FCC’s “revoke-all” rule takes effect — currently scheduled for January 31, 2027 after multiple postponements — this becomes non-compliant; and even today reviewers prefer unconditional STOP)
- “Reply NO to opt-out.” (STOP is the required keyword, not NO)
- “To unsubscribe, reply with the word UNSUBSCRIBE.” (substituting UNSUBSCRIBE for STOP doesn’t satisfy carrier requirements)
For consent-checkbox text — different surface from samples — the canonical phrasing is “Text HELP for help, reply STOP to opt-out.” See the opt-in guide for the consent disclosure rules. Sample messages have looser conventions; checkbox text is stricter.
Common rejection scenarios and the fixes
The five most common sample-message rejections in GHL agency campaigns:
“Sample contains unfilled merge fields”
Trigger: {{contact.first_name}} or similar curly-brace patterns left in the sample.
Fix: Replace with [First Name] or a real example like Sarah. Search your sample for {{ — if any matches appear, rewrite. This single fix resolves the #1 rejection cause.
”Sample uses deceptive eligibility language”
Trigger: Phrases like “You’ve been selected,” “You qualify,” “Pre-approved,” “Exclusively chosen.”
Fix: Rewrite the sample without the eligibility framing. “Save 20% with code SAVE20” works; “You’ve been selected for 20% off” does not.
”Sample doesn’t match the registered use case”
Trigger: Promotional content in a non-marketing campaign, or appointment-reminder content in a Marketing campaign.
Fix: Either change the campaign use case to match the actual content (most common: switch from Marketing-only to Mixed) or rewrite the sample to match the registered use case.
”Insufficient sample count”
Trigger: Mixed or Marketing campaign with only one sample submitted.
Fix: Submit two distinct samples. For Mixed, one transactional and one promotional. For Marketing, two different promotional patterns (e.g., offer announcement + product launch).
”Sample missing brand identification”
Trigger: “Reminder from us,” “Update from your provider,” “Hi from our team.”
Fix: Include the actual business name in the sample. “Reminder from Acme Dental.” “Update from Sarah Mitchell Real Estate.”
How Easy A2P helps with sample messages
Easy A2P’s copy review system catches every pattern in this guide before submission. Paste your two samples in and we flag:
- Curly-brace merge fields
- Missing STOP language in both samples
- Deceptive eligibility patterns
- Generic brand identification
- Use case mismatch with the registered campaign type
- Insufficient sample count for Mixed/Marketing campaigns
If you’re starting from scratch instead of reviewing existing samples, the Draft Fresh Copy Wizard generates compliant two-sample sets aligned to your registered use case in under 60 seconds — using the patterns this guide documents.
Run your samples through the copy review system →
A note on character counts
Sample messages don’t have a hard character limit at the GHL Trust Center registration step, but practical SMS economics matter:
- Under 160 characters: one segment, single billable unit
- 161-306 characters: two segments, twice the cost per send
- 307-459 characters: three segments
Most compliant samples land between 90 and 140 characters including STOP language. That fits one segment cleanly and reads natural. Pushing samples to 200+ characters is technically allowed but doubles your per-message throughput consumption when the actual messages your campaign sends look similar to the samples.
The Opt-In Confirmation Message — the field where users get a welcome SMS after signing up — has its own 320-character cap and its own required elements. We covered that in the opt-in guide. Sample messages don’t share that constraint, but tighter is better.
Final checklist before you paste samples into Trust Center
A 30-second sanity check before you submit:
- Do both samples include the actual business name (not “us” or “our team”)?
- At least one sample has STOP language (both is safer)?
- No curly-brace
{{merge_fields}}anywhere in either sample? - Personalization uses real names or
[Square Brackets], not{{curly}}ones? - Both samples align with the registered use case (no promotional content in non-marketing campaigns)?
- For Mixed/Marketing: two distinct samples, not one?
- No “you’ve been selected” or similar eligibility framing?
- Each sample under ~140 characters for clean single-segment delivery?
If all eight check out, your sample messages section will pass TCR review. If any are off, fix before submitting — sample-message rejections are the most expensive in delay terms even though resubmissions are free, because each rejection cycle costs 1-3 days (Sole Prop) or 3-15 days (Standard) before your client can send messages.
Need help reviewing or drafting your A2P 10DLC sample messages before you submit a GHL campaign? Run them through Easy A2P’s copy review system — it audits both samples against all six rejection patterns in this guide and generates compliant replacements when needed.
Frequently Asked Questions
What's the #1 reason A2P 10DLC sample messages get rejected? +
How many sample messages do I need for a Mixed A2P 10DLC campaign? +
Do sample messages need to include STOP language? +
Can I use real customer names in A2P 10DLC sample messages? +
What sample message patterns auto-fail TCR review? +
Should sample messages match the campaign use case I selected in GHL? +
Do I need 'Reply HELP for help' in my sample messages? +
What's the maximum length for an A2P 10DLC sample message? +
Get notified when we publish new guides
Pillar guides on TCR rejection codes, GHL Trust Center walkthroughs, and industry-specific A2P 10DLC compliance — delivered when they go live. No spam, unsubscribe anytime.
Stop guessing whether your A2P submission will pass.
Easy A2P validates 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 validate · pay-as-you-go after