CRO

Budget Pacing: When the Daily Cap Breaks Your Test

Budget pacing: a daily cap cuts the hours, not just the spend. How a throttled arm flips the verdict and why user level randomization does not fix it.

Flat illustration of a tap dripping into the first of a long row of identical cups on a shelf, the cups on the right still empty, on a mint green background

A daily budget cap does not only cut spend, it cuts hours. A test arm that burns through its budget by 3 pm is not a random sample of the day: it is a sample of the hours when budget still existed. Because conversion rate varies by hour, the throttled arm arrives in the report with a different traffic mix than its counterpart, and the measured difference now carries time of day bundled together with the page effect. In this guide worked example, a treatment that was truly 5.0000% better reads as 15.3226% worse, with a p value of 0.008007 and a confidence interval sitting entirely on the negative side, which is to say it has every outward sign of a trustworthy result. The signal that exposes the problem is not the p value, it is sample ratio mismatch. This guide covers the mechanism, the caps Google and Meta document, the worked example with all three possible readings, how much power survives the fix, and why pacing itself cannot be tested by randomizing users. This guide is part of our complete guide to A/B testing.

A daily cap cuts hours, not just spend

A daily budget almost always reads as a constraint on money. For anyone measuring, it is a constraint on sampling, and that is where the trouble starts.

When an arm hits its cap, it does not serve a little less in every hour. It stops serving from a certain moment onward. The arm does not end up with a shrunken version of the whole day, it ends up with the first part of it. If conversion rate were flat across all 24 hours, that would cost nothing but sample size. It is not flat: morning traffic and late afternoon traffic come from different intents, different devices and different stages of the purchase decision.

What you get is a textbook confound, and it is structural rather than statistical: the variable “arm” is now correlated with the variable “hour of day”. No p value adjustment repairs that, because it is not noise. It is bias, and it has a predictable direction, always favouring the arm that serves all day whenever the lost hours are the high rate ones.

The throttled arm only ever serves the low rate hoursA horizontal axis spans the 24 hours of one day. In the upper panel a step line shows conversion rate by hour band: it sits low, at one percent, from midnight until three in the afternoon, then rises to one point six percent from three in the afternoon until midnight. Below, two bars represent the two test arms. The bar for arm A spans all 24 hours and is labelled sixty thousand visitors at one point two four percent. The bar for arm B covers only the stretch up to three in the afternoon, with thirty six thousand visitors at one point zero five percent, and the remaining stretch is empty and dashed, labelled budget exhausted. A dashed vertical line marks three in the afternoon across both panels.the cap slices the day, and the day does not have a flat ratethe horizontal axis is one full day; the upper panel is conversion rate by hour bandrate1.0000%1.6000%arm Aserves all 24 hours: 60,000 visitors, 1.2400%arm B36,000 visitors, 1.0500%budget exhausted3 pmmidnightnoonmidnightarm B is not a random sample of the dayit is a sample of the hours that still had budget, and those hours convert worse
A budget cap does not shrink an arm evenly across the day. It erases the end of the day, and the end of the day usually converts at a different rate than the start.

It is worth separating two failures that look alike. An arm that gets less traffic uniformly across every hour only costs statistical power: the comparison stays honest, it just gets less sensitive. An arm that gets the same traffic up to a certain hour and nothing after costs validity. A daily cap produces the second situation, and that is the one that flips verdicts.

The caps the platforms actually document

Before any arithmetic, it helps to know that a daily budget is not a hard ceiling on either major platform. Both document explicitly that a single day can spend more than the number you typed, and each one compensates differently.

Google Ads states that on a given day, a campaign might spend up to twice the average daily budget to take advantage of fluctuations of traffic, and that at the end of the month you will have spent no more than 30.4 times the average daily budget. The documentation adds a detail that muddies reporting: in some circumstances the served costs, meaning the cost of all the clicks or impressions the campaign received, may exceed the daily or monthly spending limits, but the advertiser never actually pays more than those limits. In other words, the number in the delivery report and the number on the invoice can diverge, and for measurement purposes it is the first one that matters.

Meta works on a fixed weekly window instead. The documentation says the daily budget tells Meta an approximate amount to spend per day over the course of the week starting Sunday and ending Saturday. On days when better advertising opportunities are available, Meta may spend up to 75% over the daily budget. With ad set budget sharing turned on, it may additionally share up to 20% of the flexible daily budget with other ad sets, which works out to as much as 210% of the daily budget. The stated ceilings: for every day ending at midnight, spending will not exceed 175% of the daily budget; for every week ending Saturday at midnight, it will not exceed 7 times the daily budget.

