Workflow guide · automate UTM creation

Automate UTM creation without automating away naming control

A Sheets workflow only helps when it generates URLs from approved values, preserves the destination cleanly, and hands every batch into QA before anything goes live.

Use this page to build a governed creation layer for bulk campaign URLs: approved dictionaries, protected formulas, clear request inputs, safe output rows, and a release workflow that stops bad batches before they spread into platforms, briefs, and spreadsheets.

By Dean DownesLast updated 28 Mar 2026Part of the Shortlinkfix 5-Layer UTM Governance Model
Approved values only

The creation layer should build from dictionaries, dropdowns, and protected fields. If the sheet lets anybody invent a source or campaign structure on the fly, it is not governed automation.

Preserve the destination first

A safe sheet keeps the landing URL intact, detects whether ? or & is needed, and appends tracking without mangling existing parameters.

Creation is not release

Generating the URL is only one control layer. QA, redirect validation, owner assignment, and publish logging still have to happen before the batch goes live.

Control rule

The creation layer should standardise assembly, not replace governance

Use Sheets to automate repeatable assembly work. Do not use Sheets as an excuse to skip taxonomy, naming rules, approval, or the pre-publish gate.

Turn approved values into final URLs

The sheet should assemble utm_source, utm_medium, utm_campaign, and optional fields from controlled inputs into a publish-safe URL.

Keep the destination intact

The landing URL remains the source of truth. The build layer should preserve existing parameters, then append tracking correctly.

Expose missing data early

A good sheet makes missing owners, blank campaigns, and unapproved values obvious. It does not hide them behind formulas that still output a link.

Hand the batch forward

The output row should move into QA, redirect validation, and the campaign log before any platform receives the URL.

The key point: automate formatting and assembly; keep naming control, exceptions, and release decisions governed by real humans.

What the creation layer should actually produce

A governed build sheet should answer four questions on every row before the URL reaches an ad platform, email tool, creator brief, or campaign document.

What destination are we sending people to?

The sheet starts with the clean landing URL, not a copied publish URL from some old batch.

Which approved values describe this traffic?

Source, medium, campaign, and optional content/term must come from the controlled dictionary layer.

Who owns the row and its state?

Owner, status, and notes should travel with the row so the batch can be reviewed and logged cleanly later.

What publish URL is safe to test?

The output must be ready for QA and route validation, not just technically concatenated.

If the sheet cannot answer those four questions, it is not automating UTM creation. It is just mass-producing query strings.

The safest Google Sheets architecture

Keep the workbook boring. Boring is what scales. Most teams break this by turning one tab into a chaotic mix of dictionaries, formulas, notes, and publish history.

Tab 1: Dictionaries

Approved values for source, medium, campaign type, region, funnel stage, or offer family. If a value is not approved here, it should not appear in the build tab.

Tab 2: Requests / inputs

Capture the clean landing URL, approved field values, owner, placement, launch date, and any note needed for QA or routing.

Tab 3: Output

Hold the generated URL, QA status, redirect-test result, final URL, and approval state. Protect formula columns so nobody casually overwrites them.

ColumnPurposeShould users edit it?
Landing URLClean destination before UTMs are addedYes
Approved fieldsDropdown-controlled source, medium, campaign and optional content/termYes
Publish URLFormula-built final URLNo
QA statusPASS / WARN / FAIL from validationYes, after QA
Final URLPost-redirect landing URLYes, after testing
Owner / statusAccountability and release stateYes

What to automate vs what must stay human-controlled

The sheet should automate repetitive assembly work. It should never silently approve bad rows or invent taxonomy on the fly.

Safe to automate

  • lowercasing and replacing spaces
  • adding the right ? or & when parameters already exist
  • building publish URLs in bulk
  • status reminders and review dates
  • exporting a batch for QA

Keep human-controlled

  • approval of new sources, mediums, or campaign structures
  • exception handling for legacy routes or one-off placements
  • the final decision to release the batch
  • live-owner assignment and incident notes
  • sign-off on revenue-critical or multi-channel launches
Simple rule: automate formatting and assembly, not judgment and governance.

Formula guardrails that stop broken batches

Good formulas are boring too. They normalise inputs, preserve the destination, and expose obvious blanks instead of hiding them.

Normalise a value

=LOWER(REGEXREPLACE(TRIM(A2),"\s+","_"))

Trim whitespace, lower-case the value, and convert runs of spaces into underscores before the output row is generated.

Append parameters safely

