Guide · By PostBoost team · · Markdown
Short answer: add utm_source, utm_medium and utm_campaign to every link you share on social. Use the network as the source (linkedin), social as the medium for organic posts and a paid medium such as cpc for ads, and a campaign name that will still make sense in three months (q4-webinar). Write every value in lower case with dashes, give each network its own link, and use utm_content when two posts share a campaign. The free UTM builder applies these rules and warns you when a value breaks them.
What UTM parameters do
A UTM parameter is a tag at the end of a link, for example:
https://example.com/webinar?utm_source=linkedin&utm_medium=social&utm_campaign=q4-webinar
When someone opens that link, Google Analytics (and most other analytics tools) reads the tags and records where the visit came from. Without them, a click from a social app often arrives with no referrer and shows up as direct traffic, or as a bare referral from a domain like lnkd.in or t.co that tells you nothing about which post or campaign worked.
Google Analytics supports nine utm_ parameters. Three matter on every social link; the rest are optional:
| Parameter | What to put in it on social | Example |
|---|---|---|
utm_source |
The network where the link is posted | linkedin |
utm_medium |
The type of channel: social for organic, a paid medium for ads |
social |
utm_campaign |
The launch, promotion or content series | q4-webinar |
utm_content |
Which post or creative, when one campaign has several | carousel-1 |
utm_term |
Paid keyword; rarely useful on organic social | |
utm_id |
Campaign ID, if you import campaign data into GA4 | wb-2026-q4 |
Google's help page is direct about the first three: "you should always use utm_source, utm_medium, and utm_campaign". Two newer ones, utm_creative_format and utm_marketing_tactic, are listed on the same page as not currently reported in Google Analytics, so skip them.
Source is the place, medium is the type
The most common mistake is putting the network in the medium (utm_medium=linkedin) or writing a different medium for every network. GA4 sorts each visit into a channel using these two values, and the rules are fixed:
- Organic Social: the source is on Google's list of social sites, or the medium is one of
social,social-network,social-media,sm,social networkorsocial media. - Paid Social: the source is on the list of social sites and the medium matches
cpc,ppc,retargeting, or anything containingcpor starting withpaid.
So a boosted LinkedIn post tagged utm_source=linkedin&utm_medium=paid-social lands in Paid Social, and the same link tagged utm_medium=social lands in Organic Social, which inflates your organic results with ad clicks. Pick one organic medium (social) and one paid medium (paid-social or cpc) and write them down.
GA4's channel rules are not case-sensitive, but the values in your reports are. That is the next trap.
A naming convention your team will actually keep
Google's help page says it plainly: "Parameter values are case sensitive, e.g. utm_source=google is different from utm_source=Google." One teammate types LinkedIn, another linkedin, and your report shows two sources that you have to add up by hand every month. Spaces cause the same split (Q4 Webinar and q4-webinar), and they turn into %20 in the link.
A convention that survives a busy team:
- Lower case only, in every value.
- Dashes between words, never spaces, and never dashes in one link and underscores in the next. (Google's own examples use
spring_sale; either works, mixing them does not.) - Fixed source names, one per network:
linkedin,facebook,instagram,x,threads,bluesky,mastodon,tiktok,youtube,pinterest. Nottwitterthis month andxthe next. - Two mediums:
socialfor organic posts, one paid medium for ads.emailfor newsletters. - Campaign names that outlive the post: name the launch or series (
q4-webinar,pricing-update), not the date you posted it. utm_contentfor the variant:video,carousel-1,thread-end. This is how you compare two posts that promote the same thing on the same network.
The UTM builder has one-click presets for exactly those ten networks (each fills the source and social as the medium) plus newsletter / email. It flags capital letters, spaces and mixed - and _ in any value, and its Normalise button lower-cases values and turns spaces into dashes. You can save up to 20 combinations as presets in your browser, so next week's link uses the same spelling as this week's.
One link per network, not one link for every network
If the same link goes to LinkedIn, X and Facebook, every visit gets the same source, and you can no longer see which network worked. Build one tagged link per network, all with the same campaign:
https://example.com/webinar?utm_source=linkedin&utm_medium=social&utm_campaign=q4-webinar
https://example.com/webinar?utm_source=x&utm_medium=social&utm_campaign=q4-webinar
https://example.com/webinar?utm_source=facebook&utm_medium=social&utm_campaign=q4-webinar
The builder keeps any query string and #anchor already in your link. It adds the UTM tags after the existing parameters and leaves the anchor at the very end. If the link already carries a UTM key, the new value replaces it instead of adding a duplicate.
Only tag links that leave your site. Social posts, bios, newsletters and ads, yes. Links between pages of your own website, no: the tags on an internal link overwrite where the visitor really came from.
Does a long tagged link hurt the post?
On X it costs nothing: X counts every link as 23 characters, whatever its real length, so a tagged URL takes the same room as a bare one (check yours in the character counter). On networks that print the full URL in the text, a long tag string looks noisy, which is one more reason to keep values short (q4-webinar, not q4-2026-product-webinar-registration-push).
Put each network's link in its own version in PostBoost
PostBoost does not add UTM tags to your links for you, and that is deliberate: the tags are your naming convention, not ours. What PostBoost gives you is a version of the post per account, so each network can carry its own link.
In the composer:
- Write the post once in the original version, with the LinkedIn link (or whichever network most of the accounts are).
- Click the + (Create version) next to the version tabs above the editor and pick the account under Create version for, for example your X account.
- In that version, replace the link with the X-tagged link. Repeat for each network that needs its own link.
- Schedule as usual. Each account publishes its own version.
Through the API: send one version per account in versions. The original (account_id: 0) holds the default text; every other version names an account ID from GET /{workspaceUuid}/accounts:
{
"accounts": [12, 15],
"versions": [
{
"account_id": 0,
"is_original": true,
"content": [{ "body": "Our Q4 webinar on scheduling for agencies is open: https://example.com/webinar?utm_source=linkedin&utm_medium=social&utm_campaign=q4-webinar" }]
},
{
"account_id": 15,
"is_original": false,
"content": [{ "body": "Q4 webinar, open now: https://example.com/webinar?utm_source=x&utm_medium=social&utm_campaign=q4-webinar" }]
}
]
}
Here account 12 (LinkedIn) uses the original and account 15 (X) uses its own version. Add schedule, date, time and timezone as in the createPost reference to schedule it instead of saving a draft.
Build the links from code or an AI assistant
The UTM builder is also an API endpoint, and it needs no account or token:
curl -X POST https://postboost.co/app/api/tools/utm-builder \
-H "Content-Type: application/json" \
-d '{"url":"https://example.com/webinar","utm_source":"LinkedIn","utm_medium":"social","utm_campaign":"q4 webinar"}'
It returns the tagged url and a warnings list, here one warning for the capital letters in utm_source and one for the space in utm_campaign, so a script can refuse a link that breaks your convention before it is ever posted. See the buildUtmUrl reference for every field. If you connect an AI assistant to PostBoost's spec-based MCP server at /mcp/postboost (see MCP servers), the same logic is available to it as the buildUtmUrl tool, so you can ask it to tag each network's link while it drafts the post.
Where the tagged visits show up in GA4
In Google Analytics 4, open Reports → Acquisition → Traffic acquisition. The default table groups sessions by channel, so your tagged social links appear under Organic Social or Paid Social. Change the primary dimension to Session source / medium to see linkedin / social and x / social as separate rows, or to Session campaign to compare campaigns across networks. If you see LinkedIn / social and linkedin / social as two rows, the naming convention slipped somewhere: find the link and fix it before the next post.
Once the numbers are in, put them next to each other: the engagement rate calculator covers what happened on the network, and the UTM-tagged sessions cover what happened after the click.
Checklist before you post
- Source, medium and campaign set on every link that leaves your site.
- Lower case, dashes, no spaces, one spelling per network.
socialfor organic, a paid medium for boosted posts and ads.- One link per network, each in its own version of the post.
utm_contentadded when one campaign has more than one post on the same network.- No tags on links between pages of your own website.
Build the links in the free UTM builder, then schedule the post with one version per network in PostBoost.
Do this in PostBoost
Free tools for this guide
Free tool
UTM builder for social media links
Build UTM-tagged links for social posts in your browser: network presets, live preview, naming warnings and saved presets. Free, no signup.
Free tool
Social media character counter
Free character counter for X, Threads, Bluesky, Instagram, LinkedIn, TikTok and more. Counts as each network does, live in your browser.
Free tool
Engagement rate calculator for Instagram, TikTok and LinkedIn
Calculate engagement rate by followers, reach or impressions, for one post or several. See the formula with your own numbers. Free, in your browser.
FAQ
What UTM parameters should I use for social media?
Always set utm_source, utm_medium and utm_campaign; Google Analytics says to use those three on every tagged link. For an organic post use the network as the source (linkedin, instagram, x) and social as the medium. Add utm_content when you need to tell two posts of the same campaign apart.
What should utm_medium be for organic social posts?
Use social. GA4 puts a visit in its Organic Social channel when the source is a known social site or the medium is one of social, social-network, social-media, sm, social network or social media. Pick one of those and never change it.
What utm_medium should I use for paid social ads?
A paid medium such as cpc, paid-social or ppc. GA4 counts a visit as Paid Social when the source is a social site and the medium matches cpc, ppc, retargeting or anything starting with paid. If ads use social as the medium, paid clicks land in Organic Social.
Are UTM parameters case-sensitive?
Yes, the values are. Google's own help page says utm_source=google is different from utm_source=Google, so the same network spelled two ways splits into two rows in your reports. Write every value in lower case.
Do UTM tags make my post longer on X?
Not on X. X counts every link as 23 characters, however long the URL is, so a tagged link costs the same as a bare one. On networks that show the full URL, a long tagged link still looks untidy, so keep values short.
Does PostBoost add UTM tags automatically?
No. Build the tagged links with the free UTM builder, or call it from code without an account, then paste each network's link into that network's version of the post in the composer.