platform budget entered one day ceiling period ceiling compensation period
Google Ads $500 per day (average) $1,000 (2 times) $15,200.00 per month (30.4 times) calendar month
Meta $100 per day $175 (175%) $700 per week (7 times) Sunday to Saturday
Meta, with ad set budget sharing $100 per day $210 (210%) $840 per week Sunday to Saturday

Meta documentation on budget sharing spells out the per ad set formulas: maximum spend on a day is the daily budget plus that day shared budget, multiplied by 1.75; maximum spend over the Sunday to Saturday week is the same sum multiplied by 7. It also states something that matters for testing: at a campaign level, spend remains the same whether budget sharing is on or off. Sharing redistributes between ad sets, it does not raise the total.

Three practical consequences follow.

The first is that the ceiling does not protect you from the problem in this guide, it makes it worse. If an arm can spend 175% of its budget on a given day, it runs dry earlier on the days the platform decides to accelerate, and its cutoff hour starts moving from one day to the next. An arm whose stopping time drifts across the week has an hourly mix that drifts with it.

The second is a calendar problem. Meta budget week is fixed, Sunday through Saturday. A test that starts on a Wednesday runs its first week under a different compensation rule than its second, because the first calendar week of the test straddles two budget weeks. That is a period effect, and it is confounded with the treatment effect. Start tests on the boundary of the platform budget week, not in the middle of it.

The third is that Google already discards data over this by default. According to the platform experiments FAQ, the first 7 days of data is discarded to account for the experiment ramp-up time. That is a design decision made by the platform rather than the advertiser, and it exists precisely because the start of a media experiment is not comparable with its middle.

Worked example: a winning treatment that reads as a loser

The numbers below came out of the same statistics engine that powers the calculators on this page.

The design: a landing page test with two arms running on paid media. Arm B was given a lower daily budget and exhausts it at 3 pm; arm A serves all day. The treatment applied to B is genuinely 5% better in relative terms than A rate, in every hour of the day. There is no hour interaction in the treatment at all: it is uniformly positive.

Base rates by hour band are identical for both arms before the treatment is applied:

hour band base rate note
midnight to 3 pm 1.0000% browsing traffic
3 pm to midnight 1.6000% decision traffic, 1.6 times the morning rate

The counts the test window produced:

arm midnight to 3 pm 3 pm to midnight total
A (uncapped) 360 of 36,000 384 of 24,000 744 of 60,000 = 1.2400%
B (throttled at 3 pm) 378 of 36,000 nothing served 378 of 36,000 = 1.0500%

Notice that in the band where both arms served, B converts better: 1.0500% against 1.0000%, which is exactly the 5% relative treatment. The effect is sitting right there, intact, in the only band where the comparison is legitimate.

Now the three possible readings of that same experiment, verbatim from the engine:

reading A B abs. diff. rel. lift z p 95% CI (pp) verdict
naive, full window 744/60,000 = 1.2400% 378/36,000 = 1.0500% -0.1900 pp -15.3226% -2.6518 0.008007 -0.3276 to -0.0524 A wins, significantly
correct, midnight to 3 pm only 360/36,000 = 1.0000% 378/36,000 = 1.0500% +0.0500 pp +5.0000% 0.6660 0.505404 -0.0971 to +0.1971 flat
counterfactual, B uncapped 744/60,000 = 1.2400% 781/60,000 = 1.3017% +0.0617 pp +4.9731% 0.9536 0.340311 -0.0651 to +0.1884 flat

The naive reading does not merely get the size wrong. It gets the sign wrong and is significant while doing so. A p value of 0.008007 with the whole confidence interval on the negative side looks exactly like a result you can act on, and the true effect is positive. Put that report in front of a decision meeting and the better page gets killed with convincing statistical backing.

To reproduce the table, enter 744 conversions out of 60,000 visitors against 378 out of 36,000 and the screen shows a -15.3% lift at p = 0.0080. Then switch to 360 out of 36,000 against 378 out of 36,000 and it shows +5.0% at p = 0.5054. Those are the table values, rounded. The same significance calculator runs both readings.

Statistical significance calculator
Control (A)
Variation (B)
Control (A) · Rate-
Variation (B) · Rate-
Relative lift-
p-value-
95% CI of the difference-

Two-sided two-proportion z-test. "Not significant" almost always means not enough sample, not that the versions are equal.

