GA4 Troubleshooting

Postscript UTM Parameters: How to Keep SMS Attribution Clean in GA4

If Postscript is already appending UTM parameters but GA4 still shows messy SMS rows, the real gap is usually naming policy and cross-channel governance, not one missing toggle.

Jul 6, 2026 10 min readBy The UTM Drift Guard team
GA4 Troubleshooting
EmailEMAILe-mailemail

Postscript is already adding utm_source, utm_medium, and utm_campaign, yet GA4 still does not show one clean lifecycle story. SMS looks separated from email in one report, then mixed into a few near-duplicate campaign families in the next export. Another team adds custom parameters for convenience, and suddenly the account has more labels than answers. That is the real Postscript UTM parameters problem. The defaults help, but they do not give you governed attribution by themselves.

Why Postscript can look configured while SMS attribution still drifts#

Postscript gives lifecycle teams a useful head start. You can set global UTM parameters instead of tagging every SMS link by hand. That reduces obvious mistakes. But the buyer pain usually starts after that first layer. One team uses utm_medium=SMS, another writes sms, a third keeps campaign names in a different style than email, and custom parameters slowly accumulate because each flow owner wants one extra bit of context. The result is not a platform failure. It is a naming contract failure hiding behind a platform default.

That is why the page should be read as a governance guide, not as an SMS setup checklist. Teams rarely compare SMS in isolation. They compare it against email, paid social, lifecycle automations, and manager-facing revenue views. If SMS rows are clean on their own but inconsistent beside the rest of the stack, trust still breaks. When 10–20% of GA4 sessions commonly land in Unassigned, and as much as 26% of conversions can be credited to the wrong channel when UTM data is fragmented, a small SMS naming leak can bend a much bigger reporting story. This is the same cleanup logic behind GA4 source-medium drift audits, HubSpot GA4 attribution mismatch cleanup, and a broader UTM governance software decision.

10–20%

of GA4 sessions commonly land in Unassigned

26%

of conversions can be credited to the wrong channel when UTM data is fragmented

29%

attribution accuracy improvement after standardization (Cometly, 2026)

  1. 1SMS link generatedPostscript applies global UTM parameters to outbound links
  2. 2Customer clicksGA4 receives source, medium, campaign, and any extra custom tags
  3. 3Cross-channel reports comparedTeams compare SMS beside email, paid, and onsite acquisition data
  4. 4Naming drift appearsSource or campaign values differ by flow owner, channel, or custom field habits
  5. 5Trust breaksOne retention motion now appears under several GA4 rows instead of one clean story
Postscript can tag the click, but trust still depends on one naming contract surviving SMS, email, paid, and reporting exports together.

The practical rule

Treat Postscript defaults as a starting point, not proof that lifecycle attribution is clean. You still need one stable vocabulary and an export-based audit.

Run the Postscript attribution audit in 6 steps#

  1. 1

    1) Export raw GA4 source, medium, and campaign rows first

    Start with the rows your stakeholders actually see. Look for the same SMS program split across values like postscript, Postscript, sms, SMS, retention-sms, or (direct) / (none). If the export is already fragmented, the problem is visible before you inspect any individual template.

  2. 2

    2) Separate parameter presence from naming quality

    Check whether utm_source, utm_medium, and utm_campaign are present on real Postscript links. Then ask the harder question: are those values present in one stable format across campaigns, automations, response links, and any related onsite paths? Presence alone is not the finish line.

  3. 3

    3) Lock a medium policy before you lock a dashboard

    If your policy is utm_medium=SMS, keep it exact. Do not let one flow write sms, another SMS, and another text-message just because the channel feels obvious to the operator who built it. Keep the detail somewhere else, usually in utm_campaign or utm_content.

  4. 4

    4) Audit source and campaign naming across SMS and email together

    The most common real-world failure is not inside SMS alone. It is one lifecycle motion spread across Postscript, Klaviyo, HubSpot, or custom CRM labels that describe the same retention program differently. Compare SMS rows beside adjacent email rows before you decide the channel is clean.

  5. 5

    5) Treat custom parameters like governance debt until proven otherwise

    Every optional field can be useful, but every optional field can also become another inconsistent naming layer. Check whether custom tags create one clear analytic slice or just one more pile of labels that nobody normalizes later.

  6. 6

    6) Grade the drift before the next campaign goes live

    Cluster duplicate families, rank them by traffic impact, and preserve the before-state. That gives lifecycle operators one cleanup sequence instead of several channel-specific debates.

A
B
C
D
F
C64 / 100C: global defaults exist, but source, campaign, or custom-parameter drift still weakens the lifecycle reporting story
A simple grade helps teams see whether Postscript is merely tagging links or actually keeping SMS attribution readable in GA4.

What to score inside a Postscript plus GA4 cleanup#

The fastest useful audit is a readability audit. You are checking whether SMS still looks human-readable when it sits beside the rest of the stack. If a manager sees three campaign families that should really be one, the issue is not that Postscript failed to send a text. The issue is that the account still lacks one canonical naming system. This is where a forwardable sample report is more useful than another collection of platform tips.

