Discount after pricing resolves.
A discount never changes the underlying rate. It is a named, time-bound deduction applied on top of whatever price the resolver chain already produced — computed at invoice-line time, fully audited, and reversible without touching the base pricing at all.
Definitions vs. instances
Discounting uses a library/instance split, the same shape as a coupon template versus a redemption:
Stopping a definition blocks it from being applied again but leaves existing instances untouched. Archiving is destructive to any still-active instance built from it — the dashboard runs a check and shows you exactly which subscriptions would lose their discount before you confirm.
Source: reusable vs. one-off
Independent of duration — where an instance’s terms come from when you apply it from a subscription’s Discounts card, while creating a subscription, or by asking the Revvly Assistant.
Reach for a library discount when you expect to grant the same terms to more than one customer — a launch promo, a referral credit, a standard win-back offer — so it shows up in the tenant-wide analytics and expiring-discounts view as one named thing across every subscription it’s applied to. Reach for a one-off when the terms are truly bespoke to this customer and you have no intention of reusing them — a support-escalation credit, a one-time goodwill gesture, a rate negotiated in a call that doesn’t belong in the shared library. A one-off can still use any duration, including FOREVER; “one-off” describes where the terms are defined, not how long the discount lasts.
Either way, applying an instance to a subscription requires a reason, and both paths are cancellable independently — cancelling a one-off has no effect on anyone else, since nothing about it was ever shared.
Duration
How long an instance keeps applying once it’s attached to a subscription.
Stacking
What happens when more than one discount is active on the same target at once (for example two base-price discounts), set per-subscription via discountStackingMode. Discounts on different targets never compete: a base-price discount and a component discount both apply. A discount that loses under the stacking mode is not invoiced and does not use up any of its duration.
Amount and options
Every discount, whether from the library or one-off, can be shaped with these settings when you apply it.
Discounts never take a line below zero: a fixed amount larger than what is left just consumes the rest. A discount takes effect from the next invoice generated; invoices already issued are not rewritten. You can later overwrite an active instance’s value, duration or options on that subscription only, which leaves the library definition and other subscriptions alone, or cancel it, which is prospective.
Where it applies
Invoice generation runs the normal pricing chain first — Custom Pricing Agreement resolution, scope walk, included-quantity netting — and produces line items exactly as it would with no discounts at all. Only then are active discount instances applied, strictly last, against the target they were attached to (base price, one Variable Component, or the whole invoice). A whole-invoice discount is applied last of all, to every line after the base-price and component discounts have taken their share, one-time fees included. The base-price lines of a multi-module plan, and the per-tier lines of a graduated Variable Component, are each discounted as one target and the result is shared back across the lines, so a fixed amount comes off once, not once per line. The pre-discount amount and each discount’s contribution are preserved on the invoice line so a customer’s bill always shows what changed and why.
- Pricing chain resolvesAgreement, scope walk, included-quantity netting.
- Lines are builtSame lines as with no discounts at all.
- Base and component discountsEach target is discounted as one group across its lines.
- Whole-invoice discountLast of all, every line including one-time fees.
By default, a discount also reduces mid-cycle adjustment invoices — expansions and overage invoices. Turn off its applyToAdjustments flag to limit a discount to standard start and renewal invoices; adjustment invoices are then left at full price. Either way only start and renewal invoices use up a counted duration.
Lifecycle on renewal
A counted instance (first invoice only, or a fixed number) only advances its applied-renewal counter, and only auto-expires, after the invoice it discounted has actually been generated and persisted — never speculatively. This keeps a failed or retried invoice run from burning down a customer’s remaining discounted renewals. Every apply, cancel, expiry, and the renewal that consumes a count is written to an immutable Discount History log, separate from the general Lifecycle Event log.
Previewing before you commit
Because the math is a pure function of (resolved price, active instances, stacking mode), Revvly can show the effect of a discount before it is ever applied to a real invoice. The dashboard’s discount preview walks the same calculation used at billing time and shows the pre-discount amount, each discount’s deduction, and the final amount per target — so you can see next month’s bill before saving anything.