MarketingRuns locally

UTM Campaign URL Builder

Create a campaign URL without visiting the destination. Add standard UTM values, review existing parameters and copy a properly encoded link.

01

Build your campaign URL

Required fields are marked. Foxger will not open the destination.

Waiting for campaign details

Enter a complete http:// or https:// URL. Existing query parameters and fragments are preserved.

03Required campaign fields

Identifies where the visit comes from, such as newsletter.

Describes the channel, such as email.

Names the initiative, such as summer_launch.

04Optional details

Distinguishes a keyword or audience, such as travel_tools.

Differentiates a link or creative, such as header_button.

When enabled, trims surrounding whitespace, changes spaces to underscores, converts letters to lowercase, collapses repeated underscores and keeps only letters, numbers, hyphens and underscores. Disabled by default.

05

Generated URL

0 characters

Review the complete URL before using it in a campaign. Foxger does not test or visit it.

Beginner path

Build the first link before learning every URL detail

Start with source, medium and campaign. The guide then adds optional fields, existing query parameters, replacement warnings, normalization and practical result checks one at a time.

New to UTM links? Read the step-by-step beginner guide
Step-by-step beginner guide

Turn one newsletter link into a readable campaign URL

Start with an ordinary destination. Add three labels that say where the link appears, what kind of channel it uses, and which campaign it belongs to. Optional fields and URL details can wait until that first result makes sense.

Learning path: destination → three labels → generated URL → careful review → ready to copy

Back to the UTM Builder
Beginner guide contents
See the change first

UTM links in one minute

A newsletter needs to link to this resource page:

Normal link

https://example.com/resources

It identifies the destination, but it carries no campaign labels.

Campaign link

https://example.com/resources?utm_source=newsletter&utm_medium=email&utm_campaign=summer_launch

The destination is the same. Three query parameters now describe the campaign.

utm_source=newsletterutm_medium=emailutm_campaign=summer_launch

A UTM link is a destination URL with campaign labels added as query parameters. An analytics system may use those labels to describe where a visit came from when that system is installed and configured to read them. Foxger builds the URL; it does not track the visit.

UTM is the inherited name for this family of campaign fields. You do not need the term’s history to use the link: the practical job is to give each field a clear, consistent value.

Get one useful result

Build the first campaign URL

Use only the destination and three required campaign fields for the first pass.

Destination URL
https://example.com/resources
Campaign source
newsletter
Campaign medium
email
Campaign name
summer_launch

Leave Term and Content empty. Keep Normalize campaign values off, which is the default. Select Generate URL. The live page may also create the result as soon as all required inputs become valid; the button deliberately checks every required field and focuses the first problem when something is missing.

https://example.com/resources?utm_source=newsletter&utm_medium=email&utm_campaign=summer_launch

Success means Foxger parsed an HTTP or HTTPS destination and built a URL containing the required values. It does not mean the page exists or that an analytics system is working.

Three fields, three questions

What source, medium, and campaign mean

Foxger requires all three. The names you choose are editorial decisions, so use words your team can recognise and repeat.

utm_source

Source: where did this link come from?

In the example, newsletter identifies the publication carrying the link.

Other possible team labels include google, facebook, or partner_site.

utm_medium

Medium: what kind of channel is this?

email describes the newsletter’s channel rather than its individual name.

Teams may use values such as social, cpc, or referral, subject to their analytics rules.

utm_campaign

Campaign: which promotion does it belong to?

summer_launch joins this link to the same named campaign.

A future initiative might use august_newsletter or product_release.

Source and medium are easy to swap. Ask the questions aloud: the link came from thenewsletter; it travelled through the email channel. The campaign label then identifies the shared promotion.

Read one piece at a time

What changed in the generated URL?

The result can be separated into familiar pieces without learning full URL grammar.

Destination
https://example.com/resources
?
Starts the query string because the normal link had no query.
First pair
utm_source=newsletter
&
Separates one parameter pair from the next.
Second pair
utm_medium=email
&
Creates another separation, not a new destination.
Third pair
utm_campaign=summer_launch

