Enterprise SaaS / Custom Contracts
The enterprise SaaS pricing pattern is what happens when standard self-serve tiers stop fitting the deal: the customer is a global company with custom requirements, the sales cycle is months long, the contract is multi-year with negotiated terms, the deal is paid in the customer's local currency under their bank's FX preferences, and finance / legal / deal-desk all need to sign off before the deal closes. The same platform that serves $10/month self-serve customers must also serve $500k/year custom contracts without bending the codebase to accommodate either side.
Real-world examples. Salesforce (custom-priced multi-year contracts with deal-desk gates), Workday, ServiceNow, SAP, Atlassian Enterprise, Snowflake, Databricks, GitHub Enterprise, GitLab Ultimate, MongoDB Atlas Enterprise. Common shape: account-specific pricing dramatically different from the catalog, multi-year terms with annual or quarterly billing, multi-currency under the customer's preferred currency, internal approval gates for any deviation from standard pricing, dedicated success manager per account, custom invoice formatting and PO requirements.
The shape of the problem
Enterprise sales mechanics translate into specific billing requirements:
- Account-specific pricing across many products. A standard plan might have 8 priced products; the enterprise contract carries custom rates on most of them, plus add-ons not on the catalog. Modeling this as a one-off plan creates plan sprawl; modeling it as overrides keeps the catalog clean.
- Multi-year terms, annual billing. Contract is 3 years, but billed annually with the second/third year prices already pinned. Mid-year changes (true-ups, expansions) need handling without rebuilding the whole contract.
- Multi-currency invoicing under the customer's FX preferences. Customer wants invoices in EUR even if the catalog is USD; their finance team wants the FX rate locked at the start of each annual period for predictability (period_start FX policy).
- Deal-desk approval gates. Any deviation from standard pricing above a threshold triggers internal review - sales, deal desk, finance, legal - before the contract activates.
- Custom invoice formatting. Enterprise customers have PO numbers, Leitweg-IDs, internal cost-center codes, custom branding requirements, and (in the EU) often need XRechnung/EN 16931 e-invoice format.
- Payment terms. Net 30/60/90 instead of "due on receipt"; customer pays via wire transfer with a manual recording flow rather than auto-debit.
- Renewal forecasting. Finance needs to know which contracts are renewing in the next quarter, what they're renewing at, and which are at risk.
Kontorion blueprint
| Concern | Kontorion primitive |
|---|---|
| Account-specific pricing | Customer price overrides per (customer, product) |
| Multi-currency under customer's preference | Customer preferred_currency + org FX policy: period_start |
| PO numbers, Leitweg-IDs | Standard invoice fields buyer_reference, delivery_date |
| EN 16931 / XRechnung | GET /invoices/{id}/xrechnung |
| Net 30/60/90 payment terms | Subscription payment_terms_days override |
| Manual wire transfer recording | POST /invoices/{id}/record-payment with reference |
| Renewal pipeline forecasting | Analytics (/analytics/mrr, /analytics/churn, /analytics/revenue) plus the subscription's current_term_end and auto_renew fields |
Build it
1. Create the enterprise customer
Code
2. Apply customer-specific price overrides
The negotiated contract gives Acme 30% off the platform fee, custom rate on metered API calls, and a flat-fee for a service that's normally per-call:
Code
3. Configure deal-desk approval workflow
Trigger an approval workflow for any new override above a threshold:
Code
When the AE creates the override above the threshold, an approval.request_created fires; the override stays inactive until all required steps approve.
4. Set FX policy to period_start for predictable annual statements
The org's FX policy is set once at the organization level:
Code
Now every invoice for any customer uses the FX rate active at the start of the billing period. Acme's annual invoice has predictable EUR amounts even if USD/EUR moves during the year.
5. Create the multi-year subscription
Code
Annual billing is driven by the subscription's billing_interval_unit: "year" + billing_interval_count: 1 (billing interval lives on the subscription, not the price). start_trigger: "start_date" with a future start_at activates the DRAFT subscription on the contract date. With auto_renew: true, each term rolls over automatically at current_term_end; poll that field (and auto_renew) to surface upcoming renewals in your account-management tooling. There is no built-in renewal_notice_days field or renewal webhook.
6. Generate the first invoice with PO and Leitweg-ID
When the first annual invoice generates, it carries the customer's buyer_reference (PO) and delivery_date automatically:
Code
7. Customer pays by wire; record the payment manually
Code
8. Export XRechnung XML for the customer's e-invoice ingestion
Code
The XML includes Leitweg-ID, supplier and buyer VAT IDs, line-by-line tax breakdown, and the PO reference - everything required by EN 16931 for B2B/B2G electronic invoicing.
Variations
- Quarterly billing. Same contract, just set
billing_interval_unit: "month"+billing_interval_count: 3on the subscription (billing interval is a subscription field, not a price field). Each invoice is one-quarter of the annual. - All-upfront prepay. Generate one invoice for the full term value at start; treat each subsequent year as zero-charge cycles via plan configuration.
- Mid-term true-up. Customer adds 50 seats mid-year.
POST /v1/subscriptions/{id}/change-quantitywith{ "subscription_item_id": "si_…", "new_quantity": 250 }produces a true-up invoice for the prorated additional seats. - Custom branded invoice templates. Per-customer invoice template overrides are configured via
metadata.invoice_template_idand rendered by the PDF service. - Multi-entity invoicing. Acme has subsidiaries in DE, FR, IT - each needs separate invoices with their own VAT ID. Create one customer per entity; group them under a parent account via
metadata.parent_customer_idfor unified reporting. - Renewal automation. A
auto_renew: truesubscription rolls its term over automatically atcurrent_term_end. There is nosubscription.renewal_upcomingwebhook; to act ahead of a renewal, pollcurrent_term_end/auto_renewfrom your account-management tooling. The lifecycle events that do fire aresubscription.activated,subscription.cancelled,subscription.plan_changed, andsubscription.quantity_changed(among others).
What you don't have to build
- Per-customer pricing layered cleanly on top of the catalog (no plan sprawl)
- Multi-step deal-desk approval with role-based gates and timeouts
- Multi-year subscription term tracking with
auto_renewrollover andcurrent_term_endexposed for renewal monitoring - Period-start FX rate pinning for predictable multi-year contracts
- EN 16931 / XRechnung e-invoice generation
- PO and Leitweg-ID propagation onto invoices
- Net-N payment terms enforcement and dunning behavior
- Manual wire-transfer recording with audit trail
- Revenue and churn analytics (
/analytics/mrr,/analytics/churn,/analytics/revenue) to feed renewal-pipeline reporting
Next steps
- Customer Price Overrides - the core enterprise pricing primitive
- Exchange Rates - period_start FX policy for predictable annuals
- Invoices - XRechnung export, PO/Leitweg-ID handling
- Tax Compliance - reverse charge and intra-EU invoicing