A practical scorecard for Postscript SMS attribution cleanup.
Audit areaWhat to look forWhy it breaks trust
Global parameter coverageLinks include UTM fields in some flows but not in one stable pattern everywhereThe team mistakes partial automation for full governance
Medium policysms, SMS, text-message, or mixed custom medium values for one laneGA4 splits one retention channel into several rows
Source namingpostscript, Postscript, or cross-tool source labels for the same lifecycle motionOne source family turns into a noisy acquisition cluster
Campaign namingOne promotion or flow appears under several near-duplicate campaign stringsManagers cannot trust trend comparisons across sends
Custom parametersEvery team adds its own tags without a shared contractUseful context turns into unreadable reporting debt
postscriptPostscriptpost-script
postscript
smsSMStext-message
sms
winback-julyWinback Julywinback_july
winback-july
retention-offerretention offerretention_offer
retention-offer
Most SMS attribution confusion is one retention motion remembered under too many avoidable labels.

A mini example: global UTMs are on, but the lifecycle story still splits#

Here is the pattern operators keep inheriting. The SMS platform is tagging links. The email platform is tagging links. Paid social is tagging links. Yet the same promotion still appears under several campaign or source families because each lane names it a little differently. That is why the right comparison is not “did Postscript add the tags?” The right comparison is “did one customer journey stay readable after SMS joined the rest of the stack?” This is also where Customer.io GA4 UTM parameter cleanup and adjacent lifecycle pages become useful cross-checks instead of separate silos.

One retention motion expressed four different ways across SMS and adjacent lifecycle reporting.
https://example.com/offer?utm_source=postscript&utm_medium=SMS&utm_campaign=winback-july&utm_content=hero-text
https://example.com/offer?utm_source=Postscript&utm_medium=sms&utm_campaign=Winback July&utm_content=coupon-reminder
https://example.com/offer?utm_source=retention&utm_medium=text-message&utm_campaign=winback_july&utm_content=final-call
GA4 rows: postscript / SMS | Postscript / sms | retention / text-message | (direct) / (none)

Before cleanup

Global defaults exist but source and campaign families still splitSMS naming differs from email and paid namingCustom tags multiply faster than they are normalizedLifecycle reporting needs manual explanation every review

After cleanup

One canonical source policyOne exact medium policy for SMSCampaign families normalize across channelsGA4 exports are easier to defend internally
The goal is not more creative tagging. It is one lifecycle vocabulary that keeps SMS readable beside every other acquisition row.

The 5 most common root causes behind Postscript GA4 reporting gaps#

  • Teams assume global UTM defaults equal a finished attribution system, so nobody reviews the exported rows until trust is already gone.
  • One SMS lane uses several medium values because different operators describe the same channel in different ways.
  • Source and campaign labels drift between SMS, email, and paid teams even when everyone thinks they are running the same promotion.
  • Custom parameters are added for convenience without a shared rule for what belongs in utm_content versus a custom field.
  • Stakeholders compare lifecycle channels in GA4 before anyone clusters duplicates or ranks the highest-impact naming debt first.

Postscript lifecycle attribution cleanup checklist

  • Export raw GA4 rows and isolate SMS traffic before changing templates
  • Verify that utm_medium=SMS or your chosen exact policy is used consistently everywhere
  • Check whether utm_source values are stable across SMS and adjacent lifecycle tools
  • Normalize campaign families so one retention motion does not appear under several rows
  • Review custom parameters and remove any that create noise without a reporting purpose
  • Preserve the before-state, then fix the highest-impact drift before the next send

Do not let “SMS is tagged” end the audit

A tagged SMS link can still produce unreliable GA4 reporting if source, medium, campaign, or custom tags drift across the rest of the lifecycle stack. Defaults reduce setup work. They do not replace governance.

Does Postscript add UTM parameters automatically?

Postscript can apply global UTM parameters to outbound links, which gives teams a useful baseline. The important follow-up is confirming those values stay consistent across campaigns, automations, and adjacent lifecycle channels.

Should utm_medium be SMS in GA4?

It can be, as long as you keep the policy exact and consistent. The real risk is not the chosen label itself. The risk is letting several nearly identical medium labels describe the same SMS lane.

Why does SMS attribution still look fragmented in GA4 after Postscript tagging is enabled?

Because tagging links is only one step. Source naming, campaign naming, custom parameters, and cross-channel consistency can still split one lifecycle motion across several rows.

How do custom parameters in Postscript affect Google Analytics reporting?

They can add useful context, but only if the team agrees on what each parameter means and uses it consistently. Without that rule, custom tags become another source of reporting drift.

What should a Postscript team audit before trusting GA4 lifecycle reporting?

Audit exported source, medium, campaign, and custom-tag rows first. Then compare SMS beside email and paid traffic, cluster duplicates, and fix the highest-impact naming debt before another send compounds it.

Grade the SMS drift before the next send compounds it

Paste a GA4 export, see where Postscript campaign families split, and turn SMS cleanup into one ranked audit instead of another attribution debate.

Run a free audit