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 | each complete month counts as its share of the term unit (1/12 of a Year, 1/3 of a Quarter, 1 Month), so a complete unit is 1.0; only a partial month’s days prorate, against that month’s real length (Week: covered days ÷ 7) | whole months are whole; only a part-month bills by day |
| 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. - A month only counts as completed once its full length has passed. An
11-day range from September 25 to October 5 completes no month, so under
Quarterly it bills
0.
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) six whole months are exactly 6 ÷ 12 = 0.50, and
only a part-month on top of them prorates by its days. Under Monthly it is
whole-months plus a /30 remainder at the edge; under Quarterly it is
whole-completed-months with no day remainder.
A complete period always bills exactly 1
Under Daily, every complete term unit the range covers counts as exactly
1.0, however many calendar days that unit happens to have. A whole 31-day
month on a Month term unit is 1.00, and so is a whole February. A whole year
is 1.00 whether or not it contains February 29, so a 3-year term is 3.00
and a 6-year term that crosses two leap days is 6.00.
A term that is not a whole number of units counts its whole months as whole
months. On a Year term unit each complete month is 1 ÷ 12 of a year, and on a
Quarter term unit 1 ÷ 3 of a quarter:
- 14 months on a Year term unit: 1 year and 2 months,
14 ÷ 12 = 1.17. - 18 months on a Year term unit:
18 ÷ 12 = 1.50. - 7 months on a Quarter term unit:
7 ÷ 3 = 2.33.
Only a partial month prorates by days, against the real length of that month. That happens when a range starts or ends partway through a month, for example a co-termed contract or an amendment that takes effect mid-month:
- 15 days at the start of January on a Month term unit:
15 ÷ 31 = 0.48. - 14 months and 10 days from January 1, 2026 on a Year term unit: 14 whole
months plus 10 days of 31-day March,
(14 + 10 ÷ 31) ÷ 12 = 1.19. - 3 years and 1 day from September 25, 2026: 36 whole months plus one day
of a 30-day month,
(36 + 1 ÷ 30) ÷ 12 = 3.00.
A Week term unit has no months to count. It stays covered days ÷ 7.
A segmented MDQ line and a plain subscription line covering the same calendar period bill the same term.
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. The remaining window is valued exactly as a standalone line over that window would be, then divided by the value of the whole contract. 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.