Hook Rate and Hold Rate: a Sheets calculator for paid-social creative
A Google Sheets template that turns a Meta Ads Manager export into hook rate, hold rate and cost per ThruPlay, so creative decisions rest on retention, not gut feel.
The Social Desk
A naming convention for paid-social UTMs plus a few Google Sheets validation formulas that flag a broken tag before it ships, so your reporting stops splitting one campaign across nine spellings.
Template · Starter · Filed 18 July 2026
The problem is never a single bad UTM. It is Facebook, facebook, FB and Meta all pointing at the same channel, so the channel report shows four rows where there should be one, and nobody trusts the total. UTMs do not need a platform to govern them. They need a small fixed vocabulary, one rule about who is allowed to add a word to it, and a sheet that refuses to accept a tag that breaks the rules.
This pack is that convention plus the validation formulas that enforce it. It is a house style for the five UTM parameters, written to be pasted into your tracking sheet and argued with once, not per campaign.
source and medium. That tab is the single source of truth; if a value is not on it, it is not a valid value.The rules, and the validation formulas, in one block to paste into a note tab:
UTM CONVENTION (paid social)
Global rules
- lowercase only
- hyphens, never spaces or underscores
- no capital letters, no accents, no punctuation beyond hyphens
utm_source = the platform. Fixed list, register-controlled:
facebook | instagram | tiktok | linkedin | pinterest | reddit
utm_medium = the buying type. Fixed list, register-controlled:
paid-social | paid-video | paid-influencer
utm_campaign = {market}-{objective}-{theme}-{yyyymm}
e.g. uk-prospecting-spring-sale-202607
utm_content = {format}-{variant} e.g. video-hook-a
utm_term = optional, audience or placement, same casing rules
New source/medium values are added ONLY by the register owner,
on the register tab, before first use.
--- Sheet validation (put the tag parts in columns; adjust ranges) ---
Lowercase + hyphen safe (no spaces, caps or underscores). A2 = the value:
=REGEXMATCH(A2, "^[a-z0-9]+(-[a-z0-9]+)*$")
Source is on the approved list (Register!$A$2:$A gives the allowed sources):
=ISNUMBER(MATCH(B2, Register!$A$2:$A, 0))
Campaign matches {market}-{objective}-{theme}-{yyyymm}:
=REGEXMATCH(C2, "^[a-z]{2}-[a-z-]+-[a-z0-9-]+-\d{6}$")
?utm_source=...&utm_medium=... string with a join formula only from rows where every checker is TRUE.The formulas catch the mechanical failures: a stray capital, a space, a source nobody approved, a campaign name that skipped the date. That is most of the real-world damage, because most UTM chaos is spelling, not strategy. What they cannot check is meaning: REGEXMATCH will happily pass uk-prospecting-spring-sale-202607 on an ad that is actually retargeting, because the string is well-formed and the intent is not something a regex can see. So the register owner still matters more than the sheet; the validation stops typos, the human stops nonsense. Treat a green row as "correctly formatted", never as "correctly tagged". And keep the register short: every value you add is a value someone else now has to spell exactly, so a vocabulary of six sources you enforce beats a vocabulary of forty you do not.
More Like This
A Google Sheets template that turns a Meta Ads Manager export into hook rate, hold rate and cost per ThruPlay, so creative decisions rest on retention, not gut feel.
Starter · 10 minutes
The exact columns for a paid-social testing sheet, plus the three decision rules that stop a test being read too early, judged on the wrong number, or forgotten before it teaches you anything.
Starter · 15 minutes
A step-by-step walkthrough of implementing Meta's Conversions API Gateway through Stape, aimed at lifting Event Match Quality without hand-rolling a server.
Operator · 45 minutes · via Jon Loomer