We built a two campaign fixture where the campaign delivering more signups also converts a smaller share of its clicks. Campaign A records 20 signups from 1000 clicks. Campaign B records 30 signups from 2000 clicks and the decision changes depending on which quantity we ask the report to explain.

These counts are synthetic, with no client campaign or platform export behind them. We use them to inspect the arithmetic before adding attribution windows or audience differences. We get an example anyone can rerun, without exposing a campaign account or a customer record.

Volume and efficiency answer different questions

Campaign B produces 50 percent more signups than campaign A. Its click to signup rate is 1.5 percent compared to 2 percent for campaign A. Both statements follow from the same rows, and neither statement establishes which campaign deserves the next unit of budget.

A: 20 signups / 1000 clicks = 2.00%
B: 30 signups / 2000 clicks = 1.50%

We also give campaign A 10000 impressions and campaign B 100000 impressions. Campaign B has ten times the impressions and twice the clicks but only one and a half times the signups. The drop between those comparisons tells us where to ask the next question, without pretending the counts explain the cause.

A rate works like a recipe ratio because changing the amount in the bowl changes the total output without changing the proportions. For the campaign report, we keep the underlying counts beside the rate so a larger distribution does not masquerade as a more efficient conversion path.

A pooled rate uses pooled counts

We combine the two campaigns by adding their signups and their clicks. That gives 50 signups from 3000 clicks for a pooled rate of approximately 1.67 percent. Taking the arithmetic mean of 2 percent and 1.5 percent instead gives 1.75 percent, because it gives both campaigns equal weight despite their different click counts.

const pooledRate = (20 + 30) / (1000 + 2000);
const unweightedMean = (20 / 1000 + 30 / 2000) / 2;
console.log((100 * pooledRate).toFixed(2)); // 1.67
console.log((100 * unweightedMean).toFixed(2)); // 1.75

We keep the numerator and denominator attached to each reported percentage and combine rows only after confirming that the event definition and reporting window match because a tidy total assembled from incompatible measurements gives the spreadsheet a satisfying answer while leaving the campaign decision resting on a different question.

The example script asserts both calculated percentages and checks the signup multiplier and the impression multiplier. A fifth assertion rejects a zero denominator, which saves the report from a surprisingly confident answer to an empty question. That last case needs an explicit missing rate in a report because zero clicks do not support a conversion rate of zero percent.

Take the next decision back to the data

For the budget decision, we need more than these rates because the fixture contains no spend or signup quality or revenue. We add those quantities when the question asks about acquisition cost or commercial return. Calling the larger signup total a winner before stating the goal skips the decision the report is meant to support.

The next useful extension is to split the counts by comparable audience and time window while keeping the same event definition. Then we can inspect whether the apparent gap survives the split and decide which experiment tests the explanation we actually care about. The spreadsheet has done its arithmetic, and now the experiment needs a question.

Sources and examples