Each pair has a parameter name on the left and its value on the right. If a URL already has a query, Foxger adds new pairs with & instead of introducing a second?. A fragment beginning with # stays at the end; you will see that after the core flow.

Action, reason, check

Build and review the link step by step

These nine steps move from an ordinary destination to a checked result without introducing optional fields too early.

  1. Copy the destination URL

    Action: Enter https://example.com/resources in Destination URL.

    Reason: This is the page the campaign link should still open.

    Check: The value begins with https:// and contains no campaign parameters yet.

  2. Name where the link appears

    Action: Enter newsletter for Campaign source.

    Reason: Source answers where this particular link came from.

    Check: The source describes the newsletter, not the kind of channel.

  3. Name the channel

    Action: Enter email for Campaign medium.

    Reason: Medium groups the link with other email activity when the analytics setup uses it that way.

    Check: Source and medium now answer different questions: where and what kind.

  4. Identify the promotion

    Action: Enter summer_launch for Campaign name.

    Reason: A stable name lets related links carry the same campaign label.

    Check: The name is short, meaningful, and follows one spelling style.

  5. Leave advanced fields alone for now

    Action: Keep Term and Content empty, and leave normalization off.

    Reason: The three required campaign values are enough for the first successful result in this tool.

    Check: No optional value or automatic naming change has been introduced.

  6. Generate the URL

    Action: Select Generate URL after the four required inputs are present.

    Reason: The button validates the destination and required campaign fields together.

    Check: The status says the campaign URL is valid and the output is no longer empty.

  7. Read the three labels

    Action: Find utm_source, utm_medium, and utm_campaign in the generated result.

    Reason: Reading the output once makes it easier to catch swapped or misspelled values.

    Check: The decoded values are newsletter, email, and summer_launch.

  8. Review any warning

    Action: If Foxger reports existing UTM parameters, compare the old destination with the new result.

    Reason: A warning means generation can continue, but standard campaign values will be replaced.

    Check: Each exact lowercase standard UTM name appears no more than once in the result.

  9. Copy, then check the real destination separately

    Action: Select Copy, paste the full result where you need it, and test the destination in a suitable browser context.

    Reason: Foxger builds the string but deliberately does not visit the page or test the analytics setup.

    Check: You copied the whole URL and know which checks still happen outside Foxger.

What the four actions do

Generate URL
Checks every required field, creates the current result, and focuses the first error when correction is needed.
Load example
Fills all five campaign fields plus a destination query and fragment, leaves normalization off, and generates immediately.
Clear
Empties the fields and output, turns normalization off, removes feedback, and returns focus to Destination URL.
Copy
Copies only the current generated output. If clipboard access fails, Foxger focuses and selects the URL for manual copying.

Once a valid result exists, edits generate a fresh result as the fields change. An edit that makes the input invalid clears the old output, so Copy cannot silently use a stale campaign URL. There is no Download action.

Add detail only when it answers a question

When term and content are useful

The basic campaign works without either optional field. Add one only when its distinction will be meaningful in your reporting setup.

utm_term

Term

Historically and commonly associated with a paid-search keyword. Some teams use it for a targeting detail when their analytics design supports that meaning. The Load Example uses travel_tools.

utm_content

Content

Useful for distinguishing two links or creative placements in the same campaign. For example, header_button and footer_link can identify separate newsletter positions.

The live Load example adds both optional values to the same campaign and layers in an existing category query plus the #overview fragment:

Destination
https://example.com/resources?category=tools#overview
Source
newsletter
Medium
email
Campaign
summer_launch
Term
travel_tools
Content
header_button
https://example.com/resources?category=tools&utm_source=newsletter&utm_medium=email&utm_campaign=summer_launch&utm_term=travel_tools&utm_content=header_button#overview

Leave an optional field blank and Foxger omits it. If the destination already contains the matching optional standard UTM parameter, a blank new field removes that old value instead of carrying it forward silently.

Keep unrelated URL details

What happens to an existing query parameter?

Suppose the resource page already uses category=tools:

https://example.com/resources?category=tools

Foxger adds the three campaign pairs after it:

https://example.com/resources?category=tools&utm_source=newsletter&utm_medium=email&utm_campaign=summer_launch

