Skip to main content
A Pricing Module lives inside a Pricing Context and supplies the actual prices, calculation rules, and billing logic. Where the context defines what components exist, a pricing module defines what those components do.

Pricing Module Fields

Every Pricing Module has the following fields:
Visibility and Plan are independent. A module with Plan unmarked but Visibility set to Public still appears in the customer’s portal, but with no subscribe button and no “Contact Us” prompt—since no one, not even an admin, can create a subscription from it, there’s genuinely no action to offer.

Creating a Pricing Module

A Pricing Context is the prerequisite, set that up first:
Screenshot From 2026 05 22 11 09 35
Setup Pricing Context → From there:
  1. Click on the Plan Variants tab.
Screenshot From 2026 05 22 11 27 23
  1. Click Add Plan Variant and set the fields covered above (Name, Code, Label, Description, Pricing Module Type, Visibility, Plan check, Custom check).
Screenshot From 2026 05 22 12 17 34
  1. Assign Security Attributes if this module needs to be scoped (see Security below).
Screenshot From 2026 05 22 15 28 18
  1. The Pricing Context’s Values and Components appear here as tabs—this is the workspace where the rest of this page applies.
Screenshot 2026 02 19 At 11 19 09 AM

Authoring Rules

This is the one rule-authoring mechanism used by every Pricing Module with Calculated components—Charges Rules, Base Plans, Add-On Plans, all of it. The specific module types described below are specializations of this same mechanism, not separate systems.
Like Pricing Contexts, Pricing Modules don’t have versioning yet (tracked as a backlog item). Until it ships, editing a rule on a Module that already has active subscribers affects all of them instantly, there’s no separation between subscribers on an “old” version of the rules and subscribers on the “new” one. Everyone is rated against whatever the rule says at the time of the next bill run.
Which components you can write rules against isn’t a module’s choice. Calculation Type is decided once, on the component, back on the Pricing Context. Only components marked Calculated there appear as tabs in the module builder; Manual components never show up here at all—their values are entered later, on each draft bill, when a bill run is executed. Each visible component, on its own tab, holds a sequence of rules. A rule has three parts: Conditions, a Billing Formula, and an optional Rule Post-Processor.
There’s no completeness check on any of this. A Module, even one marked Plan and subscribed to by real customers, can have a Calculated component with zero rules defined. At bill-run time, that component simply evaluates to 0—no error, nothing skipped, just a zero charge.This is what makes any narrowly-scoped module possible at all, you can create a module that fills in any subset of components and leaves the rest untouched, with no requirement to complete the rest. Rate Card, Charges Rules, and Tax Module (below) are just the three familiar examples of this, not a special or exhaustive list, any other partial combination is just as valid.

Conditions (optional)

A rule with no conditions always applies. When present, a condition can reference:
  • Subscription Properties — List-type properties show a picker of their defined values; Number-type properties take a min and max to define the matching range. This includes the special, automatically-generated properties every context carries, such as Date and the per-Meter-Property estimation flag.
  • Usage — metered or unmetered usage inputs.
  • Components — other components’ calculated values, subject to the Order constraint described under Component Chaining below.
Multiple conditions within a single rule are joined by AND—all of them must be true for that rule to fire.
  • Example: IF Subscription SLA == "Gold" AND IF Customer Region == "Europe"
Screenshot 2026 02 20 At 2 03 54 PM

Billing Formula

The formula computes the component’s value once its rule’s conditions are satisfied. It can reference the same set as conditions—Subscription Properties, Usage, Components—plus a set of special variables the engine supplies at run time:
  • Example: Base Rate * 0.90 (a 10% partner discount).
Screenshot 2026 02 20 At 2 01 49 PM
Screenshot 2026 02 20 At 1 55 23 PM
Screenshot 2026 02 20 At 2 00 53 PM

Proration

There is no separate proration setting to switch on. Proration is expressed in the formula itself, using Active Days and Cycle Days. A subscription that starts, is reactivated, or is deactivated part-way through a billing period should not be charged a full period’s fixed fee. Scale the charge by the fraction of the period the subscription was actually active:
  • Example: (Active Days / Cycle Days) * Base Rate
A subscription active for the whole period gives Cycle Days / Cycle Days, so the formula returns the full charge and needs no special case. The same pattern applies to any fixed component—standing charges, service fees, minimum charges.
Metered components don’t need this. Consumption is billed from the delta between meter readings, so a subscription active for part of a period naturally consumes less and bills less. Apply proration to fixed and recurring components, not to usage-driven ones—doing both would discount the same partial period twice.

Rule Post-Processor (optional)

A final step applied to the formula’s evaluated result:
  • Ceil — rounds the result up.
  • Floor — rounds the result down.
  • Power — raises the result to a power you specify.

Multiple Rules: OR Logic, First Match Wins

A component can hold more than one rule, shown in sequence in the builder. Rules are evaluated top to bottom; the first rule whose conditions evaluate to true is applied, and later rules in the sequence are not evaluated. This is why multiple rules are described as connected by OR: a component’s value comes from whichever single rule matches first, not from combining every matching rule.

Component Chaining

To build progressive tax structures, surcharges, or composite discounts, a rule can reference previously calculated components as dynamic variables, in both conditions and formulas. “Previously calculated” is determined by each component’s Order, set on the Pricing Context—a component can only reference components earlier in the Order sequence, never a later one. This guarantees every chain of calculations resolves in a single forward pass, with no circular references possible.
  • Example: A “VAT Tax Charges” component that evaluates (Base Charges + Electricity Consumption Charges) * 0.15.
