A subscriber's price is not a live lookup of the product's base price. Product, plan, package and purchased subscription hold different values, which can legitimately differ.
| Record | Price responsibility |
|---|
Product | Base price copied when adding the product to a plan; current tax used when constructing new order items. |
SubscriptionPlanProduct | Recurring price for that product in a plan. |
PackageProduct | Starting price for that product in a package. |
MemberPackageProduct | Stored starting and recurring product prices for the purchased subscription. |
MemberPackage | Subscription-level current-period and recurring totals. |
The plan picker copies Product.price; it does not create a price reference that stays synchronized. In the ordinary package-purchase mapping, MemberPackageProduct.price comes from the package product and recurringPrice from the plan product. Supported manual prices override that mapping. · .
For a fictional product with base price NOK 199, a plan product at NOK 199 and a package product at NOK 99, an ordinary package purchase stores NOK 99 as the starting product price and NOK 199 as its recurring price. A later product-base edit does not rewrite those stored prices. New order items still read the product's current tax. .
A plan-price edit has a separate propagation path. It can update subscriptions and updates a linked package product when its price equals the previous plan-product price. A different starting price, such as NOK 99, remains unchanged. A successful plan save does not establish that subscription propagation has completed. The Subscription plans reference below explains the branches. .
At renewal, the checked transaction updates the subscription's currentPrice from its recurringPrice. That is separate from the product-row starting price retained in MemberPackageProduct.price. .
Use Products for tax, seats and access behavior; Subscription plans for recurring-price changes and in-use restrictions; Product packages for starting terms, totals and checkout availability.
Source inspected at 932b0744713157826f0441fe1909d96dfede9f9a on 28 September 2026. Examples are source-derived; deployment and runtime outcomes were not verified.