The unrelated category=tools pair remains. The implementation also leaves repeated unrelated name/value entries in place. Query parameters do not automatically mean analytics; a site can use them for filters, language choices, search, or other features.

Why can the query text look slightly different?

Foxger uses the browser’s URL and URLSearchParams APIs. Updating parameters can reserialize an existing query—for example, an encoded space can appear as+. The decoded name and value can remain the same even when their encoded spelling changes.

Foxger does not sort the full query. Existing entries retain native query order; a replaced standard UTM name keeps its first position while duplicates are removed, and missing UTM names are added in source, medium, campaign, term, and content order as applicable. Do not use parameter order as campaign meaning.

A warning asks for review

Existing standard UTM values are replaced, not duplicated

This destination already contains an old source and term:

https://example.com/resources?category=tools&utm_source=old&utm_term=stale#overview

Enter the core campaign, leave Term blank, and use header_button for Content. The generated result is:

https://example.com/resources?category=tools&utm_source=newsletter&utm_medium=email&utm_campaign=summer_launch&utm_content=header_button#overview
  • utm_source=old became utm_source=newsletter.
  • All duplicate exact lowercase utm_source entries would become one.
  • The old utm_term=stale disappeared because the new Term field was blank.
  • utm_content=header_button was added.
  • category=tools and #overview remained.
Keep # sections at the end

A fragment remains after the generated query

The destination can point to a section within the page:

https://example.com/resources#overview

After generation, the fragment still follows every query parameter:

https://example.com/resources?utm_source=newsletter&utm_medium=email&utm_campaign=summer_launch#overview

Foxger preserves the fragment string. It does not visit the destination or confirm that an element called overview exists.

Convention, not a universal law

Choose campaign names people can repeat

Useful naming is less about finding one perfect style and more about avoiding accidental variations. A short written convention can keep one campaign from becoming several differently spelled labels.

Foxger requirements

  • Destination must be a valid absolute HTTP or HTTPS URL.
  • Source, medium, and campaign must contain something besides whitespace.
  • With normalization on, required values must leave at least one letter, number, hyphen, or underscore.

Practical recommendations

  • Use names everyone on the team understands.
  • Avoid random variations such as Email, email, and EMAIL.
  • Choose hyphens, underscores, or another accepted style deliberately and keep it consistent.
  • Prefer meaningful campaign names over long descriptions or keyword stuffing.

Lowercase and underscores can be a useful team choice, but Foxger does not claim they are mandatory or that every analytics platform groups values identically. Check the system that will read the link before adopting platform-specific rules.

An optional naming transformation

What “Normalize campaign values” changes

Normalization is disabled by default because you may already have a naming system. When it is off, Foxger keeps each campaign field value unchanged and lets URL generation encode it safely. It still rejects a required value containing only whitespace.

BeforeSummer Launch 2026
With normalization onsummer_launch_2026

When the option is on, Foxger applies the same sequence to source, medium, campaign, term, and content:

  1. normalise Unicode text to NFC;
  2. trim surrounding whitespace;
  3. convert letters to lowercase;
  4. turn one or more whitespace characters into an underscore;
  5. remove characters other than Unicode letters, Unicode numbers, hyphens, and underscores;
  6. collapse repeated underscores.

Unicode letters and numbers remain, so Café 東京 2026! becomescafé_東京_2026. Hyphens are retained and are not collapsed by this option.

What if normalization removes the whole value?

A required value such as !!! becomes empty and produces a field-specific error. A non-empty optional term or content value that becomes empty is omitted. Foxger does not silently build a required campaign field with no usable characters.

Enter readable values, let the browser encode them

Why spaces, ampersands, and accents look different

Keep normalization off and enter News & Events as Source andCafé Launch as Campaign. The generated URL is:

https://example.com/resources?utm_source=News+%26+Events&utm_medium=email&utm_campaign=Caf%C3%A9+Launch
+
Represents a space in the query serialization used here.
%26
Keeps the ampersand inside one value instead of starting another parameter.
%C3%A9
Represents the UTF-8 bytes for the accented é in this URL.

