What we measure during a campaign (and what we refuse to)

Most analytics decks lie by selection. They show you the chart that looks good and bury the one that does not. We have sat through enough of those decks — sent by previous agencies our clients had fired — to be allergic to the genre. This page describes the small, boring stack we actually use, and the metrics we will not report no matter how nicely you ask.

If you want a tidy slide that says "2.3M impressions delivered" without explaining what an impression means on Meta in 2026, we are the wrong agency. Read about us first. We are eight people in Minsk. We do not have a "data team". One of us, usually Anna, writes your weekly report by hand on Friday afternoon.

The UTM scheme we actually use

Every link we publish during a campaign gets tagged. No exceptions, including the link in our own internal Telegram thread when we test creative. The scheme is small enough to remember and big enough to debug a bad day.

Our parameters:

  • utm_source — the platform: meta, google, tiktok, x, linkedin, email, telegram, direct. Lowercase, no variants. "Facebook" and "Instagram" both collapse to meta because Meta reports them together anyway and we hate two columns that should be one.
  • utm_medium — paid vs organic vs owned: cpc, cpm, social-organic, email, referral, qr.
  • utm_campaign — the contest slug plus the calendar week, e.g. foto-konkurs-warszawa-2026w14. Week numbers make week-over-week comparisons trivial.
  • utm_content — the creative ID, e.g. v3-emerald-static or v7-courtyard-video15s. This is where most agencies get lazy. Without it, you cannot tell which ad is doing the work.
  • utm_term — only for search; the matched keyword group.

We do not use utm_id. Meta's UTM auto-population was helpful for about 18 months and then broke for enough advertisers that we stopped trusting it; we write parameters by hand and check them with a redirect inspector before any ad goes live. Boring, but our tagging error rate dropped from roughly one bad link per 14 ads to one per 80-something after we made manual review a required step in our process.

Why we picked Plausible over GA4 for participant dashboards

This is the part where opinions get spicy.

GA4 is free and powerful. It is also, in our opinion, a poor fit for a small contest campaign run for an EU resident. Three reasons, in order of how much they matter to us:

  1. Consent friction. Under the ePrivacy Directive and the Polish telecommunications law that implements it, GA4 needs a granular cookie banner with a real reject button. Plausible runs cookieless and does not need one. For a campaign landing page where every second of friction kills a participant's willingness to share their entry, this matters. The European Data Protection Board's Guidelines 4/2019 on data protection by design (adopted October 2020) reinforce this default-minimal posture, and we treat it as binding rather than aspirational.
  2. Data residency. Plausible's EU plan runs in Germany. GA4 routes to Google's global infrastructure. We have had Polish clients ask us, in writing, "where does my participant's IP address end up?" Plausible gives a one-sentence answer. GA4 gives an essay about Standard Contractual Clauses.
  3. Honest defaults. Plausible does not estimate or model conversions in the dashboard. When we say "412 people clicked the vote button", we mean 412 unique sessions where the click event fired. GA4 will, by default, smooth and impute. That is fine for a fashion retailer with 80,000 sessions a day. For a contest with 3,400 sessions in a week, smoothed numbers are made-up numbers.

The trade-off is real. Plausible has fewer bells. There is no audience builder, no remarketing list, no integration with Google Ads' offline conversion import. For paid Google Search campaigns we still install a minimal GA4 property in parallel — because Google's smart bidding genuinely needs the signal to learn — but the client-facing dashboard is Plausible. We will not pretend GA4 is the obvious choice when it is not for our use case.

One thing we got wrong, once: in early 2024 we ran a campaign with Matomo self-hosted, thinking we could give the client raw database access. The server fell over on the first viral evening of the campaign — 2,800 concurrent users that we had not load-tested for — and we lost about six hours of data. We switched to Plausible Cloud the following week and have not looked back. We list this in our FAQ when people ask why we do not self-host.

What goes in the weekly report

The report is two pages. Always. If it grows, something is hiding.

Page 1 — the funnel

One table, five rows, the entire campaign:

  • Reached — unique users the ad platforms confirm saw the creative at least once. We label this clearly as platform-reported and platform-defined, because Meta's "Reach" and Google's "Unique users" are measured differently and a 12,000 number from one is not comparable to a 12,000 number from the other.
  • Clicked through — landing-page sessions from tagged links, counted in Plausible. This is always lower than the platform's reported click count. The gap is usually 18–34% — mis-clicks, in-app browser quirks, people closing the tab before the page loads.
  • Reached the vote page — sessions that hit the contest URL after our landing page. Measured via outbound link click event in Plausible.
  • Vote action completed — measured only where the contest platform publishes a public vote count we can verify against a baseline. About 47% of the contests we have worked on this year expose this. The rest, we mark "not measurable" in the cell. We do not estimate.
  • Cost per measured vote — where row 4 is available, total spend divided by the increment we can attribute. Where row 4 is "not measurable", this cell is also "not measurable". This frustrates some clients. We are not willing to fabricate a number to soothe them.

