# UTM Parameters for Social Media: A Naming Convention That Lasts

Published: 2026-10-15

**Key takeaways:** Tag every link you share on social with utm_source (the network), utm_medium (social, or a paid medium for ads) and utm_campaign. Write values in lower case with dashes, because GA4 treats LinkedIn and linkedin as two sources. Give each network its own link and use utm_content to tell posts apart.

**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](/tools/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:

```text
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 network` or `social media`.
- **Paid Social:** the source is on the list of social sites **and** the medium matches `cpc`, `ppc`, `retargeting`, or anything containing `cp` or starting with `paid`.

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:

1. **Lower case only**, in every value.
2. **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.)
3. **Fixed source names**, one per network: `linkedin`, `facebook`, `instagram`, `x`, `threads`, `bluesky`, `mastodon`, `tiktok`, `youtube`, `pinterest`. Not `twitter` this month and `x` the next.
4. **Two mediums**: `social` for organic posts, one paid medium for ads. `email` for newsletters.
5. **Campaign names that outlive the post**: name the launch or series (`q4-webinar`, `pricing-update`), not the date you posted it.
6. **`utm_content` for 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](/tools/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:

```text
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](/tools/social-media-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:**

1. Write the post once in the original version, with the LinkedIn link (or whichever network most of the accounts are).
2. 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.
3. In that version, replace the link with the X-tagged link. Repeat for each network that needs its own link.
4. 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`:

```json
{
  "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](/docs/api/postboost-api) 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:

```bash
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](/docs/api/build-utm-url) for every field. If you connect an AI assistant to PostBoost's spec-based MCP server at `/mcp/postboost` (see [MCP servers](/docs/mcp)), 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](/tools/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.
- `social` for organic, a paid medium for boosted posts and ads.
- One link per network, each in its own version of the post.
- `utm_content` added 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](/tools/utm-builder), then schedule the post with one version per network in [PostBoost](/app/register).

## Do this in PostBoost

- [Analytics](https://postboost.co/features/analytics): Account and post analytics for your social accounts in one place, and reports you can download as CSV or a branded PDF.

## Free tools for this guide

- [UTM builder for social media links](https://postboost.co/tools/utm-builder): Build UTM-tagged links for social posts in your browser: network presets, live preview, naming warnings and saved presets. Free, no signup.
- [Social media character counter](https://postboost.co/tools/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.
- [Engagement rate calculator for Instagram, TikTok and LinkedIn](https://postboost.co/tools/engagement-rate-calculator): 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.

## Sources

- [Google Analytics Help: collect campaign data with custom URLs](https://support.google.com/analytics/answer/10917952)
- [Google Analytics Help: default channel group](https://support.google.com/analytics/answer/9756891)
- [Google Analytics Help: Traffic acquisition report](https://support.google.com/analytics/answer/12923437)
- [X developer docs: counting characters](https://docs.x.com/resources/fundamentals/counting-characters)
- [PostBoost API reference: buildUtmUrl](https://postboost.co/docs/api/build-utm-url)
- [PostBoost docs: MCP servers](https://postboost.co/docs/mcp)

Canonical: https://postboost.co/learn/utm-parameters-for-social-media