The encoded text looks different, but a URL-aware browser or server can interpret the decoded values. Enter normal text in Foxger. Manually typing encoded sequences first can encode the percent sign again and produce the wrong value.

A label is not a reporting system

How UTM parameters relate to analytics platforms

UTM parameters are visible name/value labels in a URL. A compatible analytics platform may read them after someone follows the link, but only if that platform is installed and configured for the destination.

Google Analytics documents source, medium, campaign, term, and content among its campaign parameters. Other products can support different names, group values differently, or apply different case rules. Foxger therefore builds the five fields it exposes without claiming that every platform will report them in the same way.

Know what still needs another check

What Foxger does not do

  • It does not visit or fetch the destination URL.
  • It does not verify that the page exists or returns HTTP 200.
  • It does not follow or check redirects.
  • It does not check malware, reputation, or link safety.
  • It does not install analytics on the destination.
  • It does not send campaign data to Google Analytics or another analytics API.
  • It does not prove how a tracking platform will classify the campaign.
  • It does not shorten the generated URL or offer a Download action.
  • It does not store campaign values in Foxger cookies, local storage, session storage, IndexedDB, or the Foxger page URL.

The workspace has no form submission and calls no campaign backend or external API. Values stay in page memory while the browser script validates, generates, counts, clears, or copies them. Copy writes the result to your device clipboard only after you select it.

Loading Foxger still creates ordinary page and asset requests that hosting and security systems may log. The UTM tool does not add your destination or campaign fields to those requests. The unrelated Light/Dark/System preference may be stored locally when you change the site theme; it is not campaign data. See the Privacy page for the site-wide distinction.

Mistake, result, correction

Common UTM link mistakes

Most useful corrections come from clarifying the label or reviewing what Foxger cannot check.

  • Putting the whole campaign description in every field

    Result: Source, medium, and campaign stop answering distinct reporting questions.

    Correction: Use source for where, medium for channel type, and campaign for the promotion.

  • Swapping source and medium

    Result: A value such as email may appear where a newsletter or platform name was expected.

    Correction: Ask “where did it come from?” for source and “what kind of channel?” for medium.

  • Changing capitalization between otherwise matching links

    Result: Some reporting systems can separate Email, email, and EMAIL.

    Correction: Choose one team convention and apply it consistently.

  • Switching between spaces, hyphens, and underscores without a plan

    Result: One promotion can be split across several labels in reports.

    Correction: Pick a readable style your team can repeat; no one separator is universally required.

  • Adding term and content without a purpose

    Result: The URL becomes longer without answering a useful campaign question.

    Correction: Leave optional fields empty until they distinguish a keyword, audience, link, or creative you intend to compare.

  • Entering example.com without a protocol

    Result: Foxger cannot accept it as a complete destination URL.

    Correction: Begin the destination with http:// or https://.

  • Assuming Foxger checks whether the page exists

    Result: A structurally valid generated URL may still lead to a missing page or redirect.

    Correction: Test availability and redirects separately.

  • Ignoring an existing UTM warning

    Result: Old exact lowercase standard UTM values are replaced, and blank optional fields remove old term or content values.

    Correction: Review the destination and generated result before copying.

  • Manually adding ?utm_ values before using the builder

    Result: Foxger must replace those standard values, which can make the intended source unclear.

    Correction: Start from the clean destination when possible and let the builder add the campaign fields.

  • Thinking UTM parameters collect or hide information by themselves

    Result: The destination and labels remain visible in the URL, while no analytics appears unless another configured system reads them.

    Correction: Treat them as visible labels, not analytics software or a privacy layer.

Start with what you can see

Troubleshooting the UTM Builder

