Proration
Proration is how Pinion values a subscription line whose coverage doesn’t
align to whole billing periods. Whenever a line covers a partial period at a
contract edge — a subscription that starts or ends mid-period, a per-segment
partial in a multi-dimensional (MDQ) ramp, or an amendment that changes
price part-way through a term — the billable term factor is scaled to the
fraction of the period actually covered. A full period is 1.0; a partial
period is somewhere between 0 and 1.0.
This is a general subscription concept, not an MDQ-only feature. A plain single-dimension subscription prorates its partial first or last period the same way a multi-segment MDQ line prorates each segment, and the same way an amendment mid-term price change prorates the delta.
The Proration Type field
Each subscription product carries a Proration Type (ProrationType__c) —
Daily, Weekly, Monthly, or Quarterly. Leave it blank on a product
and Pinion falls back to the org-wide Default Proration Type in Configurator
Settings (DefaultProrationType__c), which itself defaults to Daily.
Think of Proration Type as a granularity floor — the smallest unit Pinion prorates a partial period down to:
Daily → Weekly → Monthly → Quarterly is finest → coarsest.
A finer type prorates a partial period by exact days; a coarser type rounds the
partial period down to completed whole units. The reference period each factor
is measured against comes from the product’s subscription term unit
(SubscriptionTermUnit__c — Week, Month, Quarter, or Year).
How each type computes the term factor
Let the covered range be [start, end] (both inclusive):
| Proration Type | How the term factor is computed | In plain English |
|---|---|---|
| Daily | covered days ÷ reference days for the term unit (Year 365 · Quarter 91 · Month 30 · Week 7) | pure day count — prorates by the exact days |
| Weekly | covered days ÷ 7 | pure week count (term-unit-independent) |
| Monthly | whole months count as 1.0; the partial month at an edge prorates by days (remaining days ÷ 30) | full months are whole; the leftover part-month bills by day |
| Quarterly | whole quarters count as 1.0; a partial quarter prorates by whole completed months — floor(completed months) ÷ 3, with no day remainder | full quarters are whole; a part-quarter bills only for whole months elapsed, ignoring leftover days |
| (blank) | → the org Default Proration Type (DefaultProrationType__c; Daily out of the box) | resolve to the org default before any of the above |
Monthly and Quarterly are genuinely different
Quarterly is the coarser floor: it prorates a partial quarter by the whole completed months and drops the leftover days entirely. Monthly keeps the leftover days and prorates them on a 30-day convention. On the same partial period the two produce different factors:
- A partial quarter of 1 month + 12 days bills as
1 ÷ 3 = 0.33under Quarterly (only the one completed month counts), but as(1 + 12/30) ÷ 3 = 0.47under Monthly (the 12 leftover days prorate). - A partial quarter of 2 months + 29 days is
2 ÷ 3 = 0.67under Quarterly.
Pick the coarser type when a product should round partial periods down to completed units rather than bill fractional days.
So a ~6-month partial of an annual subscription is not universally 0.5.
Under Daily (the default) it is days ÷ 365 — e.g. 183 ÷ 365 ≈ 0.50, moving
with the exact day count. Under Monthly it is whole-months plus a /30
remainder at the edge; under Quarterly it is whole-completed-months with no
day remainder.
Daily uses a fixed 365-day year (leap years)
Daily proration always divides by 365 days per year — it does not add a day
for a leap year. So a whole-year term whose date range crosses a leap day covers
one more day than 365 × N, and the term factor lands slightly above the
nominal whole number. A 3-year Daily term that spans a leap day computes about
3.01 rather than 3.00, and a static add-on (Accessory) on that line then
shows a quantity of 3.01. This is the exact-day-count behavior working as
intended, not an error — the extra billed fraction is the real extra day.
If you want whole-year commitments to bill an exact whole number of periods regardless of leap days, set the product’s Proration Type to Monthly or Quarterly. Both count whole calendar months, so an N-year term is exactly N. Reserve Daily for deals where billing should follow the precise day count.
Blank fallback
A blank ProrationType__c falls back to the org-wide Default Proration Type
(DefaultProrationType__c, itself Daily out of the box). Both the
segment-quantity path (what a quote persists per line/segment) and the
amendment mid-term price path now resolve a blank product the same way and
share one proration kernel, so a product left blank prorates consistently
across quoting and amendments. Setting ProrationType__c explicitly is still
recommended when a product should bill differently from the org default.
Where proration shows up
- Single-dimension subscriptions — a line that starts or ends mid-period prorates its partial period’s billable quantity.
- MDQ ramps — each segment prorates its own partial period; a partial final segment carries a fractional effective quantity.
- Amendment mid-term price changes — an amendment’s prorated price delta is scaled by the remaining term from the effective date, using the same Proration Type. See Renewals & Amendments.
Related
- MDQ — Multi-Dimensional Quoting — per-segment proration in a ramp.
- Renewals & Amendments — amendment mid-term re-pricing.
- Lifecycle Defaults — the org-wide
DefaultProrationType__cfallback.