UTM Campaign URL QA Auditor avatar

UTM Campaign URL QA Auditor

Pricing

Pay per event

Go to Apify Store
UTM Campaign URL QA Auditor

UTM Campaign URL QA Auditor

Audit campaign URLs in bulk for redirect chains, UTM preservation, HTTPS, final host/path rules, status codes, and timings.

Pricing

Pay per event

Rating

0.0

(0)

Developer

Stas Persiianenko

Stas Persiianenko

Maintained by Community

Actor stats

0

Bookmarked

2

Total users

1

Monthly active users

5 days ago

Last modified

Categories

Share

Audit marketing campaign URLs before launch. This Apify Actor follows every redirect, checks final landing pages, verifies UTM parameters, and returns one QA row per URL.

Use it for email links, paid social ads, influencer links, QR-code destinations, affiliate links, link shorteners, and media-plan QA spreadsheets.

What does UTM Campaign URL QA Auditor do?

The actor accepts campaign URLs and validates that they still land where your team expects.

It checks:

  • ✅ redirect chains and hop counts
  • ✅ final status codes
  • ✅ final URL, host, and path
  • ✅ HTTPS landing-page requirement
  • ✅ expected utm_source, utm_medium, utm_campaign, and other UTM parameters
  • ✅ missing, changed, or unexpected UTM parameters
  • ✅ response time per URL
  • ✅ structured errors for timeout, DNS, blocked HEAD requests, and invalid URLs

Who is it for?

Marketing operations teams

Use it before a campaign goes live to catch stripped UTMs, broken short links, wrong landing domains, and slow redirect chains.

Validate hundreds of tracking links from media plans before handing campaigns to clients or ad platforms.

Email and lifecycle teams

Check newsletter, CRM, and automation links after UTM tagging changes or landing-page migrations.

SEO and analytics teams

Find campaign attribution breaks caused by redirects, canonical changes, or accidental query-parameter rewrites.

Why use this actor?

Manual link QA is slow and easy to miss. A single broken redirect or stripped utm_campaign can ruin attribution for an entire launch.

This actor gives you repeatable, exportable checks that fit into Apify schedules, webhooks, Make, Zapier, Airflow, and internal QA pipelines.

What data can it extract?

FieldDescription
inputUrlURL submitted by the user
normalizedUrlURL after scheme normalization
finalUrlLast URL reached after redirects
finalStatusLast HTTP status code
okOverall pass/fail boolean
hopCountNumber of redirect hops
totalMsTotal time spent checking the URL
httpsOkWhether final URL satisfies HTTPS requirement
finalHostHost of the final landing URL
finalHostMatchesExpectedWhether final host matched your rule
finalPathMatchesExpectedWhether final path matched your rule
missingParamsExpected UTM keys that disappeared
changedParamsExpected UTM values that changed
extraParamsUnexpected UTM keys found on final URL
utmOkWhether required UTM parameters passed
redirectChainPer-hop status, location, timing, and content type
canonicalUrlOptional HTML canonical URL
metaRobotsOptional robots meta tag
errorRow-level error if the URL could not be checked

How much does it cost to audit campaign URL UTMs?

The actor uses pay-per-event pricing: a small start event plus one event for each URL result. Because it is HTTP-only and defaults to HEAD requests with GET fallback, it is designed for cheap bulk QA.

For current live pricing, open the Pricing tab on the Apify Store page.

Quick start

  1. Add campaign URLs to Campaign URLs.
  2. Add expected UTM parameters such as utm_source and utm_medium.
  3. Optionally add an expected final host such as example.com.
  4. Keep Require HTTPS final URL enabled for production campaigns.
  5. Run the actor.
  6. Export the dataset to CSV, JSON, Excel, or connect it to your workflow.

Input: campaign URLs

You can paste URLs into the Apify request-list editor.

Example:

{
"startUrls": [
{ "url": "https://httpbin.org/redirect-to?url=https%3A%2F%2Fexample.com%2F%3Futm_source%3Dnewsletter%26utm_medium%3Demail" },
{ "url": "https://example.com/?utm_source=newsletter&utm_medium=email" }
],
"expectedUtmParams": {
"utm_source": "newsletter",
"utm_medium": "email"
},
"expectedFinalHost": "example.com",
"requireHttps": true
}

Input: CSV media-plan rows

Use csvText when you already have a spreadsheet. Supported simple columns include:

  • url
  • expectedFinalHost
  • expectedFinalPath
  • UTM columns such as utm_source, utm_medium, utm_campaign, utm_content, and utm_term

Example:

url,expectedFinalHost,utm_source,utm_medium
https://example.com/?utm_source=newsletter&utm_medium=email,example.com,newsletter,email

Per-URL expected rules

Each startUrls entry can override global rules:

{
"url": "https://short.example/spring-sale",
"expectedFinalHost": "www.example.com",
"expectedFinalPath": "/spring-sale",
"expectedUtmParams": {
"utm_campaign": "spring_sale"
}
}

Output examples

A passing result looks like this:

{
"inputUrl": "https://example.com/?utm_source=newsletter&utm_medium=email",
"finalUrl": "https://example.com/?utm_source=newsletter&utm_medium=email",
"finalStatus": 200,
"ok": true,
"hopCount": 0,
"utmOk": true,
"missingParams": [],
"changedParams": [],
"extraParams": []
}

A failed result might show:

{
"ok": false,
"missingParams": ["utm_campaign"],
"finalHostMatchesExpected": false,
"error": null
}

