How to Validate UTM Links Before Publishing

To validate UTM links before publishing, run a single automated check against your destination URL before any link goes live. That check should confirm the URL resolves, verify your UTM parameters are correctly formatted and will survive redirect chains, and inspect the landing page for social sharing readiness: Open Graph tags, Twitter Card meta, viewport, and page speed. Done manually this takes 15–20 minutes across multiple tools. Done with mlz preflight, it takes under 10 seconds. Here’s exactly how.

Terminal showing mlz preflight output with SSL, resolution, og_tags, twitter_card, viewport all passing and redirects showing a warning, with a Ready to publish badge below

What “validating a UTM link” actually means

Many marketers think of UTM link validation as checking that the URL looks right: the right source, medium, and campaign values are present and correctly spelled. That’s one piece of it. But a UTM link can have perfect parameters and still fail silently in three ways you’d never catch by looking at the URL.

The destination might not resolve
A 404, a server error, or an expired domain returns nothing. You’ve paid for clicks to a dead endpoint. The URL looks correct; the page doesn’t exist. This is the kind of failure you only catch by actually hitting the URL with a request.
Redirect chains might strip your parameters
Your link goes to http://example.com/campaign, which redirects to https://example.com/campaign, which redirects to https://www.example.com/campaign/. By the third hop, several common redirect configurations silently drop query parameters — including your utm_source, utm_medium, and utm_campaign. The destination receives the click; Analytics records it as direct. Attribution is gone.
The landing page might not be ready for social sharing
Missing og:image tags, no Twitter Card meta, non-mobile-responsive viewport — none of these are visible from the URL string. But they determine how your link renders as a social preview card when you paste it into LinkedIn, Twitter, or Slack. A missing OG image means a plain text URL where a rich preview card should appear. For paid social, that’s a significant CTR hit.

Real UTM link validation covers all three. It’s not a formatting check — it’s a full-stack check that simulates what happens when a real browser follows the link and what a social platform sees when it crawls the destination. The campaign link validation guide has the full breakdown of all 11+ checks involved.

The pre-publish link validation checklist

Before any campaign link goes live, run through these seven checks. If you’re validating manually, budget 15–20 minutes across three or four tools. If you’re using mlz preflight, this is one command that completes in seconds.

1. URL resolves with HTTP 200
Confirm the destination returns a 200 OK. A 404 means the page doesn’t exist. A 5xx means the server is down or the route is broken. Either scenario wastes every click you send there. Manual method: curl -I https://yoursite.com/landing and look at the status line. Automated: mlz preflight runs this as the resolution check.
2. HTTPS / SSL is valid
Every browser displays a “Not Secure” warning for HTTP-only pages. If your destination URL starts with http:// or has an expired certificate, users will see that warning and bounce. Most landing pages are correctly HTTPS in 2026 — but always verify, especially for microsites, event landing pages, and client domains.
3. Redirect chain is short and UTM parameters survive
Acceptable: one redirect (usually http → https, or bare domain to www). Investigate: two or more hops. Blocking: UTM parameters are stripped at any hop. The redirect check has to follow the full chain with your UTM parameters appended and confirm they’re present on the final URL. This cannot be done by visual inspection of the link — it requires actually following the redirect.
4. OG tags are present and complete
Check for og:title, og:description, and og:image. All three are required for a rich preview on LinkedIn, Facebook, and Slack. og:image is the most commonly missing, and its absence produces a blank preview — a plain text URL where an image card should be. Manual method: browser DevTools → Elements → search for og:. Automated: mlz preflight returns the full set in open_graph.
5. Twitter Card meta is configured
X (Twitter) uses its own card system alongside OG tags. Without twitter:card, twitter:title, and twitter:image, your link renders as plain text in the feed. Twitter Card and OG tags partially overlap but are not identical — check both separately.
6. UTM parameters are properly formatted
All values lowercase, no spaces (use hyphens), no special characters that require percent-encoding. GA4 is case-sensitive: LinkedIn and linkedin appear as two separate sources in your reports. See the UTM naming convention guide for the complete formatting rules.
7. Page load speed is acceptable
Pages that take more than 1.5 seconds to respond get flagged as slow; pages over 3 seconds should be investigated before launch. Google’s own research estimates a 7% conversion drop per additional second of load time. Slow pages hurt both paid campaigns (quality score) and organic traffic (Core Web Vitals).