Foxger says my destination URL is invalid
Likely reason
The destination is empty, malformed, missing a scheme, or uses a scheme other than HTTP or HTTPS.
Quick check
Look at the field message and confirm the complete value begins with http:// or https://.
Next action
Copy the full address from the destination page and generate again.
Foxger limit
Foxger checks URL structure only; it does not confirm that the address exists.
I entered example.com but it does not work
Likely reason
example.com has no protocol, so it is not the absolute URL this tool requires.
Quick check
Look for http:// or https:// at the beginning.
Next action
Use https://example.com when HTTPS is the real destination.
Foxger limit
Foxger does not guess which protocol the site supports.
My old query parameter disappeared
Likely reason
Unrelated entries should remain, but it may have been omitted from the pasted destination or confused with a standard UTM name.
Quick check
Compare the text before the fragment in both destination and output, and read decoded name/value pairs rather than encoding alone.
Next action
Restore a genuinely missing unrelated parameter in Destination URL, then generate again.
Foxger limit
Foxger cannot recover information that was not present in the destination you entered.
My existing UTM value changed
Likely reason
The builder intentionally replaces exact lowercase utm_source, utm_medium, utm_campaign, utm_term, and utm_content entries.
Quick check
Read the warning to see which standard names were found.
Next action
Confirm the new field values, or return to a clean destination if the old campaign must remain separate.
Foxger limit
Differently cased names such as UTM_SOURCE are not detected or normalized.
I see +, %20, %26, or other encoded characters
Likely reason
URLs represent spaces and reserved or non-ASCII characters with an encoded form; Foxger’s new query values use URLSearchParams serialization.
Quick check
For example, + can represent a space in the query and %26 represents an ampersand inside one value.
Next action
Read the decoded value in a URL-aware tool if needed; do not pre-encode the field before entering it.
Foxger limit
Foxger does not control how another program chooses to display equivalent URL encoding.
My #section moved
Likely reason
The fragment must remain after the query string, so the generated UTM parameters appear before #section.
Quick check
Confirm the same fragment text still appears at the very end.
Next action
Use the generated order; do not move the query parameters after the fragment.
Foxger limit
Foxger preserves the fragment text but does not test whether that section exists on the page.
My analytics platform is not showing the campaign
Likely reason
The platform may be missing, misconfigured, delayed, blocked, or using different campaign rules.
Quick check
Confirm the complete link was used and inspect the platform’s own installation and reporting documentation.
Next action
Test with that platform’s approved debugging process or ask the person who manages the analytics setup.
Foxger limit
Foxger neither sends data to the platform nor reads its reports.
My source and medium are grouped differently than expected
Likely reason
Channel grouping depends on the analytics product, configuration, and exact values it receives.
Quick check
Compare spelling and capitalization with that platform’s documented or team-approved values.
Next action
Adjust the naming convention for future links only after confirming the reporting rule.
Foxger limit
A valid URL cannot prove how an external platform will classify it.
My generated URL is very long
Likely reason
The destination, existing query entries, and every non-empty campaign value all add characters.
Quick check
Look for optional term/content values or repeated descriptive wording that adds no reporting value.
Next action
Remove unnecessary optional detail, while keeping labels meaningful and the destination intact.
Foxger limit
Foxger shows the character count but enforces no fixed length limit and does not shorten URLs.
Copy does not work
Likely reason
Clipboard access may be unavailable outside a supported secure browser context or may be blocked by browser permissions.
Quick check
Look for the copy announcement and see whether the generated output became selected.
Next action
Use your browser or operating system’s ordinary copy command on the selected output.
Foxger limit
Foxger cannot override clipboard security rules.
Words used in this guide

Compact UTM glossary

URL
A text address that identifies a resource and can include a scheme, host, path, query, and fragment.
Destination URL
The original HTTP or HTTPS address people should reach after following the campaign link.
Query string
The part of a URL after ? and before #, containing one or more parameter pairs.
Query parameter
A named value in the query string, such as category=tools or utm_medium=email.
UTM
The historical name now commonly used for campaign query parameters whose names begin utm_, such as utm_source. These labels do not collect data by themselves.
Source
The label answering where the campaign visit came from.
Medium
The label describing the kind of channel, such as email or social.
Campaign
The label identifying the promotion, launch, or initiative.
Term
An optional label often used for paid keyword or targeting detail, depending on the analytics setup.
Content
An optional label used to distinguish links, placements, or creative versions in the same campaign.
Fragment
The part beginning with #, often used to point to a section within a page.
URL encoding
A safe URL representation that turns spaces, reserved symbols, and non-ASCII text into forms such as + or percent sequences.
Analytics
Software that may collect and report visit information when it is installed and configured to read campaign labels.
Normalization
Foxger’s optional transformation for making campaign values follow one conservative lowercase naming pattern.
Choose three labels yourself

