Skip to content

Subscription Plans

1. Plan Overview

Plans define the public-facing subscription offerings with pricing, packages, and add-ons.

Basic Fields

  1. Name - Plan name (required, tracked, translatable)
  2. URL String - URL-friendly identifier, e.g., starter-plan (required, unique)
  3. Plan URL - Full URL path, computed as /saas/plans/<url_string>
  4. Description - Plan description HTML (translatable)
  5. Image - Plan image/logo (attachment)
  6. Badge Text - Promotional badge, e.g., Popular
  7. Features HTML - Features list for display (translatable)
  8. Sequence - Display ordering (default: 10)
  9. Published - Whether visible on the website (default: False, tracked)
  10. Active - Archive toggle (default: True)
  11. Color - Color picker value
  12. Product - Linked product template for sale orders (tracked)
  13. Allowed Domain - Base domain for subscriptions, e.g., example.com (required)
  14. Subscription Type - Deployment type: none (extended by Docker/DB Filter modules)
  15. Auto Create Subscription - Auto-create after payment (default: True)
  16. Currency - Pricing currency (default: company currency)
  17. Database Template - Pre-built database to restore (optional)
  18. 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.

  1. Period - Billing cycle (required):
    • Monthly, Quarterly (3 months), Semi-Annual (6 months), Yearly
  2. Sequence - Display order (default: 10)
  3. Is Default - Pre-selected period on the website (default: False)

3. Package Lines

Packages available within a plan, with custom display and pricing.

  1. Package - Reference to a subscription package (required)
  2. Custom Display Name - Override name for the website (translatable)
  3. Description - Short description (translatable)
  4. Image - Package image (attachment)
  5. Icon - Font Awesome icon class
  6. Sequence - Display order (default: 10)
  7. Pricing - Price per billing period (One2many)

Package Pricing

  1. Period - Billing period (required)
  2. 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.

  1. Name - Version label shown to customers, e.g. Odoo 18.0 (required, translatable)
  2. Description - Short description for website display (translatable)
  3. Sequence - Display order (default: 10)
  4. Default - Pre-selected version on the website (default: False)
  5. Active - Archive toggle (default: True)
  6. 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.

  1. Name - Add-on name (translatable)
  2. Add-on Type - Category: storage, users, stages (extended by Docker with workers)
  3. Included Value - Amount included in base price (default: 0)
  4. Step Value - Increment step (default: 1)
  5. Min Value - Minimum configurable value (default: 0)
  6. Max Value - Maximum configurable value (default: 100)
  7. Unit Label - Display unit, e.g., GB, Users
  8. Icon - Font Awesome icon class
  9. Sequence - Display order (default: 10)
  10. Pricing - Price per step per billing period (One2many)

Add-on Pricing

  1. Period - Billing period (required)
  2. 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.