Manual validation vs. automated

Manual validation works for a single link if you have time and know which tools to use. It breaks down at scale and under time pressure — both common conditions in marketing.

Manual path: Open the URL in a browser to check resolution (1 min). Use curl -I to inspect the status code and redirect hops (2 min). Open DevTools to inspect meta tags (5 min). Use Facebook’s Sharing Debugger or LinkedIn’s Post Inspector to preview the social card (3 min each). Manually inspect your UTM parameter string for casing and formatting errors (2 min). Total: 15–20 minutes, depending on what you find. And if the validation reveals a problem, you fix it and start over.

Automated path with mlz preflight: One command, under 10 seconds, deterministic results. Every check runs in parallel. The output is a structured report — pass/warn/fail per check — that tells you exactly what needs fixing. What mlz preflight checks vs. other tools has the full comparison, including what Google’s Campaign URL Builder and UTM.io miss.

For teams validating 10+ links per campaign, or for campaigns validated in CI/CD, manual validation isn’t viable. One person checking 20 links manually takes four hours. One CI job checking 20 links takes 30 seconds.

Walkthrough: validating a LinkedIn campaign link

Here’s a realistic pre-publish scenario. You’re launching a summer sale campaign on LinkedIn. The destination is https://acme.com/lp/summer-sale. You need a tracked URL with the correct UTM parameters, and you need to confirm the landing page is ready before spending a dollar on promotion.

Install MissingLinkz if you haven’t already:

npm install -g missinglinkz

Run the preflight check:

mlz preflight --url "https://acme.com/lp/summer-sale" --campaign "summer-sale-2026" --source "linkedin" --medium "social"

The output (human format):

mlz preflight — summer-sale-2026
tracked_url: https://acme.com/lp/summer-sale?utm_source=linkedin&utm_medium=social&utm_campaign=summer-sale-2026

checks:
  PASS  ssl           URL uses HTTPS.
  PASS  resolution    Destination responded with 200 (214ms).
  WARN  redirects     1 redirect detected (http → https). UTM parameters preserved.
  PASS  response_time Page load time: 340ms.
  PASS  og_tags       All essential Open Graph tags present.
  PASS  twitter_card  Twitter Card tags configured.
  PASS  viewport      Viewport meta tag present.
  PASS  canonical     Canonical URL matches destination.
  PASS  favicon       Favicon found.
  PASS  utm_valid     All required UTM parameters present and formatted correctly.
  PASS  utm_preserved UTM parameters preserved through redirect chain.

summary:  10 passed · 1 warning · 0 failed
ready:    true
verdict:  Link is ready to publish. Review the redirect warning when you have time.

The tracked URL is ready to copy into your LinkedIn post. All the substantive checks passed. The one warning — a single http-to-https redirect — is common and acceptable: UTM parameters survived the hop. If the warning had said “UTM parameters stripped”, that would be a blocking issue requiring a fix before launch.

For automation and agent workflows, add --format json to get a machine-readable response:

JSON response
{
  "ready": true,
  "tracked_url": "https://acme.com/lp/summer-sale?utm_source=linkedin&utm_medium=social&utm_campaign=summer-sale-2026",
  "checks": [
    { "check": "ssl", "status": "pass", "message": "URL uses HTTPS." },
    { "check": "resolution", "status": "pass", "message": "Destination responded with 200." },
    { "check": "redirects", "status": "warn", "message": "1 redirect. UTM parameters preserved." },
    { "check": "og_tags", "status": "pass", "message": "All essential Open Graph tags present." },
    { "check": "twitter_card", "status": "pass", "message": "Twitter Card tags configured." }
  ],
  "summary": { "total": 11, "passed": 10, "warnings": 1, "failed": 0 },
  "recommendation": "Link is ready to publish. Review the redirect warning when you have time."
}

The ready: true flag is the key signal. Any automated workflow, script, or AI agent can make a go/no-go decision based on that single boolean. If ready is false, the checks array tells you exactly which checks failed and why.

