We paused our first Google Ads campaign this week. Five weeks, €326.96 spent, 3,099 impressions, 99 clicks, and exactly one signup in the conversions column. Cost per tracked conversion: €327.
That last number is the least useful one in the report, which is the interesting part.
Context: we build affiliate tracking software for EU SaaS, so this was a validation campaign as much as an acquisition one. Phrase-match keywords, eight EU countries, €18/day cap, a signup goal.
What the money taught us:
Polish keywords beat English ones. "platforma afiliacyjna" and "system afiliacyjny" pulled 1,300+ impressions and 40 clicks between them; Poland was our second-biggest click source after Germany. We'd added them almost as an afterthought. The English head terms cost slightly more per click and tracked zero conversions.
The smallest keyword held the strongest intent. "affiliate platform for saas" got 36 impressions all month and clicked through at 11%, more than triple the account average. Search volume and buying intent live on different keywords.
The conversions column lies, and ours is self-inflicted. Our site loads the ads conversion tag behind the consent banner. Decline it, and most people do, and your signup never reports back to Google. We build attribution software and can't fully attribute our own ads. The irony is not lost on us. The one conversion Google did record came from Estonia: 2 clicks, 50% conversion rate, a number that means nothing at this sample size and still made my day.
And "stripe affiliate", the keyword closest to what we actually do, never showed once.
Campaign is paused now. The keyword list gets rebuilt around what the data said instead of what we guessed, starting with the Polish market we didn't know we had. €18 a day bought us less acquisition than expected and more market research than any tool we've paid for.
What's the most useful thing a small or failed ad campaign taught you about your market?
That reconciliation approach feels right. The search terms report should tell you whether the campaign is attracting the wrong intent or whether the landing page is losing the right people. I’ve been burned by signup numbers that looked clean until I traced the first useful action. Once you have the query-level data, what would make you change the keyword set versus the page?
The rule I would use: if the query names the job we actually do, the page owns the outcome. If it names a different job, the keyword set does.
At query level that splits into three buckets. Right job and right buyer but nobody reaches the second step: page. Right job, wrong buyer, someone who would never pay for it: keyword set, and add the negative. Wrong job entirely: remove it.
The trap is that both problems look identical in aggregate, which is how we spent five weeks blaming traffic quality.
One number from this month that made the distinction concrete for us. Two campaigns, near identical impressions, 856 and 862. The one recruiting partners took 63 clicks, the one aimed at merchants took 25. Different landing pages, so it is not a clean experiment, but a gap that size is wider than page quality usually explains. Both produced zero signups, and that part is the page and the ask, not the queries.
Caveat on our scale: at 60 clicks the query data is thin enough that I would use it to write negatives rather than to rebuild the list.
That rule is helpful because it separates query intent and page performance instead of blaming traffic as one bucket. I especially like your point about using thin query data to write negatives, not rebuild the whole list. In Speechara.Ai, I am trying to apply the same discipline to acquisition events: a first useful transcript is a better signal than a signup. How many clicks or conversions do you usually wait for before treating a query pattern as strong enough to act on?
The consent banner point is the most useful thing in this post, and I think it's bigger than the ad campaign.
If most people decline and your tag never fires, you don't have a measurement problem on one channel — you have a blind funnel. Any keyword conclusion you draw is drawn from the people who clicked "accept," who aren't a random sample. I'd fix that before spending another euro on keywords.
Two things that helped me in a similar spot. First, log the signup event first-party — you don't need the ads tag to know your own signup happened. Second, session replay, which showed me things no tag would have caught anyway: a broken chat widget people were rage-clicking, and a mobile hero with the CTA below the fold. My conversion problem turned out to be mechanical, and I'd spent weeks treating it as a traffic-quality problem.
On markysingh's point about the trial ask, I'd push it one step further. It's not just account-first, it's account-first on a phone for someone who typed a generic query eight seconds ago. If a meaningful share of those 99 clicks were mobile, watch five replays of them before you rebuild the keyword list. Cheaper than the next €327.
You've named it better than my post did: the sample isn't broken, it's selected. One split worth making though. Click and CTR data comes from Google and consent doesn't touch it, so conclusions about which keywords attract interest survive. It's the conversion-side conclusions that rest entirely on people who accepted, and that's exactly where I was about to rebuild a keyword list. Fair catch.
First-party signup logging: agreed, and that's the fix we're building. Capture the click id at landing, store it server-side against the signup, upload conversions from there. The first run was humbling: 20 candidate records, 18 with no click id stored.
Session replay is where I have an honest complication. We sell privacy-first attribution, so a replay tool is the one purchase I can't make casually: it records the session, in the EU it needs consent, and it therefore sits behind the same banner that created the blind spot. I'd be watching accepters again.
And I can't answer your mobile question from our own data, which is its own kind of answer. Our click log keeps a visitor token, a hashed IP, the landing URL and the referrer. No user agent, no device. Google's reports can split by device, so that's where I'll look, but it's a fair illustration of the trade: the less you keep, the less you can explain later.
€3.30 per click with a 1% signup conversion means your acquisition cost is ~€330 per signup. The uncomfortable question that follows: what's a signup worth to you?
If the answer is "I don't know yet," that's actually the real finding of this experiment — and it's worth the €327. Most founders run this exact test, feel bad about the result, and never extract the lesson: before scaling any paid channel, you need the value chain nailed down (signup → activation → payment → retention), because ads only multiply what's already there. They multiply zero just as efficiently as they multiply something.
The alternative that consistently beats early paid ads for knowledge/expertise products: sell the outcome manually first. One live workshop or pilot sold through direct outreach gives you real price sensitivity data AND revenue AND testimonials. Ads become rational only after that loop works organically.
(Side note from running a course platform: the creators who survive the paid-ads learning curve are the ones whose fixed costs are near zero while they experiment. Every month of $100+ tool spend during the "figuring out acquisition" phase shortens the runway to find what works.)
Fair question, and the honest answer is that we know the price and not the value. The subscription runs €49 to €199 a month depending on tier, so a signup that converts and stays a year is worth several hundred. What we don't have is
retention data, so any lifetime value I quote you is arithmetic on an assumption rather than a measurement.
Which is your point, and I'd rather leave it undressed. One correction on the shape though: this isn't a course or a knowledge product, it's B2B software with a self-serve trial. So the manual version of your advice looks like running
the first few integrations by hand instead of selling a pilot workshop. That part we are doing.
On fixed costs during the figuring-out phase, agreed. Cheaper still is having the answer to your first question before the next campaign rather than after it.
Before spending more, I would verify conversion tracking, inspect the actual search terms, and segment clicks by intent. One signup from 99 clicks could be a landing-page problem, a targeting problem, or simply broken attribution, and each has a different fix.
Taking your triage in order. Tracking first, and it's measurably worse than the post says: Google billed us for 99 clicks, our own server logged 74 landings, and 57 of those 74 came from people who declined the banner. The conversions column was never going to work. Three quarters of the traffic was invisible to the tag before any landing page or targeting question came into it.
Search terms: still not pulled. That's the embarrassing answer, and it happens before we spend another euro.
Intent segmentation did give one clear signal, though not on the axis I expected. It split by language, not by keyword: the Polish queries got English ad copy pointing at an English page, and still clicked through.
Pause spend until the measurement chain is reconciled. Build one table from billed click to server landing, consent state, signup, and activation; pull the actual search terms; then split Polish traffic into its own campaign with Polish copy and landing page. Resume with a small cap only after server-side events and consent-safe conversion tracking agree closely enough to make decisions.
That's the plan, in that order, and spend is already paused so nothing is burning while the table gets built.
Two of its columns exist today: 99 billed clicks against 74 server-side landings, with consent state derivable from our own events. The signup column has a single row in it, which makes the reconciliation cheap to build and impossible to average.
So the honest sequencing is: reconcile what we can, publish the drop-off rate, and run the Polish slice as research with a kill number written down first. A proper cap only makes sense once there's a signup rate to reconcile against, rather than one data point.
The most interesting takeaway for me is that the campaign actually gave you useful market research, even if the acquisition result was poor.
The Polish keywords are especially interesting: low-volume keywords with stronger intent can be much more valuable than high-volume terms that don't convert.
I'd also be careful about judging the campaign too much from the single tracked signup while the consent issue is still affecting attribution. Fixing the measurement layer first could completely change how you interpret the next test.
I'd be curious to see what happens when you rerun the campaign using the Polish keywords and cleaner conversion tracking.
That's the plan in exactly that order: measurement first (offline conversion upload from consented signups, so the numbers stop depending on a browser tag), then the Polish keywords get a concentrated run with Polish ad copy and the Polish landing page. Results land here as a follow-up post whichever way they go; a clean instrument pointed at the same market is the whole experiment.
Sounds like a solid experiment. I’ll definitely be interested to see the results, whichever way they go. Good luck with it!
Five weeks at €18/day before pausing is the thing I'd change. I left losing campaigns running for months before I'd admit they were losing, and the delay cost me more than the spend did.
What helped was writing the kill number down before the ad goes live - if cost per lead is over X by day 4, it dies. Three or four days is enough at this budget to see whether the intent is there.
The Polish keywords were visible in week one. The other four weeks bought a confirmation you already had.
Writing the kill number before launch is the discipline I'm taking from this thread. One split I'd add: it depends what the campaign is for. For acquisition your day-4 cost gate is right. For validation the pre-registered stop works better as a date, because you're buying a fixed observation window rather than leads. Our five weeks were one part that logic and three parts inertia, and only the first part deserves defending. Either way the stopping rule belongs next to the hypothesis, written down before the first euro moves.
The consent-banner issue is a good example of analytics becoming misleading at the exact moment you need it most. I would keep a first-party event log alongside the ad platform: landing, signup started, signup completed, and first meaningful use, then reconcile it with consented conversion data. For a small SaaS, that can be more useful than optimizing around one reported signup. The Polish keyword finding may be the most valuable output here. Did the search terms report reveal any language or use-case patterns you had not planned for?
The honest answer is the embarrassing one: the search terms report isn't pulled yet. TCLeon511 upthread put it on the list, and it happens before the Polish re-run. Everything I know today is keyword-level; the query-level surprises are exactly what I expect that report to hold, and whatever falls out goes into the follow-up post with the re-run numbers.
On the event log: agreed, and that's the build here. First-party events server-side, landing through first meaningful action, with the ad platform's column demoted to a bidding signal you reconcile against rather than a truth you optimise toward. Either number alone lies in its own direction; the reconciliation is where the honesty lives.
The tracking issue is probably the part I’d fix before drawing too many conclusions from the campaign data. If the consent flow is preventing the conversion tag from firing, the reported CPA and conversion rate can make a campaign look much worse than it actually is.
I also like the point about the smaller keyword showing stronger intent. Low search volume can be completely fine when the traffic is much more qualified.
Agreed, and the distortion is now measured rather than assumed: Google billed 99 clicks, our server saw 74 land, and 57 of those declined the banner. Any CPA on top of that is arithmetic over a quarter of the traffic.
The fix is running: capture the click id at landing, store it server-side against the consented signup, upload conversions from there. First honest number from this morning's run, though. Of 20 candidate records, 18 had no click id stored. One matched, one failed. Tag installed is not signal flowing, and it turns out the replacement has the same trap one layer down.
On the small keyword: that's the one I'd bid on again.
That makes sense. The 18 missing click IDs out of 20 is a pretty strong signal that the tracking issue is happening earlier in the journey than the conversion itself.
I’d be interested to see how the numbers look once the click ID is consistently persisted server-side. That should give you a much cleaner picture of which keywords and markets are actually producing qualified traffic.
And I agree on the small keyword. An 11% CTR with that little volume is enough to justify testing it again rather than dismissing it because of low search volume.
You're right that it's upstream. The click id arrives on the landing page, but the record we upload from is created at signup, and between those two events sit the consent decision and, for most visitors, a different session. So the
losses are structural rather than a bug in the upload step.
Next is measuring where exactly: how many landings carry a gclid at all, then how many of those survive into a stored record. I'll post those numbers with the Polish re-run instead of keeping them to myself, since the drop-off rate is
the useful part, not our particular setup.
Disclosure: LeadGrid is mine - B2B lead lists - so I ran a version of this and got a worse answer out of it.
483 clicks across Google and Bing in July. Product usage from those clicks: zero. Not a tracking gap either, I own the database and the rows weren't there. What the money actually taught me was to go look at where the clicks came from, and about a third of everything that site has ever seen turned out to be parked-domain syndication I'd paid for. Search Partners was on by default. Worth pulling your placement report before you rebuild the keyword list - 99 clicks on 3,099 impressions is a 3.2% CTR, which is high enough that I'd want to know how much of it was real search.
The other thing 327 EUR buys you cheaply: your CPC is about 3.30. That's a floor. Against a 9 dollar order value it was arithmetic I couldn't win however good the keywords got, so I stopped. Recurring affiliate-tracking revenue almost certainly clears it, which is a much better position than mine.
Poland is the real return here though.
The placement report is the action item I didn't know I was missing, thank you. Search Partners was very likely on by default here too, and a CTR flattering enough to double-check fits your parked-domain story uncomfortably well: one more foundational assumption nobody verified. It gets pulled before the Polish rebuild, not after.
And the CPC-as-floor arithmetic is the cleanest viability frame in this whole thread. €3.30 a click sets the minimum the funnel must convert before keywords or copy get any vote at all. Recurring B2B revenue clears that bar on paper; whether our funnel does is precisely what the localised re-run has to prove. Sorry the $9 order value never left you a winnable game, stopping was the right call.
The asset I'd keep out of this isn't the bid list, it's the search terms report. Not the keywords you picked, the actual queries that triggered them. €327 bought a validated list of the language your market uses, in a language you weren't planning to sell in, and that's expensive to get any other way.
We run a remote jobs index and have never bought a click, it's all long-tail organic, and the pattern you found holds on that side too: the queries with no measurable volume are the ones where people actually do something. The difference is those pages keep working after you stop paying for them. If Poland is real, a handful of Polish-language pages built on those exact phrases outlives the campaign that found them.
Curious about "stripe affiliate" though. Did it never show because the phrase match was too tight, or is nobody actually searching it?
The search terms report framing is right, and it upgrades the artefact: the bid list was our guess, the terms report is the market's answer. And your point about pages outliving the campaign is the plan for the Polish slice, pages built on the literal phrases people typed.
On "stripe affiliate": honest answer, we can't tell from this campaign. Phrase match on a two-word query, budget thinned across eight countries and low Quality Score each suppress impressions on their own, so "never shown" doesn't distinguish "nobody searches this" from "we never entered the auction". Next run it goes in as broad match with tight negatives. If it still shows nothing, that's the market speaking rather than the settings.
The consent-banner problem is fixable, but I'd argue the bigger issue is that 99 clicks can't produce a conversion signal even with perfect tracking.
Two things that helped me with the same blind spot. First, Consent Mode v2 rather than blocking the tag outright — the tag still fires in a denied state and sends cookieless pings, and Google models what it can't observe. You don't get user-level truth, but you stop reporting zero. Second, capture the gclid yourself at landing and store it against the signup in your own database, then upload offline conversions back to Ads matched on gclid. Your reporting stops depending on whether a browser tag fired. For an affiliate-tracking company that's also just... your own product's use case, which might be the more interesting realisation.
But sample size matters more here: smart bidding needs roughly 15–30 conversions in 30 days before it learns anything. At €18/day against a signup goal, you're asking the algorithm to optimise on noise. What worked for me was optimising toward a mid-funnel event that fires 10–20× more often — a form start, a first real action — and only promoting the actual conversion once volume justified it.
The Polish keyword finding is the real return on that €327, though. Language as an unclaimed-demand signal is worth more than the conversions column was ever going to tell you.
Taking most of this. The 15-30 conversions threshold is the practical rule we ignored, and optimising toward a mid-funnel event until volume justifies the real goal is the right fix for it. The gclid capture plus offline conversion upload is where we're heading, and you're right about the funny part: it's our own product's mechanism pointed at ourselves, server-side conversions matched after the fact from data the user actually consented to.
Consent Mode v2 is the one I'll push back on. The denied state still fires pings from the device of a person who just clicked decline. Cookieless narrows the ePrivacy question but doesn't answer the plainer one: the user said no, and data still leaves the page. Modelling built on refused signals is exactly the measurement we tell customers not to stand on, so we can't very well run it ourselves. We'd rather report an honest zero than model around a no.
And agreed on the Polish finding being the real return. It's already reshaping the next run.
The consent banner problem is mechanically worse than it looks. Loading the AW- conversion pixel behind consent doesn’t just create a measurement gap — it starves Google’s Smart Bidding algorithm. That tag is the learning signal for bid optimization, not just a counter. Five weeks at €18/day with zero reported conversions means the model had nothing to learn from; it was essentially manual targeting the entire time. The 11% CTR keyword and the Poland volume showed up despite the algorithm, not because of it.
On your question: I ran an 18-article GEO content pipeline over two weeks, automated daily publishing, $0 revenue. When I finally diagnosed why, I found my own sites weren’t consistently indexed — I’d been checking Search Console for submission confirmation, not indexing confirmation. Two different things. Same failure pattern as your consent banner: the plumbing appeared to work because nothing broke visibly. What the “failure” actually taught me wasn’t about the content or the keywords — it was that I’d never verified the foundational assumption that the whole campaign was built on.
"Manual targeting the entire time" is the right description, and it stings because no report ever says it out loud. The fix we're taking is the offline route: capture the click id at landing, store it server-side against the consented signup, upload conversions back after the fact. The algorithm gets its learning signal without a browser tag firing on anyone who declined.
And your submitted-versus-indexed distinction is the same failure class as our banner: the dashboard confirms the action you took, not the state you assumed. Submission confirmed, indexing unverified; tag installed, signal never sent. The boring checklist item that fixes both: verify the foundational assumption end to end once, before reading any downstream number.
The "same root class" framing is worth keeping. Confirm the action, stop — never confirm the state change the action was supposed to produce. It shows up everywhere once you start looking: deploy succeeded ≠ site updated; tag installed ≠ data flowing; submitted ≠ indexed. Each one has a legitimate success signal that doesn't cover the actual goal.
The fix in each case is one explicit downstream check: GSC coverage report instead of just submission, GA4 debug view instead of GTM's own preview, a curl verify after rsync. Action confirmation is free; state confirmation takes one extra step that almost no process includes by default.
"Action confirmation is free; state confirmation takes one extra step" is going into our review checklist verbatim, as a question: "what's the downstream check?" If a change can't answer it, the change isn't done. Thanks for a thread that ended up sharper than the post it started from.
couple honest reads here. first, dont overweight the 327 euro per conversion number, at 99 clicks and 1 signup youre reading tea leaves, thats nowhere near enough data to judge the channel, the confidence interval on a single conversion is basically a shrug. the more useful signal is the 99 to 1 step: about 1 percent of clickers signed up, and THAT points at landing page, message-match and offer, not at google ads. cold search visitors for B2B SaaS convert terribly to a "sign up" ask because theyre still evaluating, the fix is usually a lower-friction first step (see a live demo, get a free audit, view sample data) instead of asking for an account on the first visit. second, the real gold in your data is the Polish keywords beating English. thats not a footnote, thats a market pointing at itself: cheaper clicks, less competition, in a niche where you clearly resonate. id lean hard into that beachhead instead of spreading 18 euro a day across eight countries, because that budget evaporates before any single market gets a real test. what does the landing page actually ask people to do the moment they arrive?
Fair on the tea leaves; one conversion is an anecdote wearing a percentage. To answer the direct question: the page asks for a 14-day trial, no card, which is still an account-first ask for someone who typed a generic query eight seconds ago. Your lower-friction point is the fair hit. The candidate on our shelf is a walkthrough that shows the product working before anyone creates anything, and this thread just moved it up the list.
On the beachhead: agreed, and that's where the next run goes. Same daily budget concentrated on Poland, Polish ad copy, the Polish page, instead of eight countries sharing €18. Spreading was a deliberate validation choice; keeping it spread now would just be indecision.
The consent banner blocking conversion tracking on an attribution product is funny, but also the most expensive way to learn that most people hit "decline." That's the insight buried in the data that changes the entire setup.
The 11% CTR on "affiliate platform for saas" at 36 impressions is the number worth rebuilding around. High CTR on a very specific low-volume phrase almost always signals buying intent that volume-chasing keywords bury. The €327 spent on the broad terms proved what they cost; the 36-impression keyword showed what converts.
The Poland signal is the one I'd sit with. Finding uncontested demand in a market you didn't deliberately target is worth more than most paid acquisition experiments. The question now is whether "platforma afiliacyjna" is just less competitive or whether there's a real underserved segment there.
The tell I'm going to use is language mismatch. Those Polish queries were shown English ad copy pointing at an English-first page, which explains the low Quality Score flags and makes the CTR more interesting, not less: people clicked through a language barrier. CPC was nearly identical to the English terms, so the auction isn't empty; the question is who wins it and with what.
Next run is the same keywords with Polish ad copy against the Polish version of the landing, which already exists. If CTR and signups move together, it's a real segment. If nothing moves and the clicks stay cheap-ish, it was a quiet auction and nothing more. Either way the answer costs less than the first €327 did.
The interesting signal isn't the €327 signup cost, but that the campaign uncovered a different market and intent pattern than the original targeting assumed. That seems like a much more consequential finding than the conversion number itself.
That's where we landed too. As acquisition it failed; as research, €327 to find a market we weren't targeting beats any report we could have bought. So the budgets get separated: a small, properly localised re-run on the Polish slice as research, while acquisition spend waits until the funnel can attribute itself without leaning on Google's conversions column.
That distinction between acquisition spend and research spend is interesting. I’d be curious to see what the Polish slice reveals once you have more data. If you’re open to continuing the conversation, feel free to share your email.
I'd rather keep this one in the thread, the data is more useful where others can challenge it. The Polish re-run will land here as a follow-up post once there's enough volume to say something honest, so the conversation continues either way.
Fair enough — keeping the data in the thread makes sense. I’ll keep an eye out for the follow-up once you have enough volume to draw something meaningful.
The offline conversion upload path is the right fix — capturing the click id at landing and uploading after consent means the algorithm actually gets to learn, rather than five weeks of budget spent on what was effectively manual matching.
Your framing of “the dashboard confirms the action you took, not the state you assumed” is the cleanest version of this failure class I’ve seen. Submission confirmed, indexing unverified. Tag installed, signal never sent. Two different problems, same root: treating the confirmation of an action as evidence of the outcome.
Your test caught our own fix on day one. The upload ran this morning: 20 candidate conversions selected, 18 with no click id stored, one match, one failure. The pipeline reports enabled and healthy, which is action confirmation again. The state, conversions actually arriving in the account, is one.
So the check I'm adding isn't "does the upload run", it's the match rate. Where the click id gets lost I don't know yet. Consent timing is the first suspect.