Overview
Pacing periods let you express a non-flat campaign flight as a sequence of dated periods, each with its own spend intensity. Use them when a campaign needs to spend more during a holiday window, less during a quiet stretch, or explicit dollar amounts in specific months. When a campaign with pacing periods executes, every selected product is automatically split into one package per period, with budget allocated according to the schedule. The campaign-level pacing schedule is the source of truth — you do not have to compute or set per-package budgets yourself.Weight mode
Express each period as a relative multiplier (
1.0 = normal, 2.5 = 150%
heavier). Scope3 distributes the campaign budget proportionally by
days × weight.Budget mode
Set explicit dollar amounts per period. Useful when finance hands you a
monthly spend plan you must hit exactly.
Concept
ApacingPeriods object has two fields:
| Field | Description |
|---|---|
mode | "weight" or "budget" |
periods[] | Ordered, non-overlapping list of dated periods |
| Field | Required when | Description |
|---|---|---|
label | Always | Human-readable name (e.g. "Memorial Day Heavy-Up") |
start | Always | Inclusive YYYY-MM-DD start date |
end | Always | Inclusive YYYY-MM-DD end date |
weight | mode = "weight" | Positive number ≤ 10 (relative intensity) |
budget | mode = "budget" | Positive dollar amount |
How to use
Weight mode
Weight mode is the most common: declare the shape, let Scope3 do the math.days × weight.
Budget mode
Budget mode pins explicit dollars to each period. The sum of period budgets must not exceedbudget.total on the campaign — anything left over stays as
unallocated headroom.
Updating a schedule
PUT /api/buyer/campaigns/:id accepts the full pacingPeriods object. To
clear an existing schedule, send "pacingPeriods": null.
Response shape
CampaignGET responses surface the schedule with resolved budgets for
every period. In weight mode, the resolved dollar amount is computed by
(days × weight) proportional split of budget.total; weights are preserved
alongside the resolved budget so you can audit the math.
unallocatedBudget is the dollar gap between mediaBudget.total and the sum
of active media buy budgets — it tells you how much room is left for new
media buys to fill the schedule.
Automatic package splitting
When a campaign with pacing periods executes:Resolve per-product budgets
Each selected product gets a budget — either set by the user or derived
from a discovery proposal.
Split per period
For every product, Scope3 creates one package per pacing period. In weight
mode, the per-period budget is
(days × weight) / sum(all weighted days) × product_budget. In budget mode,
each period’s fixed budget is split across products proportionally to
each product’s share of total product budgets.Round to last
Each period after the first uses banker’s rounding to two decimals; the
last period absorbs any rounding remainder so per-product totals match
exactly.
Validation
The campaign endpoints validatepacingPeriods against the campaign before
saving:
- Date order: every period’s
startmust be ≤end. - Inside flight: every period must lie within
flightDates.startDateandflightDates.endDate. - No overlaps: when sorted by
start, no period may begin on or before the previous period’send. - Budget sum (budget mode): the sum of period budgets must not exceed
budget.total. - Required fields per mode: weight periods need a
weight; budget periods need abudget. - Update safety: a period that has already started cannot be changed or removed; the mode cannot change while any period is in progress or past.
Best practices
- Start in weight mode. It’s easier to reason about “2× during the holiday week” than to recompute exact dollar splits when the budget moves.
- Use labels generously. Period labels show up in package metadata and in
reporting — names like
"July 4th heavy"beat"Period 2". - Keep periods aligned with media buy intent. A media buy can have any start/end inside the campaign flight, but matching its dates to a period boundary keeps reporting clean.
- Treat gaps as pauses. If you don’t want spend on July 16–18, leave that
range out of
periodsrather than settingweight: 0(which is rejected as non-positive). - Plan ahead — past periods are immutable. Once a period starts, its shape is locked. Front-load decisions you might need to revisit.
- Cap period count. The schema allows up to 52 periods; in practice, monthly or weekly granularity is plenty.
Limits
| Limit | Value |
|---|---|
| Periods per campaign | 1–52 |
weight range | (0, 10] |
budget per period | Positive dollar amount |
budget sum (budget mode) | ≤ budget.total |
| Max label length | 100 characters |
| Date format | YYYY-MM-DD (UTC, inclusive on both ends) |