Reading the output: passes, warnings, and failures

Every check in the preflight report has one of three statuses. Understanding the difference determines whether you publish, investigate, or block.

PASS — proceed
The check ran and found no problems. Nothing to do. When all checks pass, ready is true and you can publish with confidence.
WARN — investigate before publishing
Something was found that isn’t necessarily broken but warrants attention. A single redirect (usually http → https) is a common warning — acceptable if UTM parameters are preserved. A slow response time (above 1.5 seconds but below 3) is another warning-level finding: not blocking on its own, but worth investigating before driving paid traffic. Warnings don’t set ready to false on their own unless your configuration treats them as failures.
FAIL — must fix before publishing
The check found a definite problem that will cost you clicks, attributions, or user trust. A failed resolution (404, 500), a missing og:image, stripped UTM parameters, or an SSL error are all failures. When any check fails, ready is false. Do not publish until failures are resolved.

When a warning is acceptable vs. blocking

Not all warnings carry the same weight. Here’s how to evaluate the most common ones.

Redirect warning (1 hop, UTM parameters preserved) — acceptable
A single http-to-https redirect with UTM parameters intact is the most common warning and almost always acceptable. Google recommends no more than three redirects total; one is fine. The critical qualifier is “UTM parameters preserved” — if that line says “stripped” instead, it’s a blocking issue.
Redirect warning (2+ hops, UTM preserved) — investigate
Multiple redirect hops add latency and increase the risk of parameter stripping. If you see this before a paid launch, clean up the redirect chain when possible. Two hops is technically workable; three or more is actively worth fixing.
Response time warning (1.5–3 seconds) — investigate
Pages in this range are slower than ideal. For organic social, this may be acceptable. For paid search or paid social where you’re paying per click, a slow page is burning money on bounces. Investigate with your engineering team before a large spend.
Missing favicon — low priority
Favicons affect how your site appears in browser tabs. They don’t affect campaign attribution or social previews directly. Flag it, don’t block on it.
No CTA detected in post copy — consider before publishing
If you provided post copy via --copy, MissingLinkz checks for common call-to-action phrases. Posts without a clear CTA consistently underperform. This is a nudge, not a hard stop — but it’s worth reviewing before you publish.
FAIL on resolution, SSL, or UTM stripping — always blocking
A dead destination, an expired SSL certificate, or UTM parameters that don’t survive the redirect chain are all campaign-breaking failures. Fix them before any link goes live.

Frequently asked questions

Do I need to validate every UTM link I publish?
Every link that will receive significant traffic — paid campaigns, email blasts, social posts — should be validated before launch. For high-volume campaigns, the cost of skipping validation is consistently higher than the cost of running a check. For low-traffic internal links or quick tests, validation is optional but still takes under 10 seconds.
What if my URL uses intentional redirects?
Intentional redirects — a URL shortener, a campaign tracking redirect, a branded domain alias — are fine if they preserve UTM parameters. The validation confirms preservation. What you’re checking isn’t whether redirects exist, but whether your tracking survives them.
Can I validate multiple links at once?
Yes. For bulk validation in a shell loop or CI pipeline, see the CI/CD automation guide. For programmatic bulk building and validation, the programmatic UTM building guide covers the npm and REST API approaches.
What’s the difference between mlz preflight and mlz check?
mlz check validates the destination URL only — resolution, SSL, redirects, and response time. mlz preflight does everything mlz check does, plus builds the UTM-tagged link, inspects the landing page for OG tags and Twitter Cards, and validates any post copy you provide. Preflight is the complete pre-publish workflow; check is the URL-only subset.
Does validation require an API key?
No. Basic UTM building and offline validation run without an API key. Link storage, campaign management, and usage tracking require a free account. Run mlz auth register to create one, or start without a key and register when you need storage.

Validate your next campaign link in 30 seconds

Install MissingLinkz and run your first preflight check before the next link goes live.

npm install -g missinglinkz
mlz preflight --url "https://yoursite.com/landing" --campaign "your-campaign" --source "linkedin" --medium "social"

Free for up to 50 links/month. No credit card required.