Build log: adding a $29 plan for indie developers without breaking billing
Why RankPropel added a cheaper plan instead of a discount code, the billing check that would have locked out discounted customers, and the database change it needed.
RankPropel's agent service launched with two monthly plans: Business at $99 and Agency at $299. For an indie developer with one website, $99 a month is a lot to try a tool. We added a third plan, Indie, at $29. This log covers why it is a plan and not a coupon, what the code needed and what we have not measured yet.
Status, October 13, 2026. The plan is live. No one has bought it yet, so this article reports a shipped change, not a result.
Before

The cheapest recurring option was $99. The page described a "smaller plan for a single business", but nothing addressed solo developers or small studios.
Why not a discount code?
A promotion code was the obvious shortcut. Reading our own entitlement check ruled it out. Every paid request re-reads the subscription from Stripe and requires the latest invoice to have paid at least the plan's list price. A 50% code produces a paid $49.50 invoice, so the check would deny access to a customer who paid exactly what we offered. A 100% code fails a separate check that requires a real card payment.
The safe options were to change that check or to sell a separate price. We did both. A separate plan does not require anyone to prove they are "indie". The check now asks a better question: was this invoice paid in full for what it actually billed? A discounted invoice paid in full keeps access, a fully discounted invoice needs no card payment, and refunds or disputes on any money charged still remove access.
What changed
- One new plan definition. Indie keeps every feature and lowers the monthly allowance: 1 website, 1 seat, 75 page evaluations, 8 audit reports and 1,500 agent requests. Anyone who audits more than a few pages a month still fits Business better.
- A database migration. The plan column only accepted
businessoragency. SQLite cannot change that kind of constraint in place, so two tables were rebuilt. Our first draft copied rows into a new table and renamed it, which failed the foreign-key check: rows that referenced the old table were still counted as broken. Recreating each table under its original name and refilling it passed. We rehearsed the migration on a local copy with sample data and recorded a restore point before running it in production. - A Stripe price that matches the code exactly. Checkout refuses to start if the Stripe amount differs from the plan in code, so a mistyped price fails closed instead of undercharging.
- Tests. New tests cover the migration, the Indie price, allowance and checkout, and discounted, fully discounted and refunded subscriptions. All 96 tests pass.
After

What we will measure
We will report Indie signups, upgrades from Indie to Business and any change in Business signups once there are enough subscribers to compare. Until then, this is a pricing decision with a clear rationale and no outcome yet.