<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Price Versioning on StackOnward</title><link>https://stackonward.com/tags/price-versioning/</link><description>Recent content in Price Versioning on StackOnward</description><generator>Hugo</generator><language>en-US</language><lastBuildDate>Fri, 11 Sep 2026 04:18:00 +0800</lastBuildDate><atom:link href="https://stackonward.com/tags/price-versioning/index.xml" rel="self" type="application/rss+xml"/><item><title>How to Model SaaS Products, Plans, and Prices</title><link>https://stackonward.com/posts/product-plan-price-saas-catalog-modeling/</link><pubDate>Fri, 11 Sep 2026 04:18:00 +0800</pubDate><guid>https://stackonward.com/posts/product-plan-price-saas-catalog-modeling/</guid><description>&lt;p&gt;RouteNest is about to raise Pro monthly from $19 to $24. If the system stores one mutable row—&lt;code&gt;plan=pro, price=19, stripe_price_id=...&lt;/code&gt;—writing 24 over 19 removes the basis for existing subscriptions. Whether the $190 annual price moves, whether the euro price is recomputed, which amount &lt;code&gt;WELCOME20&lt;/code&gt; discounts, and which Paddle or Creem object to charge all become guesses.&lt;/p&gt;
&lt;p&gt;How to model SaaS products and prices depends on when each fact changes. Product says what is sold. Plan says which features and limits the buyer receives. Price says amount, currency, interval, and version. A promotion only changes a qualifying sale. A provider mapping only projects an internal Price onto a payment channel. Orders and subscriptions must store the snapshot from the sale; they cannot reread &amp;ldquo;the current price&amp;rdquo; to explain the past.&lt;/p&gt;</description></item></channel></rss>