Intro
If your team is like most modern growth teams, the UTM workflow is spread across three different universes: the brief lives in Notion or Slack, the UTM template hides in some Google Sheet, and the final links get pasted into Ads Manager, email tools, or a content calendar. Every time someone asks “what’s the UTM for this?” you end up hunting between tabs—and every new hire breaks the naming convention just a little bit more.
The result is what we talk about a lot on NerdChips: messy attribution, incomplete funnels, and dark social traffic you should be able to explain. Your strategy is solid, especially if you’ve already done the foundational work in something like your UTM Tracking: Setup, Naming Conventions & QA Checklist, but the execution layer is fragile because it lives in spreadsheets nobody loves.
This post is the “hands-on” companion to that strategy. Instead of yet another UTM Google Sheet, you’ll build a UTM builder directly inside Notion—and wire it to your existing campaign briefs. The goal: when a marketer writes a brief, Notion automatically generates a clean tracking link using your naming convention. No more manual concatenation, no more guessing utm_medium, and no more “who has the latest version of the sheet?” threads.
💡 Nerd Tip: As you read, open Notion in another tab and actually create the database. It’s ten times easier to learn this if your fingers are building while your brain is reading.
🔍 Why Your UTM Workflow Belongs in Notion (Not Sheets)
Let’s start from the pain.
Right now, your process probably looks like this: a campaign idea is documented in a Notion page or Slack thread. Someone then copies the landing page URL, jumps into a Google Sheet, hunts for the right row, fills in source, medium, campaign, maybe content, then copies the final URL into Ads Manager, email, or the CMS. If there’s an error, it’s usually discovered weeks later when someone inside GA or the data warehouse notices odd fragments like utm_medium=Email and utm_medium=email being treated as separate channels.
The problem isn’t that Sheets are bad. It’s that they sit outside your natural workflow. The brief is in Notion, the execution is in ad tools, and the naming logic is in a separate document. Every extra hop introduces friction and variance. For a small team, this is a nuisance; for a scaling team, it quietly ruins your ability to trust campaign performance data.
Putting your UTM builder inside Notion, next to your campaign briefs, changes the flow completely. Now, the same database that holds your campaign idea can also hold base_url, source, medium, and your canonical campaign name. A simple formula can generate the final UTM URL automatically. When the brief is approved, the URL is already there—copy-paste straight into your channels.
This plays beautifully with the mindset from Post-Purchase Surveys + UTM Hygiene: Closing the Dark Social Gap. Surveys and qualitative feedback help close attribution gaps, but they only work if your UTM data is clean. A Notion-native builder gives you that cleanliness at the source, where campaigns are born, instead of relying on people to “remember the right sheet” under pressure.
💡 Nerd Tip: Treat “UTM generation” as part of the brief, not an afterthought. If a campaign doesn’t have a URL in Notion, it isn’t really ready to ship.
🧩 Blueprint – Building the UTM Builder Database in Notion
Now let’s design the database that will replace your UTM spreadsheet. You can tweak names, but the structure below is battle-tested and works well for small to mid-size growth teams.
Create a new database in Notion and name it something like “Campaign UTM Builder”. Then add the following properties and types:
-
Base URL – Text (or URL). This is your bare landing page, without any UTM parameters.
-
Source – Select. Think
google,meta,linkedin,newsletter,influencer,referral. -
Medium – Select. Common values:
cpc,email,social,paid_social,video. -
Campaign Name – Text. This should follow the naming rules you defined in your UTM strategy (for example,
2025_q1_brand_search,2025_launch_ai_tool). -
Content / Creative – Text. Optional but powerful for differentiating creatives, audiences, or placements.
-
Term – Text. Mostly for search campaigns if you still want to track keyword themes.
-
Channel / Initiative – Select. This helps group things by bigger rocks like “Q1 Launch” or “Always-On Retargeting.”
-
Final UTM URL – Formula. This is where the magic happens.
-
QA Status – Select. Values like
Not Checked,Approved,Fix Needed. -
Owner – Person. Who is responsible for this UTM.
-
Status – Select. Values like
Draft,Ready,Launched,Archived.
What you’re really doing here is pulling your UTM rules out of people’s heads and into structured fields. The database becomes a living implementation of the conventions you defined in UTM Tracking: Setup, Naming Conventions & QA Checklist. Instead of hoping everyone remembers how to name campaigns, you nudge them into choosing from curated dropdowns.
And because it’s Notion, you can add views for “Active campaigns,” “By Source,” “By Initiative,” or even “Needs QA.” You’re slowly turning “UTM chaos” into something that looks suspiciously like a reliable system.
💡 Nerd Tip: Make Source and Medium select fields, not free text. This one choice eliminates half of the usual UTM inconsistencies overnight.
🧮 A Ready-Made Formula to Build UTMs Automatically
Now we get to the part that lets you automate UTM builder in Notion instead of moving fields into Sheets. In your Final UTM URL property, switch the type to Formula and use a pattern like this (adapt field names if you changed them):
Let’s unpack what this does, line by line, so you can adapt it confidently.
First, it starts with the Base URL and immediately appends a ?. We’re assuming your landing page URL doesn’t already have query parameters. If some of your pages already include ?, you can add a defensive check (we’ll talk about that in the pitfalls section).
Next, it builds each UTM parameter in sequence: utm_source, utm_medium, utm_campaign. For each one, it wraps the property in lower() and replaceAll() to normalize the format—this makes sure Meta Ads becomes meta_ads, and Email becomes email. That normalization seems small, but it’s exactly what keeps your analytics from splitting traffic into multiple rows for the same channel.
Then, for utm_content and utm_term, the formula uses if(empty(...), "", ...). In plain language: “If this field is empty, skip this parameter entirely; otherwise, add it.” This prevents you from ending up with ugly URLs like ...?utm_content=&utm_term= when you don’t need those dimensions.
If you’re using multi-touch attribution tools or feeding data into a model like the ones you compare in Marketing Attribution Software: MMM vs MTA for SMB Growth, this kind of consistency matters a lot. Clean, lowercased, normalized UTMs make it much easier to group campaigns, test creative, and understand which levers are actually moving revenue.
💡 Nerd Tip: Create one “Formula Playground” row in the database and deliberately try to break the formula with weird inputs (Capital Letters, spaces, hyphens). It’s much better to catch edge cases there than inside a live campaign.
🟩 Eric’s Note
No miracle here—just fewer chances for humans to mistype things while they’re under time pressure. That’s usually where data quality quietly dies.
🧱 Turning Briefs into Auto-Filled UTM Rows
So far, we’ve built a solid UTM builder database, but we’re still asking people to create rows manually. The real unlock comes when you connect this builder to your campaign briefs so UTMs are created as a natural by-product of planning, not a separate chore.
Imagine you have another Notion database called “Campaign Briefs”. Each brief might include fields like Campaign Title, Objective, Offer, Primary Channel, Landing Page, Owner, Launch Window, and so on. That’s already where your team lives when planning work, so it’s the perfect place to trigger UTM generation.
Start by adding a Relation property in the Campaign Briefs database pointing to your Campaign UTM Builder DB. Call it something like UTM Entries. In the UTM Builder database, Notion will automatically create the back-link relation. Now, from any given brief, you can create a linked UTM row directly without leaving the page.
Next, create a template inside the UTM Builder database. This template should pre-fill certain properties based on what usually maps over from a brief:
-
Base URL← the brief’sLanding Page -
Source← the brief’sPrimary Channel(mapped togoogle,meta, etc.) -
Campaign Name← a cleaned-up version ofCampaign Titleor a dedicated naming field -
Channel / Initiative← maybe the same as aThemeorInitiativefield in the brief
You can’t fully auto-map everything without a bit of manual input, but you can get 60–80% of the work done automatically. With a relation in place, you simply open a brief, click “+ New” in the UTM Entries relation, choose your template, and let Notion pre-fill what it can.
Some teams go one step further and use a Notion template button inside each brief that says “Create UTM Row.” Clicking it spawns a linked entry in the UTM Builder, already tied back to the campaign. The idea is that every brief that gets approved also gets at least one UTM row created, with your formula silently generating the final URL in the background.
💡 Nerd Tip: Add a small “UTM ready?” checkbox or status in the brief itself. In weekly growth meetings, scanning for “approved but not UTM-ready” is an easy way to catch things before launch.
🤖 Optional – Connecting Notion UTM Builder to Ads / Sheets with Automation
You can stop here and have a perfectly usable, no-spreadsheet UTM workflow. But if your team is already comfortable with automation tools, you can go a step further and connect the UTM Builder to the tools that actually execute campaigns.
A common pattern is to use Zapier, Make, or another automation platform as a bridge between Notion and the rest of your stack. For example, you can create a scenario like this:
-
Trigger: When a row in Campaign UTM Builder changes
StatustoReady. -
Action 1: Append the
Final UTM URLplus meta fields (source, medium, campaign, content) to a central Google Sheet or Airtable that acts as your archive. -
Action 2: Send a formatted message to a Slack channel or email list used by performance marketers, containing the campaign name, channel, and the generated UTM link.
With this in place, your Notion database becomes the single source of truth, but your media buyers, lifecycle marketers, or content team still get their UTMs in the format they’re used to. You can even auto-create tasks in your project tool when a new UTM is ready, tying into the workflows you may already be automating using the ideas in Automating Task Management with Notion + AI Integrations.
Teams that adopt this flow often report a subtle but important change: UTMs stop being an afterthought and become just another field in the campaign system. One growth lead wrote on X, “Once we put UTMs in Notion and wired them to Slack, the ‘where is the link?’ questions basically vanished. Everything is just… there.” That’s the level of calm you want around your tracking.
💡 Nerd Tip: Start with a one-way automation from Notion to Slack or email. Once the team trusts the URLs, you can experiment with more advanced actions like creating drafts in ad platforms or populating templates in content tools.
⚡ Ready to Automate More Than Just UTMs?
Once your Notion UTM builder is live, it’s the perfect time to plug it into Zapier, Make, or n8n and let workflows carry data into sheets, ads, and tasks—no manual copy-paste.
🔁 Governance – Naming Conventions + QA Inside Notion
Once UTMs are being generated inside Notion, you can finally treat governance as part of the same system instead of a separate lecture in a slide deck. The goal: when someone messes up, you spot it in Notion before it poisons your reports.
Start by creating a dedicated “QA View” in the Campaign UTM Builder database. Filter it to show only rows where Final UTM URL is not empty and QA Status is Not Checked. Sort by Created Time or Launch Date so the newest campaigns sit at the top. This view becomes the daily or weekly checklist for whoever owns tracking hygiene.
Then, add two more properties: QA Notes (text) and QA Owner (person). When someone reviews a row, they either flip QA Status to Approved or leave a note about what needs to change. Because the formula is dynamic, fixing a typo in Source or Campaign Name automatically updates the Final UTM URL everywhere it appears.
You can also experiment with a Kanban view by Source or Medium. Moving cards across a board labeled Not Checked → Approved → Fix Needed makes it very visual where most issues come from. If you notice one channel constantly creating edge cases, that’s a product conversation: maybe your naming scheme for that channel needs to be simplified.
This governance layer feeds straight into your performance work. Clean, consistent UTMs make it far easier to segment and optimize campaigns in the spirit of Google Ads Optimization Tips: Smart ROI on Lean Budgets. Instead of trying to remember if utm_source=Google and utm_source=google_ads should be combined, you already know they’ll never exist because your Notion builder doesn’t allow that drift.
💡 Nerd Tip: Make UTM QA part of your standard campaign launch checklist. If a campaign is in “Launched” but still shows “Not Checked” in the QA view, that’s a red flag.
⚠️ Common Pitfalls (and How to Avoid Them)
Even with a solid Notion build, there are a few places teams trip up. The good news is that almost all of them have simple fixes.
The first big one is Base URL pollution. If someone pastes a URL that already contains ? or existing parameters, your formula will happily append another ?utm_source=..., breaking the link or at least making it messy. The easiest mitigation is cultural: write in the property description, “Use the clean landing page URL, no query parameters.” If that’s not enough, add a secondary formula property that flags suspicious URLs—for example, checking contains(prop("Base URL"), "?") and surfacing a warning.
The second issue is uncontrolled campaign names and special characters. If your Campaign Name field is free-form and people add spaces, slashes, or emojis, your UTM will “work,” but you’ll hate yourself in reporting. Normalizing to lowercase and replacing spaces helps, but you can go further by coaching the team to use a pattern like year_quarter_theme_channel. A short section in your internal doc, anchored by the principles from UTM Tracking: Setup, Naming Conventions & QA Checklist, usually nudges people into the right habits quickly.
Finally, watch out for misalignment between email, ads, and landing pages. It’s common for lifecycle marketing to use one naming scheme and paid to use another, which means multi-touch attribution tools and even basic analytics segments don’t line up cleanly. By forcing all teams to generate UTMs from the same Notion database, you nudge everyone into one shared language. That’s exactly what lets your MMM/MTA setup and your Post-Purchase Surveys + UTM Hygiene work together instead of contradicting each other.
💡 Nerd Tip: Once your UTM builder is live, schedule a 30-minute “UTM clinic” with your team. Walk through real rows, fix a few in real time, and get everyone comfortable editing the Notion fields themselves.
📬 Want More No-Spreadsheets Workflows Like This?
Join the free NerdChips newsletter and get weekly walkthroughs on Notion systems, automation stacks, and data hygiene—built for lean teams that track seriously.
🔐 100% privacy. No noise. Just value-packed workflow and analytics tips from NerdChips.
🧠 Nerd Verdict
Moving your UTM workflow into Notion is not about being “fancy” with tools; it’s about putting tracking where the work actually happens. When briefs, approvals, and URLs share the same database, you turn UTMs from a fragile sidecar into a predictable part of your operating system.
The combination of a well-designed Campaign UTM Builder, a clean formula, and a link to your briefing process is enough to retire the “mystery spreadsheet” phase of your growth stack. Add light governance views, a bit of QA discipline, and optional automation into Sheets or Slack, and you end up with something rare: a tracking workflow that people actually use correctly without constant nagging.
For teams that take attribution seriously—especially those investing in the kinds of models and hygiene we talk about across the NerdChips UTM and attribution content—this is one of the highest-leverage changes you can make in a single afternoon.
❓ FAQ: Nerds Ask, We Answer
💬 Would You Bite?
If you had a Notion UTM builder live tomorrow, which team would benefit first—paid, lifecycle, or content?
And what’s the one UTM mistake you’re secretly tired of fixing over and over again? 👇
Crafted by NerdChips for creators and teams who want every click tracked cleanly—without living in spreadsheets.