The arithmetic behind the inversion is a weighted average, and it is simple enough to fit on one line. Arm A carries 60.00% of its traffic in the 1.0000% band and 40.00% in the 1.6000% band:

36,000 x 1.0000% + 24,000 x 1.6000% = 360 + 384 = 744, and 744 / 60,000 = 1.2400%

Arm B carries 100.00% of its traffic in the weaker band. The 1.2400% figure for A is not A rate in any hour of the day: it is a blend of 1.0000% and 1.6000%, weighted by how much volume each band contributed. Comparing 1.2400% with 1.0500% compares two different blends of the clock, with the page itself entering as a rounding detail.

Where the 1.2400% of the all day arm comes fromTwo horizontal composition bars. The bar for arm A is split in two parts: sixty percent of its traffic in the one percent band and forty percent in the one point six percent band, with the resulting one point two four percent shown to the right. The bar for arm B is a single colour, with one hundred percent of its traffic in the one percent band and a result of one point zero five percent shown to the right. Below the bars, a horizontal scale runs from one percent to one point six percent and marks the position of both averages, showing that the average of arm A lands far above the average of arm B purely because of hourly composition.the average for A is a blend of hours, not a rateeach bar shows how that arm traffic splits across the two hour bandsarm A60.00% at 1.0000%40.00% at 1.6000%1.2400%arm B100.00% of its traffic in the 1.0000% band1.0500%B = 1.0500%A = 1.2400%1.0000%, morning band1.6000%, afternoon bandthe gap between those two marks is hourly mix, not page effectthe real page effect is the small step from 1.0000% to 1.0500%, and it points up
The 1.2400% for A and the 1.0500% for B are averages over different mixes. The only clean comparison lives inside a single hour band, where B wins by 5%.

The third row of the table closes the argument. In the counterfactual where B has no cap and serves the same 60,000 visits, it produces 781 conversions, a rate of 1.3017% against 1.2400% for A, a lift of 4.9731%. Remove the cap and the experiment returns the true effect. Every bit of the damage in the first row is the cap talking.

Sample ratio mismatch is the alarm, not the p value

The obvious question is how anyone catches this before making the wrong call. The answer is that the signal exists, it is cheap to compute, and it has nothing to do with the primary metric.

The test was designed to split traffic evenly. It came out 60,000 against 36,000, meaning 62.50% of traffic landed in a single arm instead of the intended 50%. A goodness of fit test on that split returns a z of 77.46, with a p value below 1 divided by 10 to the power of 300. There is no subtlety left to debate: a split like that does not happen by chance.

The working rule is deliberately blunt: no test with a sample ratio mismatch should be read, no matter how good the p value on the primary metric looks. The 0.008007 in the first row is not evidence for the conclusion, it is evidence that the bias is large. The stronger the imbalance, the more confident the wrong number looks. The mechanism and the diagnostics are laid out in sample ratio mismatch.

It is worth being precise about why the imbalance shows up here. There was no randomization failure, no instrumentation bug, no bot traffic. The randomization worked perfectly: every visitor who entered an auction had an equal chance of landing in either arm. What happened is that one arm stopped entering auctions after 3 pm. The imbalance is a downstream consequence of the budget, and that is exactly why it is such a good detector for this particular failure: the cause and the symptom are the same event.

How much power survives the clean window

Fixing the bias is easy: compare only the hours in which both arms served. What almost nobody computes is the price of that fix.

Sizing the correct reading, on a 1.00% baseline, two sided at 95% and 80% power:

relative MDE N per arm duration at 252,000 visitors per week
5.0000% 637,010 36 days
10.0000% 163,095 10 days
15.0000% 74,193 5 days

With the 36,000 per arm the clean window left behind, power to detect the true 5% is 9.78%. Put differently, even with the bias removed, that test had roughly a one in ten chance of finding an effect that was genuinely there. At 420,000 per arm power climbs to 62.36%, still short of the conventional 80%. Reaching 80% would take 637,010 per arm, nearly eighteen times what the clean window delivered.

The daily cap charges you twice: first it flips the verdict, then it destroys the power of the only window that was still usable. That pairing is especially nasty because each charge hides behind the other. Anyone who fixes the bias without re-running the power calculation trades a confident false positive for a quiet false negative, and concludes that the new page “made no difference”.

