Billing
Consolidated monthly invoices, annual prepaid, monthly commit, soft-limit overage. How partner billing actually works.
Partner billing is consolidated to the partner, not to each end customer. A single monthly invoice covers every active customer access under the partner.
The monthly invoice
Each month, WASViking® runs the Celery task
partners.monthly_invoice_previews (1st @ 06:00 UTC) and renders a
preview for each partner.
Contents:
- Per-access lines: plan, modules, metered packs, prorations.
- Soft-limit overage if any access exceeded its provisioned capacity.
- Trials excluded (POC accesses are never billed).
- Annual prepaid accesses excluded (charged separately).
Available in Billing → Invoices as PDF (WeasyPrint) and CSV.
Access to the invoice is gated by the partner_billing capability and
every view is audited.
Soft-limit overage
WASViking does NOT hard-block at the limit. Instead:
- Capacity is provisioned per access (max targets, scan slots, AI recommendations per month, etc.).
- Usage above provisioned capacity is billable overage, computed per unit and added to the next monthly invoice.
- The partner sees the overage projection in real time on the customer detail page.
This keeps the platform operational at burst time and bills for the real consumption afterward.
Annual prepaid
For accesses on annual_billing_mode = prepaid:
- A single annual charge runs at access creation or renewal.
- The access is excluded from the monthly consolidated invoice.
- The daily Celery task
partners.annual_renewals(06:15 UTC) re-charges and rolls the commitment 12 months forward.
Annual prepaid is the cleanest model for partners that prefer to lock revenue and avoid a monthly accounting hit.
Monthly commit (12-month)
For accesses on annual_billing_mode = monthly_commit:
- Stays in the monthly consolidated invoice.
- Locks the access for 12 months from the commitment start.
- Subject to the
annual_monthly_commit_minminimum (guardrail- controlled). - Eligibility checked at quote time (
annual_commit_eligible).
Server-side revalidation refuses an ineligible monthly_commit selection at submit and falls back to prepaid with a warning.
Trial conversion timing
The commitment clock starts:
- At access creation for new paid accesses.
- At conversion for trial accesses.
convert_trial_to_paid flips Subscription to active, resets
current_period, clears trial_start/trial_end, and refreshes
renewal_date. From that moment the customer is billed to the
partner on the normal monthly cycle (no proration of the trial
window).
Invoice export
| Format | Notes |
|---|---|
WeasyPrint, invoice_pdf.html, branded. Best for accounting handoff. |
|
| CSV | One line per access plus aggregate rows. Best for the partner's downstream billing system. |
Both formats are produced from the same invoice data; signing both is roadmap.
What WASViking does NOT bill
- Trial accesses (during the trial).
- Customer accesses on a disabled subscription.
- Demo organizations (they have no
PartnerOrganizationAccessrow; the billing pipeline iteratespartner.customersonly).
What the partner controls
- Plan and add-on selection per access.
- Operating model per access.
- Annual prepaid vs monthly commit (per access).
- Trial days requested per quote (WASViking approves or lowers within request).
What WASViking controls
- The customer list price.
- The tier discount structure.
- The guardrail floor.
- The internal cost model used to compute margins (never shown to the partner).
What partners cannot do
- Consolidated billing TO the end customer through WASViking. The partner bills the customer directly; WASViking bills the partner. This is a deliberate scope decision.
- White-label invoices. The invoice is WASViking-branded by design.