=A2 & IF(ISNUMBER(SEARCH("?",A2)),"&","?") & "utm_source=" & ENCODEURL(B2)

Preserve existing query parameters first, then append tracking. Never rebuild the landing URL by hand in the output column.

ScenarioCorrect behaviourWhy it matters
https://example.com/pricingOutput begins with ?utm_source=No existing parameters, so the first separator must be ?.
https://example.com/pricing?plan=proOutput begins with &utm_source=Existing parameters survive cleanly instead of being overwritten.
Blank campaign fieldNo publish URL or hard failThe formula should expose missing governance, not quietly create a bad link.

Worked example: one row from request to publish

A governed creation layer is not just formulas. It is a visible handoff from approved inputs into a release decision.

1. Request / input

Landing URL = https://brand.com/spring-sale
utm_source = newsletter
utm_medium = email
utm_campaign = spring_sale_launch
utm_content = hero_cta

2. Output / build

https://brand.com/spring-sale?utm_source=newsletter&utm_medium=email&utm_campaign=spring_sale_launch&utm_content=hero_cta

3. QA

Status becomes PASS only after required fields, casing, separators, duplicate conflicts, and parameter survival are checked.

4. Publish

Status becomes live only after the tested URL, owner, and launch record are logged into the campaign sheet.

The batch workflow standard

Creation is one layer in a governed release flow. A reliable batch follows the sequence below every time.

1. Lock the dictionary

Approved values and the naming contract are set before rows are requested.

2. Generate from controlled inputs

The sheet creates output rows from dropdown-backed values and protected formulas only.

3. Run QA

Use the UTM QA Checker to catch missing fields, drift, and formatting errors.

4. Validate redirects

Test parameter survival on any shortener, affiliate, or bio route before release.

5. Log the approved URL

Record publish URL, final URL, owner, and status before anything goes live.

6. Release the batch

Only then should the URLs be copied into platforms, briefs, send tools, or media plans.

What should hard-block a generated batch

Creation is not successful just because the spreadsheet produced a URL. The rows below should stop the batch from leaving the sheet.

Blank or placeholder campaign names

No batch should leave the sheet with test, launch, or empty campaign names pretending to be good enough.

Unapproved values

If the source or medium is not in the dictionary, the row should fail until someone updates governance deliberately.

Casing or separator drift

Mixed case, spaces, or illegal separators should be fixed or blocked before output is released.

Duplicate placements with conflicting labels

Two rows aimed at the same placement with different campaign logic is a release problem, not a harmless spreadsheet detail.

Broken destination URLs

If the landing page already contains conflicting parameters or routing issues, the creation layer should stop and hand the row into repair.

No owner or no status

Rows without accountability or release state should never be treated as ready to publish.

How to roll this out if you do not have a process yet

The safest rollout is not the fanciest one. Start with one sheet, one owner, and one approved dictionary, then add layers deliberately.

Start with one creation sheet

Do not build a giant master tracker first. Start with one governed creation layer that actually gets used.

Add dropdown validation before clever formulas

Controlled input is more valuable than complicated concatenation logic if the taxonomy is still unstable.

Require QA on every batch

Make the QA handoff mandatory before anyone copies URLs into a platform.

Then connect the wider stack

Once the creation layer is stable, connect it to Bulk UTMs, the campaign log, and automation reminders.

Next step

Build the creation layer properly, then connect the full stack

The point of automation is not to create more URLs. It is to create fewer bad ones. Lock the dictionary, generate from controlled inputs, hand the batch into QA, then log what actually goes live.

FAQs

Common questions about governed UTM creation workflows.

Can Google Sheets automate UTM creation safely?

Yes, if the sheet only generates URLs from approved values, protected formulas, and a clear QA handoff. It becomes risky when people can type anything into source, medium, or campaign fields without validation.

What should stay human-controlled in a bulk UTM sheet?

Taxonomy ownership, approval of new values, exception handling, and the final decision to publish should stay human-controlled. Sheets should automate assembly, not governance.

What is the next step after a sheet generates campaign URLs?

Run the batch through the UTM QA Checker, verify any redirect layers, then log the approved publish URL, final URL, owner, and status before anything goes live.

What is the difference between automating UTM creation and automating UTM QA?

Creation assembles the URL from approved inputs. QA checks that the generated URLs are complete, compliant, and safe to release. Treat them as separate control layers.

Should a sheet generate links for every request automatically?

Only if the request uses approved values and belongs to a governed release flow. If the row is still waiting on owner, campaign logic, or destination fixes, the output should stay blocked.