Power to detect the true 5% effect at three sample sizes per armThree stacked horizontal power meters, all of the same total width. The first, for thirty six thousand visitors per arm, is filled to only nine point seven eight percent. The second, for four hundred and twenty thousand per arm, is filled to sixty two point three six percent. The third, for six hundred and thirty seven thousand and ten per arm, is filled to eighty percent. A dashed vertical line marks the eighty percent level, the conventional power target, showing that only the third meter reaches it.how much power each sample size buys for the true 5% effect1.00% baseline, two sided at 95%, relative effect of 5.0000%80% target36,000 per armwhat the clean window left9.78%420,000 per armalmost 12 times the traffic62.36%637,010 per armwhat the sizing asked for80.00%trimming the window removes the bias and takes the power with ita confident false positive becomes a quiet false negative if nobody recomputes
At 36,000 per arm the test had no real chance of finding the effect that existed. Fixing the window is necessary, but it does not hand back the experiment you planned.

To reproduce the first row, enter a 1% baseline, a relative minimum detectable effect of 5%, 95% confidence and 80% power in the sample size calculator: the answer is 637,010 per arm.

Sample size calculator
-Visitors per variation
-Total (2 variations)
-Estimated duration

Two-proportion normal approximation, 2 variations (50/50). Tweak the inputs and watch it update live.

The most useful way to read that table is as planning, not autopsy. If the effect you expect is on the order of 5% relative on a 1% baseline, the test needs more than 1.2 million visitors across both arms. A design that lets one arm lose 40% of its traffic to a budget cap is burning an enormous share of its sample budget before it measures anything at all. The same reasoning shows up in how many visitors an A/B test needs and in minimum detectable effect.

Budget pacing itself cannot be tested by randomizing users

So far pacing has played the villain. It is worth flipping the question: what if pacing is the thing you actually want to measure?

Then the design changes completely, and the reason is stated in the literature. The authors of the LinkedIn budget pacing algorithm state that a per user A/B test will not do for evaluating pacing. Their argument is direct: the pacing algorithm affects a campaign budget spending for an entire day, so the same treatment has to be applied to that campaign for the entire day. Splitting traffic into two buckets is not enough, because the mechanism does not live in the user, it lives in the campaign and the day.

The natural alternative, splitting campaigns into two groups, does not close the gap either. It measures the advertiser benefit but not the revenue benefit to the publisher, because campaigns from both groups compete in the same auction. To see the whole effect, the algorithm has to be on for every campaign for the whole day.

Their stated solution was to run pacing on alternate days. That is a switchback design: the randomization unit becomes the day rather than the user or the campaign, and every unit receives both treatments over the course of the experiment. The price is the usual one for that design: few units, and day of week effects to control for.

Pacing evaluated on alternate days rather than by randomizing usersA row of fourteen numbered squares, one to fourteen, standing for fourteen consecutive days of an experiment. The odd numbered squares are dark and represent the days on which the pacing algorithm was on for every campaign. The even numbered squares are light and represent the days on which it was off for every campaign. A legend above explains the two colours and a note below records that the randomization unit is the whole day, because the treatment affects a campaign budget spending for the whole day.the randomization unit is the day, because the treatment lasts a daypacing on for every campaignpacing off for every campaign1234567891011121314consecutive days of the experimentrandomizing users measures the wrong mechanismand randomizing campaigns measures the advertiser but not the publisher,because campaigns from both groups compete in the same auction
When a treatment acts on a campaign for a whole day, the randomization unit has to be the day. Randomizing users inside the day never exposes the mechanism.

It is worth noting why they went to that trouble. The paper starts from the observation that a generalized second price auction, applied greedily to every impression, is suboptimal for both advertiser and publisher when the advertiser has a finite budget: high performing campaigns burn through their budget and drop out of the market early. That is precisely the mechanism in this guide, seen from the platform side.

Their chosen campaign lifetime metric is telling: time to exhaust 95% of budget, reported as a median in hours. The results on the Direct Ads product, over 2 weeks in the fourth quarter of 2013, with no sampling:

metric without pacing with pacing
median campaign lifetime 13.54 hours 19.50 hours
unique impressions per spend baseline +7.74%
number of campaigns served baseline +4.74%
cost per request baseline +5.67%
over delivery 3.8% 3.4%
unique campaigns seen per member baseline +0.15%

Median campaign lifetime rose 44%, from 13.54 to 19.50 hours. Translated into the problem in this guide: without pacing, the median campaign died before it completed 14 hours of the day, which is to say before 3 pm if it started at midnight. The scenario in the worked example is not a laboratory construction, it is roughly the median of a real system before it got a pacing algorithm.