Screenshot 2026 02 20 At 2 18 15 PM
Screenshot 2026 02 19 At 1 10 40 PM

Test Plan

Runs a module with sample inputs and shows each component’s result, before it’s used in live billing.
  1. Open the Plan screen for the module you want to check.
Screenshot From 2026 04 20 18 29 14
  1. Click Test in the header (alongside Update, Discard, and Export).
Screenshot From 2026 04 20 18 29 54
  1. Enter sample values for the Date, Components, and Usage inputs (and anything else the context defines).
Screenshot From 2026 04 20 18 31 20
  1. Click Process to calculate the bill for those inputs.
  2. Read the Outputs: each component shown with the amount its conditions and formula produced.
Screenshot From 2026 04 20 18 32 19
  1. Click Publish for a PDF of that test run, using the bill template from the Pricing Context. If none is attached, fix that on the template first.
Screenshot From 2026 04 20 18 35 37
Run Test Plan again after changing any Value, condition, or formula to confirm totals are still correct—remember, versioning isn’t built yet, so a live module’s existing subscribers are affected by the same edits you’re testing here.

Prepaid and Postpaid

Billing Timing is a direct field on the module, required when Plan is marked. Two values: Prepaid — pay first, then use. Subscribe, pay, then use the service. When the balance runs low or out, subscribe again. Pay → use. Postpaid — use first, pay later. Use the service through the period, get billed at the end for what was used, pay by the due date. Use → bill → pay.

Billing Configuration

A separate entity from the module itself—created independently, then attached to it. Required when Plan is marked. Like Rate Cards and Charges Rules, it’s reusable: the same Billing Configuration can be attached to multiple Plans rather than creating one fresh per Plan. See Billing Configuration for the full model—bill-run timing, dunning, and late payment.

Tracking Usage

Two ways usage gets recorded against a subscription: During subscription creation — the amount is deducted and an invoice is generated and sent immediately. Via API — usage can be recorded programmatically at any time. The system stores recorded usage events and accumulates them for the next billing cycle.

Modeling Patterns, Not Object Types

Rate Card, Charges Rules, Tax Module, Plan, Composite Plan, and Unified Base Plan are not separate object types. There is exactly one object: the Pricing Module. Everything below is a business name for a particular combination of the fields already covered above — which components are filled in, whether Plan is checked, and whether components are authored natively or inherited from another module. The system never stores a “Rate Card” or a “Plan” differently from any other Pricing Module; it’s the same row every time, just configured differently.

Non-subscribable building blocks (Plan unmarked)

Set Visibility to Private and leave Plan unmarked, so the module is never shown on the portal and never subscribable. Which components you fill in decides what people call it: Example: Rate Card 1 sets the per-kWh residential rate, Rate Card 2 sets the commercial rate — same Pricing Context, same Charges Rules module, different Rate Cards. Filling in Values happens on the Values tab: every Value defined on the context appears with a plain input field, where you enter the actual constant for that placeholder.
Screenshot 2026 02 19 At 11 20 16 AM
None of these three are reusable objects in their own right — they’re Pricing Modules kept unsubscribed specifically so other modules can inherit their components instead of duplicating them.

Composing a Subscribable Plan from Building Blocks

Check Plan to make a module subscribable. Reuse works through per-component inheritance: for any component, instead of authoring its rules natively in this module, you can point that component at another module’s same component and inherit its rules wholesale. This is a live reference, not a one-time copy—editing the source module’s rules later updates every module that inherits from it automatically. This only works between modules built on the same Pricing Context, since a component’s identity is scoped to the context that defines it. This choice is made independently per component. You can inherit every component from other modules, author every component natively, or mix the two freely.
  • Composite Plan — the common name for a Plan composed mostly or entirely through inheritance rather than native authoring. Typical pattern: inherit all rate components from a Rate Card, all charge components from a Charges Rules module, and tax components from a Tax Module.
  • Unified Base Plan — the other end of the spectrum: a Plan that authors both rate components and charge components natively, with no inheritance at all. Best when a Plan’s pricing is entirely self-contained.
Both Plans share the same charge logic and tax rules. Only the rates differ. Updating the shared Charges Rules module updates both Plans automatically — no duplication. Nothing stops a narrower mix either, inheriting just one specific charge component from another module while authoring the rest natively.

The Composition Pattern

Every node below is the same object — a Pricing Module — labeled by which pattern it’s configured as: One context. Multiple Pricing Modules, each configured in a different pattern. Shared charge logic. Plans composed independently.

Why This Matters

One change, many plans. The Charges Rules and Tax Module are shared across every Composite Plan that inherits from them. Update a tax rate once — every plan reprices automatically. No hunting across configurations. Rate flexibility without logic duplication. You can have ten rate cards — residential, commercial, peak, off-peak, regional variants — all composing with the same charge and tax logic. That’s ten plans from three building blocks. Surgical updates. A tax law changes? Update the Tax Module. A surcharge is removed? Update the Charges Rules. A rate is renegotiated for a customer segment? Swap the Rate Card. Nothing else moves. Audit clarity. Because logic is isolated by purpose — rates here, charges there, tax in its own module — you can trace exactly which module produced which line item on any bill. Scale without duplication. The alternative — defining rates, charges, and tax rules independently inside each plan — means N plans × M rule types of duplicated logic. That’s how billing systems become unmaintainable. Composition keeps the structure flat regardless of how many plans you add.

Security

Pricing Modules (Rate Cards, Charges Rules, Plans, Add-Ons) can be scoped with Security Attributes, using the platform’s Attribute-Based Access Control (ABAC) framework. See Security Attributes for the full model.