Redirect-chain diagnostics

The redirectChain array records each hop with:

  • hop index
  • URL requested
  • method used (HEAD or GET)
  • status code
  • raw Location header
  • resolved absolute redirect URL
  • response time
  • content type
  • hop-level error

This helps identify whether a tracking service, shortener, CDN, or final landing page caused a failure.

HEAD and GET behavior

The default HEAD_THEN_GET mode starts with HEAD because many URL checks do not need page bodies. If a site rejects HEAD with 403 or 405, the actor retries that hop with GET.

Use GET_ONLY if a destination behaves differently for HEAD and GET. Use HEAD_ONLY for very low-bandwidth checks when you do not want body requests.

HTML signals

Enable Fetch HTML signals to extract final-page canonical URL and meta robots values.

Keep it disabled for cheapest redirect-only QA. Enable it when SEO or analytics teams need landing-page context.

Tips for accurate campaign QA

  • Use exact expected UTM values from your media plan.
  • Set expectedFinalHost to catch links landing on staging domains.
  • Set expectedFinalPath for high-value conversion pages.
  • Keep requireHttps enabled unless you intentionally test HTTP.
  • Increase timeout for slow affiliate or tracking links.
  • Lower concurrency for fragile internal QA environments.

Scheduling monitors

Run the actor on a schedule to detect link drift after launch. For example:

  • daily during a campaign launch week
  • weekly for evergreen email journeys
  • before paid media bulk upload
  • after landing-page redirects are changed

Integrations

Google Sheets

Export dataset rows to a Google Sheet and filter ok = false for QA follow-up.

Slack or email alerts

Use Apify webhooks to notify your team when a scheduled run finds failed rows.

Make and Zapier

Trigger the actor from a form, spreadsheet, or campaign-management workflow.

Data warehouses

Export JSON or CSV to your warehouse to keep historical QA evidence for campaigns.

API usage: Node.js

import { ApifyClient } from 'apify-client';
const client = new ApifyClient({ token: process.env.APIFY_TOKEN });
const run = await client.actor('automation-lab/utm-campaign-url-qa-auditor').call({
startUrls: [{ url: 'https://example.com/?utm_source=newsletter&utm_medium=email' }],
expectedUtmParams: { utm_source: 'newsletter', utm_medium: 'email' },
expectedFinalHost: 'example.com'
});
console.log(run.defaultDatasetId);

API usage: Python

from apify_client import ApifyClient
client = ApifyClient('YOUR_APIFY_TOKEN')
run = client.actor('automation-lab/utm-campaign-url-qa-auditor').call(run_input={
'startUrls': [{'url': 'https://example.com/?utm_source=newsletter&utm_medium=email'}],
'expectedUtmParams': {'utm_source': 'newsletter', 'utm_medium': 'email'},
'expectedFinalHost': 'example.com'
})
print(run['defaultDatasetId'])

API usage: cURL

curl -X POST 'https://api.apify.com/v2/acts/automation-lab~utm-campaign-url-qa-auditor/runs?token=YOUR_APIFY_TOKEN' \
-H 'Content-Type: application/json' \
-d '{"startUrls":[{"url":"https://example.com/?utm_source=newsletter&utm_medium=email"}],"expectedUtmParams":{"utm_source":"newsletter","utm_medium":"email"},"expectedFinalHost":"example.com"}'

MCP integration

Use the Apify MCP server from Claude Desktop, Claude Code, or other MCP clients:

https://mcp.apify.com/?tools=automation-lab/utm-campaign-url-qa-auditor

Add it in Claude Code:

$claude mcp add apify-utm-url-auditor https://mcp.apify.com/?tools=automation-lab/utm-campaign-url-qa-auditor

Claude Desktop JSON config:

{
"mcpServers": {
"apify-utm-url-auditor": {
"url": "https://mcp.apify.com/?tools=automation-lab/utm-campaign-url-qa-auditor"
}
}
}

Example prompts:

  • "Audit these 200 campaign URLs and summarize failed UTM checks."
  • "Find every redirect chain with more than two hops."
  • "Compare final hosts against my expected domain list."

Common troubleshooting

Why did a row fail with a HEAD error?

Some servers reject HEAD. Keep the default HEAD_THEN_GET mode so the actor retries with GET, or switch to GET_ONLY for those domains.

Why is ok false when the final status is 200?

The HTTP request succeeded, but a QA rule failed. Check missingParams, changedParams, httpsOk, finalHostMatchesExpected, and finalPathMatchesExpected.

Why are there extra UTM parameters?

Some tracking systems append their own campaign tags. Add harmless keys to allowedExtraParams if you expect them.

Legality and responsible use

The actor checks public URLs supplied by you. It does not bypass logins, scrape private accounts, or require cookies. Use it only for URLs you are authorized to test and avoid excessive concurrency against fragile sites.

FAQ

Can it audit URL shorteners?

Yes. It manually follows redirects and records each hop.

Can it detect stripped UTMs?

Yes. Add expected UTM parameters and inspect missingParams and changedParams.

Can it process hundreds of URLs?

Yes. Set maxItems and concurrency to match your batch size and target stability.

Does it use a browser?

No. It is HTTP-only for speed and cost control.

Does it need proxies?

No proxy is configured by default. If a destination blocks automated checks, the actor records a structured error for that URL.

Changelog

0.1

Initial campaign URL QA actor with redirect-chain capture, UTM validation, host/path checks, HTTPS checks, timings, CSV input, and optional HTML signals.