Contracts & Recurring Billing
Service agreements and the repeating charges that follow from them, for MSPs and the organizations they service.
The problem
The agreement lives in a PDF on a shared drive. The renewal date lives in somebody’s calendar, if it lives anywhere. The monthly charge lives in a spreadsheet that one person maintains, and every month they work down it by hand — which is why the month somebody is on holiday, three clients are not billed at all and one is billed twice. Nobody notices the auto-renewal clause until eleven days after the notice window has closed.
What Solidlio does about it
Contracts are records, not documents: term, value, billing cycle, payment terms, notice period, auto-renew. A nightly job reads them, so a term that ends is expired, a term set to renew is rolled forward, and the people who need to know are told ahead of the contract’s own notice period rather than a fixed 30 days. Recurring charges are separate schedules with their own cadence and time zone, swept nightly. Every period a schedule bills is claimed by a unique period key written in the same database transaction as the charge — so a retried job, a double-clicked button, or two servers racing each other cannot bill the same period twice.
Capabilities
| Capability | What it does |
|---|---|
| Contract register | Records term, value, billing cycle, payment terms, notice period and auto-renew across five agreement types |
| Enforced lifecycle | DRAFT → PENDING → ACTIVE → EXPIRED or CANCELLED, with terminal states that refuse every edit, not just status changes |
| Automatic expiry | Marks a term expired the night it ends, so nothing silently stays active forever |
| Auto-renewal | Rolls the term forward by one billing cycle, records the renewal, and notifies the organization that it happened |
| Notice-period warnings | Warns the organization’s admins ahead of expiry using that contract’s own notice period, once per term |
| Recurring billing schedules | Ten cadences from weekly to triennial, each with its own billing day and IANA time zone |
| Once-per-period guarantee | A unique period key, written with the charge in one transaction, makes double-billing a rolled-back transaction rather than an incident |
| Nightly billing sweep | Raises the period’s service order for every active schedule that has come due, unattended |
| MRR and ARR | Normalises all nine recurring cycles to a monthly figure, with daily history for month-over-month comparison |
| Renewal rate | Measured from renewals that actually occurred and terms that actually expired — reported as “no data”, never as a fabricated 100% |
Built for MSPs and their clients
A managed client is a separate account, not a folder inside the MSP’s. That distinction is what lets both sides hold the parts they should.
| Organization | MSP | |
|---|---|---|
| Contracts | Create, edit, activate and cancel their own agreements | The same, across every client account they service |
| Contract visibility | Their own organization only | Their own account plus every client they service |
| Billing schedules | Read-only: what they are charged, how often, when it falls due | Create, edit, pause, resume, cancel and trigger |
| Renewal notices | Received by the organization’s own admins and managers | Visible on the contract |
| MSP configuration | Not visible | Stays private to the MSP; it does not widen to serviced clients |
An MSP reading a client’s contract is a deliberate cross-account read, granted by the servicing relationship. Tenant-owned configuration is deliberately excluded from that widening — an MSP’s own settings do not leak to a client, and a client’s do not leak to the MSP.
How it works
- Record the agreement — type, term, value per billing period, cycle, payment terms, notice period, auto-renew. It starts as a draft.
- Activate it — a contract whose term has already ended cannot be activated; the product says so before you try.
- Attach a recurring schedule — cadence, billing day, amount, and the IANA time zone the billing day is evaluated in. Leave the zone unset and it inherits the client’s business hours.
- The sweep runs nightly — every active schedule that has come due raises its service order and advances to the next period. Re-running the sweep bills nothing twice.
- The lifecycle job runs nightly — ended terms expire, renewing terms roll forward and notify, and terms approaching their notice window generate one warning each.
- Watch the revenue line — MRR, ARR, active contract value, contracts expiring within thirty days, and a renewal rate with its sample size attached.
Compliance and audit
Every billing period a schedule has ever run is a permanent row recording the period key, the amount in cents, whether the run was triggered manually or by the scheduler, which user triggered it, when it ran, and the service order it produced. Because the period key is unique per schedule, that table is also the proof that no period was billed twice.
Contracts carry their own history: how many times the term has renewed, when it last renewed, and when the expiry warning was sent. Money is held and computed in integer cents throughout, and the platform fee is applied in basis points rather than by floating-point multiplication.
Billing dates are evaluated in the schedule’s own time zone. A charge dated the 1st is the 1st where the client is, not wherever the server happens to run.
Editions
maxContracts is the number of live contracts an account may hold. Cancelled and expired contracts do not count against it, and a downgrade never disables contracts you already have — only new ones above the cap are refused.
MSP tiers
| Capability | Free | Starter | Growth | Scale | Enterprise |
|---|---|---|---|---|---|
| Contracts | — | 10 | ● | ● | ● |
| Recurring billing | ● | ● | ● | ● | ● |
| Automatic expiry & renewal | ● | ● | ● | ● | ● |
| MRR / ARR reporting | ● | ● | ● | ● | ● |
Customer tiers
| Capability | Free | Essentials | Professional | Business | Enterprise |
|---|---|---|---|---|---|
| Contracts | — | — | 5 | ● | ● |
| Recurring billing | ● | ● | ● | ● | ● |
| Automatic expiry & renewal | ● | ● | ● | ● | ● |
| MRR / ARR reporting | ● | ● | ● | ● | ● |
● unlimited or included · number = cap · — not included
What this does not include
Stated so nobody buys it expecting otherwise:
- A recurring billing run raises a service order and invoices it, in the order’s own currency and on its own payment terms. A Canadian client whose province cannot be resolved is held rather than invoiced at $0 tax.
- There is no contract e-signature. Contracts are records, not signable documents.
- No proration. A mid-term change to a contract value or schedule amount applies from the next period, and cancellation issues no automatic refund.
- Auto-renewal rolls the term and notifies. It does not raise a charge.
Contracts that expire on time, and charges that are raised exactly once.