Page 2 — the creative cut

Same five rows, broken out by utm_content. This is where you discover that the photo of the contestant in their grandmother's apartment is outperforming the studio shot 3:1, and you reallocate budget on Monday. A recent client — a photography contest entrant in Kraków submitting an architectural series — saw their best-performing ad cost €0.31 per vote-page-arrival while their worst cost €2.18. Same week, same audience, same budget split evenly across four creatives. The cut by utm_content made the decision obvious in 90 seconds.

What we refuse to put in the report

This is the part most agencies will not write down.

We will not report impressions as if they were engagement. An impression on Meta in 2026 fires when 1 pixel of your ad is on screen for any non-zero duration. That is not someone seeing your ad. It is a technical event that correlates loosely with seeing. We include reach (deduplicated) on page 1 because the platforms charge by it and you deserve to know what you bought, but we do not put impressions on a chart with an upward slope and call it momentum.

We will not report "video views" without the threshold. Meta counts a video view at 3 seconds. TikTok counts at any play. If we mention video views, we report them at the 50% completion mark, which is a defensible proxy for "this person actually watched".

We will not report follower or like growth on accounts we did not promise to grow. Some agencies stuff vanity metrics into contest reports to pad the deliverable. A contest entrant does not need to grow their Instagram. They need votes by Friday at 23:59 Warsaw time. We stay on the actual goal.

We will not estimate "earned media value" from social shares. EMV is a number you can move by changing assumptions, which means it is a number you should not move. It does not appear in our reports. Ever.

We will not back-fill missing data with modelled numbers. If iOS App Tracking Transparency cost us visibility on 38% of iPhone conversions in a given week, the report says so, in that cell, in words. We do not silently smooth the gap.

The lines we will not cross to get a better-looking number

The metrics above are honest because the campaign that produces them is honest. Worth saying plainly: we do not buy votes, we do not operate bot farms, we do not create fake accounts on contest platforms, and we do not log into your contest account on your behalf. Read what we actually do and our refund policy for the full boundary. If a client asks us to fake engagement to make a chart look better, we end the engagement. This has happened twice in 2025. We refunded the unspent budget within 72 hours both times.

The tools, by name

Because people ask:

  • Plausible Cloud (EU) — participant-facing dashboard, link to share read-only.
  • GA4 — installed only where a paid Google Search campaign genuinely needs the conversion signal for bidding. Never the source of truth in the client report.
  • Meta Ads Manager + a small Google Sheet — daily spend and platform metrics, exported manually on Friday. We use Meta's published Advertising Policies as the operating rulebook; the policy on Personal Health and Appearance was last meaningfully revised in late 2024 and still trips up contest entrants in the wellness category.
  • Google Ads Editor — for any search campaign over €400/week. Below that, the web UI is faster and the audit trail is the same. Google's Misrepresentation policy is the one we cite most often when explaining what landing-page copy is allowed; the most recent significant change took effect 24 May 2024.
  • UrlChecker (internal) — a 90-line Python script Anna wrote that fetches every UTM-tagged link before publish, follows redirects, and screenshots the final landing page. Ugly. Effective.

That is the entire stack. No data warehouse. No Looker. No BigQuery. A contest campaign that runs for 14–21 days does not need any of those, and adding them would only hide the underlying numbers behind a thicker layer of glass.

What the participant dashboard looks like

You get a Plausible shared link, password-protected, with three filtered views saved: by source, by content, and by day. You can open it from your phone. Refreshes every minute or so. You will see exactly what we see. No agency layer between you and the data.

This is deliberate. Some clients find it overwhelming on day one and ignore it after day three. That is fine. The Friday report condenses it. But the raw view stays open the whole campaign, because we would rather a client second-guess a slow Tuesday than be surprised on a quiet Saturday.

One last contrarian note on attribution

Last-click attribution is widely mocked in marketing circles in 2026. It is also, for a 14-day contest campaign with one conversion event and a short consideration window, the right model. Multi-touch attribution makes sense when buying a sofa takes six weeks and 14 touchpoints. It does not make sense when the entire customer journey is "see ad on Instagram, click, vote, close tab". We use last non-direct click for the funnel table on page 1, and we report direct traffic separately so you can see how much of it is your own audience showing up to support you (which is usually more than ad agencies want to admit).

If you have read this far and want to see the actual template we send on Fridays, ask. We will email you a redacted real one from last month. No form, no nurture sequence — just a PDF. See also what this costs and how we handle your participant data.

Free for new clients

Get a free contest analysis in 1–2 hours

Send us your contest URL and a one-sentence goal. We reply with which channels make sense, projected reach for typical budgets, and an honest yes/no recommendation.

Get my free analysis →

Faster on Telegram or WhatsApp.