Subscription Plans
1. Plan Overview
Plans define the public-facing subscription offerings with pricing, packages, and add-ons.
Basic Fields
- Name - Plan name (required, tracked, translatable)
- URL String - URL-friendly identifier, e.g.,
starter-plan(required, unique) - Plan URL - Full URL path, computed as
/saas/plans/<url_string> - Description - Plan description HTML (translatable)
- Image - Plan image/logo (attachment)
- Badge Text - Promotional badge, e.g.,
Popular - Features HTML - Features list for display (translatable)
- Sequence - Display ordering (default: 10)
- Published - Whether visible on the website (default: False, tracked)
- Active - Archive toggle (default: True)
- Color - Color picker value
- Product - Linked product template for sale orders (tracked)
- Allowed Domain - Base domain for subscriptions, e.g.,
example.com(required) - Subscription Type - Deployment type:
none(extended by Docker/DB Filter modules) - Auto Create Subscription - Auto-create after payment (default: True)
- Currency - Pricing currency (default: company currency)
- Database Template - Pre-built database to restore (optional)
- Allow Multiple Package Selection - When enabled, customers may pick several packages on the plan page; when disabled, exactly one package must be chosen (default: True, tracked)
URL String rules
Lowercase letters, digits and hyphens only — no leading/trailing hyphen and no consecutive hyphens (basic-plan, enterprise-pro). It is unique across all plans and is auto-generated from the plan name when left empty.
2. Billing Periods
Each plan defines which billing periods are available.
- Period - Billing cycle (required):
Monthly,Quarterly(3 months),Semi-Annual(6 months),Yearly
- Sequence - Display order (default: 10)
- Is Default - Pre-selected period on the website (default: False)
3. Package Lines
Packages available within a plan, with custom display and pricing.
- Package - Reference to a subscription package (required)
- Custom Display Name - Override name for the website (translatable)
- Description - Short description (translatable)
- Image - Package image (attachment)
- Icon - Font Awesome icon class
- Sequence - Display order (default: 10)
- Pricing - Price per billing period (One2many)
Package Pricing
- Period - Billing period (required)
- Price - Package price for that period (required)
4. Versions
The Odoo versions a plan is offered in. The customer picks exactly one; the choice carries a price and decides where the subscription is deployed.
- Name - Version label shown to customers, e.g.
Odoo 18.0(required, translatable) - Description - Short description for website display (translatable)
- Sequence - Display order (default: 10)
- Default - Pre-selected version on the website (default: False)
- Active - Archive toggle (default: True)
- Pricing - Price per billing period (One2many, same shape as package pricing)
Deployment Target per Version
The deployment modules add the field that turns a version into a real target:
| Module | Field | Meaning |
|---|---|---|
sadeem_subscription_website_docker |
Docker Image (sadeem.portainer.image) |
Image used to create subscriptions for this version |
sadeem_subscription_website_dbfilter |
Server Group (sadeem.dbfilter.server.group) |
Server group that hosts subscriptions for this version |
Version price is added on top
Total = selected packages + selected version + add-ons, all for the chosen billing period. A version with no price for a period simply contributes 0, but publishing is blocked until every version has pricing for every available period.
The selected version drives provisioning
If the version's Docker image or server group is missing at checkout, order confirmation fails with "Docker image is not configured for the selected version." / "Server group is not configured for the selected version." — configure it before publishing.
5. Add-ons
Configurable extras like additional storage, users, or stages with step-based pricing.
- Name - Add-on name (translatable)
- Add-on Type - Category:
storage,users,stages(extended by Docker withworkers) - Included Value - Amount included in base price (default: 0)
- Step Value - Increment step (default: 1)
- Min Value - Minimum configurable value (default: 0)
- Max Value - Maximum configurable value (default: 100)
- Unit Label - Display unit, e.g.,
GB,Users - Icon - Font Awesome icon class
- Sequence - Display order (default: 10)
- Pricing - Price per step per billing period (One2many)
Add-on Pricing
- Period - Billing period (required)
- Price Per Step - Cost for each step above the included value (required)
Pricing Calculation
Add-on cost = max(0, quantity - included_value) / step_value * price_per_step. Only the portion above the included value is charged.
6. Publishing Validation
Before a plan can be published, the system validates:
- The subscription type is set to Docker or DB Filter (not
none) - A product is linked
- An allowed domain is set
- At least one package line exists
- At least one billing period exists
- At least one version exists
- All package lines have pricing for all available periods
- All add-ons have pricing for all available periods
- All versions have pricing for all available periods
- Docker: every version has a Docker image — DBFilter: every version has a server group
Validation also runs on published plans
The same checks re-run whenever a published plan's periods, packages, add-ons or versions change. Adding a new billing period to a live plan therefore fails until pricing exists for it everywhere — add the pricing in the same save, or unpublish first.