The within day price effect is the other side of the same coin. With pacing on, cost per click sits lower early in the day and higher for a considerably longer stretch through the second half, because the algorithm deliberately throttles high performing campaigns early on, campaigns that would otherwise all compete at once and drain their budgets fast. Anyone measuring conversion by hour band needs to know this: the price of traffic is not flat across the day, and pacing flattens it on purpose.

Cost per click within the day, with and without pacingA line chart over a 24 hour axis. The line for no pacing starts high in the first hours of the day and then drops to a much lower level, where it stays until midnight, because the high performing campaigns exhausted their budgets and left the auction. The line for pacing on starts lower, rises gradually and then holds at an intermediate, higher level through the whole second half of the day. A legend identifies the two lines and a note below explains that the algorithm deliberately throttles strong campaigns early in the day.pacing flattens the price of traffic across the daywithout pacingwith pacinghighlowshort early spikehigher level for far longermidnightnoonmidnightwithout pacing the strong campaigns all compete at once and run dry early
Pacing is not neutral with respect to the clock: it changes both the price and the composition of traffic within the day, and that feeds into any test that compares hour bands.

The operational parameters they report give a sense of how granular this kind of system is: the pass-through rate starts at 10% for every campaign, the adjustment rate is a constant 10%, and the system updates roughly 12% of all campaigns every 7 seconds. A mechanism that adjusts on a seconds long cadence is not something a daily report can observe properly.

Where this ends and platform splits and Smart Bidding begin

Three guides on this blog cover adjacent ground, so it helps to draw the lines.

The randomization mechanism inside the platform belongs to ad platform split testing. How the platform divides users, whether the split is cookie based or per search, how it keeps one person inside a single arm: all of that comes before the problem in this guide.

A treatment that changes shape over the window belongs to Smart Bidding. There the issue is that the treated arm on day 3 is not the treated arm on day 30, because the optimizer recalibrated.

Here the issue is different and blunter: the arm stops serving partway through the day. It is not a change of shape, it is an absence. And the configuration choice that decides whether you fall into it at all comes before either of the other two.

The Google Ads experiments FAQ describes that choice explicitly. For certain Search, App and Display experiments, Google supports budget splits, while for some others, such as Performance Max, Demand Gen and Video, it supports a traffic split. The difference matters a great deal here:

split type what the platform divides throttling risk
budget split the total budget across the arms, for example 70% to control and 30% to treatment high: the 30% arm hits its ceiling long before the 70% arm does
traffic split the traffic, meaning how many times the ads enter auction low: both arms sit under the same budget constraint

The documentation also describes how the user split works: it occurs at the start of the experiment and Google systems try to ensure fairly balanced arms based on the probability of entering an auction, using cookie based or user based splits. Note the wording: balance on the probability of entering an auction, not on impressions actually served. If one arm runs out of budget, entry balance is still honoured while exit balance collapses. That gap is exactly what sample ratio mismatch catches.

A 70 to 30 split is a recipe for the failure in this guide whenever the two halves do not share the same exhaustion profile. If you have the choice, prefer a traffic split. If only a budget split is on offer, keep the division symmetric and watch both arms stopping times every day.

Two calendar notes finish the boundary. Google recommends running the experiment for at least 4 to 6 weeks, or longer if you have a long conversion delay, which interacts with the mechanism described in conversion lag. And it discards the first 7 days of data to account for ramp-up time. Long windows help against throttling in one sense, by diluting odd days, and hurt in another, by giving someone more opportunity to touch the budget mid-flight.

When the effect you care about is account wide, or when the arms would compete in the same auction regardless, the answer is to stop using the platform as the unit: that design lives in geo experiments. And when the question is which budget level maximises return rather than which page converts better, the two companion guides in this batch cover it: budget saturation deals with the response curve and the point where spending more stops paying, and budget reallocation deals with moving money between channels without being fooled by correlation.

Guardrail metrics

None of these is the primary metric of the test, and all of them should be checked before it. If any one of them fires, the primary metric is not interpretable.

