UTM Campaign URL QA Auditor
Pricing
Pay per event
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
Maintained by CommunityActor 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.
Paid media agencies
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?
| Field | Description |
|---|---|
inputUrl | URL submitted by the user |
normalizedUrl | URL after scheme normalization |
finalUrl | Last URL reached after redirects |
finalStatus | Last HTTP status code |
ok | Overall pass/fail boolean |
hopCount | Number of redirect hops |
totalMs | Total time spent checking the URL |
httpsOk | Whether final URL satisfies HTTPS requirement |
finalHost | Host of the final landing URL |
finalHostMatchesExpected | Whether final host matched your rule |
finalPathMatchesExpected | Whether final path matched your rule |
missingParams | Expected UTM keys that disappeared |
changedParams | Expected UTM values that changed |
extraParams | Unexpected UTM keys found on final URL |
utmOk | Whether required UTM parameters passed |
redirectChain | Per-hop status, location, timing, and content type |
canonicalUrl | Optional HTML canonical URL |
metaRobots | Optional robots meta tag |
error | Row-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
- Add campaign URLs to Campaign URLs.
- Add expected UTM parameters such as
utm_sourceandutm_medium. - Optionally add an expected final host such as
example.com. - Keep Require HTTPS final URL enabled for production campaigns.
- Run the actor.
- 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:
urlexpectedFinalHostexpectedFinalPath- UTM columns such as
utm_source,utm_medium,utm_campaign,utm_content, andutm_term
Example:
url,expectedFinalHost,utm_source,utm_mediumhttps://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 (
HEADorGET) - status code
- raw
Locationheader - 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
expectedFinalHostto catch links landing on staging domains. - Set
expectedFinalPathfor high-value conversion pages. - Keep
requireHttpsenabled 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 ApifyClientclient = 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.
Related Apify actors
- Bulk URL Status Checker
- Broken Link Checker
- Redirect Chain Analyzer
- SEO Audit Tool
- Structured Data Extractor
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.