Preset with paid-social and the right source. Turn normalization off when you paste a dynamic macro - that part has to stay exactly as Meta wrote it.
Start from a channel
Where the traffic comes from
Channel type - analytics groups by this
Which campaign this link belongs to
Paid keyword, usually filled in by the ad platform
Which creative or placement was clicked
Non-standard, supported for teams already using it
Your tagged URL
Enter a destination URL to see the result
Generated in your browser - the URL is never uploaded.
Build a link above and its QR code appears here.
Logo in the centre
Putting your logo inside the code is a paid Revolink feature.
Your presets
No presets yet. Fill in the fields above and save the combination you keep retyping.
These presets live in this browser only
They survive a refresh, but they do not follow you to another device and your teammates cannot see them. A free Revolink account stores three UTM templates on the server - unlimited on paid plans.
Save presets to an accountThis URL is long, and it only tells you where clicks came from
Shorten it with Revolink and you also get click counts, geography, device breakdown - and the UTMs survive the redirect.
Everywhere else, lowercasing values protects your data. Here it destroys it: {{campaign.name}} lowercased is no longer a macro Meta recognizes, and the literal text ends up in your reports instead of the campaign name.
Facebook Ads is the one channel where you are not writing final values but a template the platform completes at delivery. That is powerful - and it is why the usual tagging advice needs an exception here.
Meta fills in placeholders like {{campaign.name}} and {{ad.id}} at delivery time, and it only recognizes them written exactly that way. Lowercasing them turns the macro into literal text that never gets replaced - this is the one place where normalization has to be switched off.
Anything you paid to distribute belongs under utm_medium=paid-social. Leaving it as social merges budget with organic reach, and the report can no longer answer whether the spend did anything.
Meta appends its own click identifier to the destination. It does not interfere with your UTM parameters, but it does make the final URL long - worth knowing before you paste that link anywhere a human will see it.
The URL parameters field is per-ad, which is exactly the granularity that makes utm_content useful. Putting them into the destination URL by hand means editing every ad separately and eventually missing one.
Running organic posts too? Those belong under Instagram with a different medium, or use the full builder.
utm_source=facebook and utm_medium=paid-social. Use instagram as the source when the placement is Instagram and you want to separate the two, and keep paid-social for anything you paid to run - organic posts are the ones that belong under social.
The commonly used ones name the campaign, ad set and ad, in both name and id form - {{campaign.name}}, {{campaign.id}}, {{adset.name}}, {{adset.id}}, {{ad.name}}, {{ad.id}} - along with {{placement}} and {{site_source_name}}. Meta's own ad-setup documentation is the authoritative list, since it changes over time.
Because something changed its form before delivery - most often lowercasing, a stray space, or the braces being URL-encoded. The macro has to reach Meta character for character. Turn off value normalization in the builder above when you are using them.
Yes, they answer different questions. The pixel reports inside Ads Manager, using Meta's own attribution. UTM parameters are what let your analytics platform, your CRM and every other tool see the same traffic in the same terms as every other channel you run.
Stop sending everyone to the same page. Route by location, device, and time - start free, no credit card required.
Start for Free - No Card RequiredFree forever Β· No credit card Β· Cancel anytime
Already have links? Import them