Practice: a school club newsletter

A school club sends its monthly email newsletter to this destination:https://example.com/clubs/science-fair

Choose a source that identifies the newsletter, a medium for the channel, and a campaign name for the monthly update. Generate the URL before opening the solution.

Show one verified solution
Source
school_newsletter
Medium
email
Campaign
monthly_update
https://example.com/clubs/science-fair?utm_source=school_newsletter&utm_medium=email&utm_campaign=monthly_update

Would you add Content? Only if the email has placements you intend to distinguish—for example, header_button and footer_button. One link needs no extra content label merely because the field exists.

Before using the result

Final campaign URL checklist

  • My destination URL is complete and correct.
  • Source answers where the link came from.
  • Medium describes the kind of channel.
  • Campaign identifies the promotion or initiative.
  • I used term or content only when it adds useful detail.
  • I reviewed any existing UTM warning.
  • My naming style is consistent with the team’s convention.
  • I copied the complete generated URL, including any fragment.
  • I know Foxger did not test the destination or analytics setup.
Back to the UTM Builder
Quick answers

UTM Builder questions

What is a UTM link?

A UTM link is a normal destination URL with campaign labels added as query parameters. A compatible analytics system may read those labels when it is installed and configured to do so.

Does Foxger visit or store my destination URL?

No. The builder parses and updates the text locally in your browser. Foxger does not fetch the destination or intentionally store the URL you enter. Normal requests for this Foxger page may still be processed in routine hosting logs.

Which fields does this UTM Builder require?

Foxger requires a complete HTTP or HTTPS destination plus campaign source, medium and name. Campaign term and content are optional. Other analytics products may support additional fields or apply different reporting rules.

What is the difference between source and medium?

Source answers where the link came from, such as a newsletter or partner site. Medium describes the kind of channel, such as email, social, cpc or referral.

Are campaign term and content required?

No. Add term only when a keyword or targeting detail is useful for your analytics setup. Add content when you need to distinguish links, placements or creative versions within the same campaign.

Will existing query parameters be preserved?

Yes. Unrelated query parameters, including repeated entries, and the URL fragment are preserved while standard UTM parameters are added or updated. Native URL serialization can change the encoded spelling without changing a decoded value.

What happens to existing UTM parameters?

Exact lowercase utm_source, utm_medium, utm_campaign, utm_term and utm_content parameters are detected. New values replace them without duplicates; an optional term or content value is removed when its new field is blank.

Is capitalization important in UTM names and values?

Foxger recognizes only the exact lowercase standard parameter names; differently cased names remain untouched. Value treatment varies by analytics platform and reporting setup, so consistent capitalization is a useful team convention.

What does normalization do?

When enabled, normalization applies NFC, trims surrounding whitespace, lowercases values, changes whitespace to underscores, removes characters other than Unicode letters, Unicode numbers, hyphens and underscores, and collapses repeated underscores. It is disabled by default.

Why are spaces and symbols encoded in the result?

The browser serializes query values safely. Spaces can appear as plus signs, an ampersand inside a value becomes %26, and non-ASCII text uses UTF-8 percent encoding. Enter readable text rather than encoding it first.

Can a UTM link keep a URL fragment?

Yes. A fragment beginning with # is preserved at the end, after the generated query parameters. Foxger does not check whether that section exists on the destination page.

Does Foxger send campaign data to Google Analytics?

No. Foxger only builds a URL string in your browser. It does not install analytics, send campaign data to Google Analytics or verify that a visit appears in a report.

Can analytics platforms treat UTM values differently?

Yes. Products and reporting configurations can differ in supported fields, capitalization, channel grouping and attribution. Check the official documentation for the platform that will read the link.

Primary references

Official URL and campaign references

These sources document the browser URL APIs behind Foxger and one analytics platform’s current campaign-parameter behavior. Platform-specific reporting rules should still be checked with the platform you use.

Optional support

Help keep Foxger useful

Foxger tools are free, private, and built without display ads. Optional support helps keep them maintained, tested, and documented.

Support Foxger