Table of Contents
For SMS, set utm_medium=sms in lowercase on every text link, use your SMS platform name as utm_source, and build utm_campaign from one fixed pattern. GA4 only puts traffic in its SMS channel when the source or medium is exactly sms, so the medium value is the one you cannot get creative with. Everything else is about keeping reports readable. Below are copy-ready templates for campaigns, automated flows and holiday sends, plus a short governance note.
This post is part of our complete guide to SMS UTM tracking in GA4. If your text traffic is already landing in the wrong channel, start with why SMS traffic shows as Direct or Unassigned.
Why SMS naming matters
GA4 sorts sessions into channels with fixed rules. Its default channel group assigns a session to SMS when the source exactly matches sms or the medium exactly matches sms. Exact match means close is not good enough. These values all miss the SMS channel:
textortxtsms-campaignorsms_blastmmsorrcscampaignorflow(older platform defaults)
When no channel rule matches, GA4 reports the session as Unassigned. When a text link has no UTMs at all, the click usually opens in the phone browser with no referrer, so GA4 reports it as Direct. Either way, your SMS revenue disappears into a bucket nobody owns.
GA4 channel rules are case-insensitive in practice, but reports still show SMS and sms as separate rows in source/medium tables. Use lowercase sms exactly and you avoid both problems.
The core rules
- Medium is always
sms. Not the message type, not the flow name. Put those in campaign or content. - Source is the sending platform. For example
klaviyo,attentiveorpostscript. This tells you which tool sent the message when you run more than one. - Lowercase everything. Use hyphens inside a value and avoid spaces.
- One pattern per field. Write it down and do not change it mid-quarter.
- No personal data. Never put phone numbers, names, emails or customer IDs in a UTM. Google's policies prohibit sending personally identifiable information to Analytics.
- Campaign values say what and when. A date prefix plus a short theme sorts well and stays unique.
Some teams prefer utm_source=sms and put the platform name elsewhere. That also lands in the SMS channel. We recommend platform-as-source because it lines up with how most SMS platforms tag links by default and keeps the source column useful. Pick one and use it everywhere. For general naming rules, see our UTM naming conventions guide.
Field-by-field template
| Parameter | Pattern | Example | Notes |
|---|---|---|---|
utm_source | sending platform | klaviyo | Lowercase. One value per tool. |
utm_medium | always sms | sms | Required for the GA4 SMS channel. |
utm_campaign | yyyy-mm_theme for campaigns, flow_name for automations | 2026-11_bfcm-early-access | Unique per send. No spaces. |
utm_content | link position or message variant | link-1 | Optional. Useful when one text has two links or an A/B test. |
utm_term | audience or segment label | vip | Optional. Use a segment name, never a person. |
utm_id | campaign ID if you use one | sms-2611-04 | Optional. Only if you match to cost or CRM data. |
The underscore in the campaign pattern splits the date from the theme. Hyphens join words inside the theme. That makes values easy to filter: 2026-11_ shows every November send, and flow_ shows every automation.
Campaign templates
Campaigns are one-time sends to a list or segment. Each one gets its own campaign value.
| Send type | utm_source | utm_medium | utm_campaign | utm_content |
|---|---|---|---|---|
| Sitewide sale | klaviyo | sms | 2026-10_fall-sale | link-1 |
| Product launch | klaviyo | sms | 2026-10_launch-trail-jacket | link-1 |
| VIP early access | klaviyo | sms | 2026-11_vip-early-access | link-1 |
| Restock announcement (one-time) | klaviyo | sms | 2026-10_restock-best-sellers | link-1 |
| Last-chance reminder | klaviyo | sms | 2026-10_fall-sale-last-chance | link-1 |
| A/B test, variant B | klaviyo | sms | 2026-10_fall-sale | variant-b |
Notice the last-chance reminder gets its own campaign value. If you reuse the original value, you cannot tell how much the reminder added. The A/B test keeps one campaign value and splits variants with utm_content, so the campaign total still adds up.
Replace klaviyo with your own platform. If you send through Attentive or Postscript, those tools set their own source defaults, so check your account and match the template to what they actually output.
Automated flow templates
Flows (Klaviyo) or journeys (Attentive) run all year. Do not date them. Give each flow a stable name and use utm_content for the step.
| Flow | utm_source | utm_medium | utm_campaign | utm_content |
|---|---|---|---|---|
| Welcome series | klaviyo | sms | flow_welcome | step-1, step-2, step-3 |
| Abandoned cart | klaviyo | sms | flow_abandoned-cart | step-1, step-2 |
| Abandoned checkout | klaviyo | sms | flow_abandoned-checkout | step-1, step-2 |
| Browse abandonment | klaviyo | sms | flow_browse-abandon | step-1 |
| Back in stock | klaviyo | sms | flow_back-in-stock | step-1 |
| Post-purchase cross-sell | klaviyo | sms | flow_post-purchase | step-1, review-request |
| Winback | klaviyo | sms | flow_winback | step-1, step-2 |
If you rebuild a flow with a new offer and want to compare old and new, add a version suffix: flow_welcome-v2. Change the value on the day the new version goes live and note the date in your naming sheet.
Most SMS platforms can fill the campaign value automatically from the flow or message name. That is convenient, but it means anyone who renames a flow also renames its GA4 campaign. Klaviyo also offers dynamic values such as list or segment name and ID. See Klaviyo's UTM tracking docs and our Klaviyo SMS UTM setup guide for the options.
Holiday send templates
Holiday weeks are when naming falls apart. Several people send fast, and a few typos split one campaign into three rows. Agree on these values before November.
| Send | utm_campaign | utm_content | Tip |
|---|---|---|---|
| Black Friday early access | 2026-11_bfcm-early-access | link-1 | A shared bfcm theme word lets you total the whole event. |
| Black Friday day-of | 2026-11_bfcm-black-friday | link-1 | Separate from early access so you can compare. |
| Cyber Monday | 2026-11_bfcm-cyber-monday | link-1 | Use the month the send goes out. |
| BFCM last call | 2026-12_bfcm-last-call | link-1 | Date follows the send, even if the sale started in November. |
| Shipping cutoff reminder | 2026-12_holiday-shipping-cutoff | link-1 | Short, urgent sends benefit from their own value. |
| Gift card push | 2026-12_holiday-gift-cards | link-1 | Point to a gift card page, not the homepage. |
| New Year sale | 2027-01_new-year-sale | link-1 | New year prefix keeps sorting correct. |
| Valentine's Day | 2027-02_valentines-day | link-1 | Plain ASCII only. No apostrophes in values. |
Source and medium stay the same in every row: your platform and sms. A shared theme word such as bfcm lets you filter the whole event in GA4 with a "contains" match while still seeing each send. For more holiday pitfalls, read 10 SMS tracking mistakes that break your holiday campaign data.
Using utm_content and utm_term
Most texts have one link, so utm_content is often just link-1. It earns its place when:
- A message has two links, such as a product and a size guide. Use
link-1andlink-2, orproductandsize-guide. - You run an A/B test. Use
variant-aandvariant-b. - A flow has several steps. Use
step-1,step-2and so on.
Use utm_term for an audience label like vip, new-subscribers or lapsed-90d. Keep it to segment names. A term value that identifies one person is personal data and does not belong in a URL. To find these fields in reports, see how to find utm_content and utm_term in GA4.
What about RCS and MMS?
Some platforms now tag by message type. Postscript, for example, replaced its static medium with a Message Type token that outputs SMS or RCS depending on the channel actually used (Postscript docs). An rcs medium does not match GA4's SMS rule, so those sessions land in Unassigned.
You have two choices:
- Force
smsfor all text-style messages. Simple, and everything stays in the default SMS channel. You lose the RCS split in source/medium. - Keep
rcsandmmsas separate mediums and create a custom channel group with a channel such as "SMS & RCS" where medium matches the regex^(sms|rcs|mms)$. Custom channel groups apply to past data too.
We recommend the second option if RCS is a real part of your program, because rich cards and buttons may perform differently. Either way, check what value actually appears in GA4, including case. More detail in RCS business messaging UTM tracking.
Governance note
A naming convention only works if someone owns it. Keep this light:
- One owner. Name one person who approves new campaign patterns and flow names.
- One naming sheet. List allowed source values, the medium, the campaign pattern, every live flow value, and the date each changed.
- Check platform defaults twice a year. Vendors change defaults. Klaviyo moved its default
utm_mediumto a Message type value on June 2, 2025, but accounts that had saved custom UTM settings before then kept their old values. Older accounts may still sendcampaignorflowas the medium. - Lock the medium. Where your platform allows it, set
utm_mediumglobally and stop people overriding it per message. - Review weekly in busy seasons. In GA4, filter session medium for anything that looks like a text value but is not exactly
sms.
A shared builder helps too. When everyone creates links from the same template in UTMCraft, typos drop. For teams producing many links at once, see our bulk UTM workflow.
What to do now
- Open your SMS platform's UTM settings and confirm the medium outputs lowercase
sms. - Decide your source rule (platform name) and write it down.
- Copy the campaign, flow and holiday tables above into your naming sheet and adjust the theme words.
- Rename any flow values that include dates or spaces.
- Send a test text to your own phone, tap the link and check the URL in the address bar.
- In GA4, look at Traffic acquisition by session source/medium and fix any text traffic outside
/ sms.
Run through our UTM QA checklist before your first holiday send.
FAQ
Should utm_source be sms or the platform name?
Both work for GA4's SMS channel, because the rule matches source or medium. We recommend utm_medium=sms with the platform as source. It keeps the source column informative when you use more than one tool.
Does capitalization matter for utm_medium=sms?
Channel matching is case-insensitive in practice, but SMS and sms still show as separate rows in source/medium reports. Use lowercase sms exactly.
Should flow campaign values include a date?
No. Flows run continuously, so a date becomes wrong quickly. Use a stable value like flow_abandoned-cart and add a version suffix only when you rebuild the flow.
Can I put the customer's first name or phone number in a UTM?
No. UTMs must never contain phone numbers, names, emails or other personal data. Use segment labels instead.
For the broader setup, read SMS UTM Tracking: The Complete Guide to Measuring Text Message Campaigns in GA4. Browse the SMS & Messaging Tracking guides to choose another troubleshooting task.
References
- [GA4] Default channel group (Google Analytics Help)
- [GA4] Custom channel groups (Google Analytics Help)
- Understanding UTM tracking in Klaviyo (Klaviyo Help Center)
- Adjust your global UTM parameters (Postscript Help Center)
- Set up global link tracking (Attentive Help Center)