---
title: "The Bundle-Ceiling Model: Separating Subscription and Per-Event Cost"
canonical: https://dxdev.com/blog/bundle-ceiling-saas-pricing-decouple-subscription-from-per-event/
datePublished: 2026-04-10
---
The legacy tournament pricing on the sports platform I run had a top tier that read, on screen, as "the 200-team plan." It wasn't. It was a custom domain, a registration tool, and 200-team capacity, all bundled into one number and keyed off a single team-count slider. An org that ran one 200-team weekend a year sat on that price for the other eleven months, when they touched none of the three things they were paying for.

I worked through the prototype and recorded the architecture decision on 2026-04-10.

## What the slider actually hid

The old model had a defensible surface logic: more teams, higher tier, bigger event costs more. Underneath it, three things were tangled together that had no business sharing an axis.

The event itself, 200 teams checking in over a weekend, brackets, the registration crush, is a one-time operational burst. The slider charged for it as a permanent monthly state. Feature access (custom domain, registration tool, newsletter) had nothing to do with team count, but it rode the same number, so a ten-team league that wanted a custom domain had to buy capacity it would never use to get it. And because features and capacity moved together, there was no legible next step. "I outgrew my event size" and "I want a custom domain" were the same upgrade button.

A purely per-team model was another option. It would reduce the feeling of paying for unused capacity, but it would also make the relationship between ongoing platform access and occasional event operations less explicit. I recorded that as a tradeoff rather than treating either model as universally correct.

## The rule underneath the tiers

The redesign used two layers: a recurring membership that governed feature access and a per-event bundle that covered an individual tournament. The specific prices and bundle names were prototype decisions from that period, not a current public price list.

Two layers alone could have created an unreadable grid of separate caps on event count, team count, storage, and feature flags. The simplifying constraint was that membership eligibility determined which event bundles were available. That made the selection rule visible without turning every combination into a separate quota check.

The ceiling is the gate, not a discount stacked on top of a cap.

## The implementation sequence

The design emerged through a prototype path that kept the live checkout unchanged while the new flow was built and reviewed. The first attempt used a standalone pricing page, then was reversed when it became clear that it could not share checkout state without duplicating too much behavior.

The meaningful work followed in small visible changes: introduce the bundle model, make eligibility visible, connect the event flow to the existing membership path, and record the architecture decision. The higher-risk work was not the bundle picker. It was reconciling a recurring-membership adjustment with a one-time event cart in the existing checkout flow. That needed explicit tests for the account states the prototype had initially ignored.

## What the same commit broke, twelve days later

The redesign also exposed a shared-view regression: a related package surface received markup changes without the corresponding presentation assets. That did not invalidate the pricing decision, but it showed why a cross-cutting change needs a broader verification map than the feature it was designed to improve.

The decision record named conditions that would justify reopening the model, including weak conversion at entry tiers, low use of higher tiers, and repeated confusion around the bundle picker. Those are hypotheses to measure after release, not evidence that the model is settled forever.

## Related

- [Don't Build a Paywall, Reuse the Gate You Already Have](reuse-the-gate-feature-gating-via-minpkg): the feature-gate layer that supports membership-eligibility rules
- [The Pricing Rewrite Only Got Real When I Wrote the Gates](2026-04-10_pricing-real-when-gates-shipped): the companion account of how the prototype met checkout, account-state, and entitlement constraints