signal what to watch what to do if it fires
timestamp of last event served per arm and per day, the hour of the last recorded event if one arm systematically stops earlier, it is capped; do not read the primary metric
share of traffic by hour band each arm fraction of traffic in each hour band, compared across arms any material divergence invalidates the full window comparison; trim to the intersection
limited by budget status the limitation flag the platform exposes, per day and per arm fix the budget and restart the window; a throttled arm is not a treated arm
visitor ratio between arms deviation from the planned split, with a goodness of fit test above your mismatch threshold, stop the analysis and find the cause
daily spend against the documented ceiling how many days hit 2 times the daily budget on Google, or 175% of it on Meta ceiling days are early stopping days; flag them and check whether they hit only one arm
over delivery the fraction of spend above plan, per arm asymmetry between arms means the platform is compensating differently in each one

The rule that covers all six: before comparing rates, confirm both arms were live during the same hours.

Common mistakes

Make this automatic with Donnu

The deeper fix is to take the sampling decision out of the media system entirely.

When randomization happens on your own page, after the click, the daily budget no longer decides who lands in which arm. It still decides how much traffic arrives and at what hours, but that falls on both arms equally, because both arms live inside the same traffic. It is the difference between a ceiling that biases and a ceiling that merely shrinks the sample, and only the second one is recoverable with more time.

With Donnu the experiment runs on your own site, with the analysis window and the trim rule declared before the test goes live, and the report shows the visitor ratio between arms next to the difference in rates, which is the order those two numbers need to be read in. Donnu is one option among several, and what does not change from tool to tool is the principle: if one arm stopped serving during hours the other one served, the number you read is not the treatment effect, it is the clock.

Frequently asked questions

The questions at the top of this page cover whether a daily cap breaks an A/B test, why a throttled arm looks worse than it is, how to spot an arm that hit its ceiling, whether trimming the window solves it, whether pacing itself can be tested, and how far above the stated daily budget a platform can actually spend.

References

Read also: Ad platform split testing · Smart Bidding · Switchback experiments · Sample ratio mismatch · Conversion lag · Geo experiments · Leia em português

Frequently asked questions

Does a daily budget cap break an A/B test?
It does, and in a way the p value will not flag. An arm that exhausts its budget partway through the day stops serving from that point on, so it never collects a random sample of the day. It collects a sample of the hours when budget still existed. Because conversion rate varies by hour, the throttled arm reaches the report with a different traffic mix than the other one, and the measured difference now carries time of day inside it. In this guide worked example, a treatment that was 5 percent better reads as 15.3226 percent worse, with a p value of 0.008007.
Why does the throttled arm look worse than it is?
Because it loses exactly the hours with the highest rate. In this example the morning band converts at 1.0000 percent and the afternoon band at 1.6000 percent, which is 1.6 times higher. The arm that serves all day ends up with 60 percent of its traffic in the weak band and 40 percent in the strong one, giving a weighted average of 1.2400 percent. The arm that stops at 3 pm has 100 percent of its traffic in the weak band. Comparing the two reads the clock, not the page.
How do I tell whether an arm hit its budget cap?
Three signals settle it, and none of them is your primary metric. First, the timestamp of the last event served per arm per day: if one arm always stops at the same hour and the other does not, it is capped. Second, each arm share of traffic by hour band, which should look alike across arms. Third, the visitor ratio between arms, that is, sample ratio mismatch, which in this example yields a z of 77.46. Both major platforms also expose a limited by budget status worth checking daily.
Can I fix it by trimming the analysis window?
Trimming fixes the bias but does not give the power back. Compare only the hours when both arms served and this example reads 1.0000 percent against 1.0500 percent, a 5.0000 percent lift with a p value of 0.505404, which is the true effect. The catch is that only 36,000 visitors per arm survive the trim, and at that size power to detect the true 5 percent is 9.78 percent. The cutoff also has to be declared before anyone looks at the numbers, otherwise it stops being design and becomes data selection.
Can I test budget pacing itself?
You can, but not with user level randomization. The authors of the LinkedIn budget pacing algorithm state that a per user A/B test will not do, because the algorithm affects a campaign budget spending for an entire day, so the same treatment has to apply to the whole campaign for the whole day. Splitting campaigns into two groups measures the advertiser benefit but not the publisher benefit, because campaigns from both groups land in the same auction. Their stated solution was to run pacing on alternate days, which is a switchback design.
How far above the daily budget can a platform actually spend?
Further than most test plans assume. Google Ads states that on a given day a campaign may spend up to twice the average daily budget, and that by the end of the month the total will be no more than 30.4 times that budget. Meta states it may spend up to 75 percent over the daily budget on a given day, with caps of 175 percent per day and 7 times the daily budget per week running Sunday through Saturday. With ad set budget sharing turned on, those caps rise to 210 percent per day and 840 percent per week.