Appearance
Contracts
A contract in OpsMerge defines the commercial relationship with a client: what they pay you per month, what they get for that money, and how usage feeds into billing.
Every paying client should have a contract. Without one, recurring billing has nothing to act on.
Contract types
We support four shapes out of the box:
| Type | What you charge | What's included |
|---|---|---|
| Per-asset | Variable, based on managed asset count | All-you-can-eat support (or capped — your call) |
| Block hours | Fixed monthly fee for N hours of support | Time over the block billed at an hourly rate |
| All-you-can-eat | Fixed monthly fee, no hour cap | Unlimited support time |
| Pay-as-you-go | Nothing recurring; time billed per hour | No included support; time billed at hourly rate |
You can also build hybrids: per-asset + block hours, all-you-can-eat with a per-asset cap, etc.
Creating a contract
Client → Contracts tab → + New contract.
Fields:
- Name (e.g. "Standard MSP - Gold tier").
- Type (per-asset / block / all-you-can-eat / pay-as-you-go).
- Start date and end date (end optional; "no end" means rolling).
- SLA tier (Bronze / Silver / Gold / custom — drives ticket SLA targets).
- Billing frequency (monthly / quarterly / annual — most use monthly).
- Recurring lines — what to invoice each cycle. See below.
- Effective hourly rate for over-block / pay-as-you-go time.
- Notes — for your team's reference, not shown to client.
Once saved, the contract is "active" from its start date.
Recurring lines
The heart of a contract is its recurring lines — what gets billed every cycle.
Each line has:
- Description (shown on the invoice).
- Quantity source:
- Fixed (e.g. "1 × Monthly Support" at £500).
- Live asset count (e.g. "Per-endpoint @ £15" with quantity = the count of billable assets at invoice time).
- Live M365 user count, monitored domain count, etc.
- Unit price.
- Tax code (for VAT).
- Service (links to your accounting code, important for QuickBooks push).
- Billing category (optional — for breaking the invoice into logical groups).
At invoice time, OpsMerge computes the quantity for each "live" line from current data — your bill is always against today's state, not last month's snapshot. See Recurring invoices for how proration handles mid-cycle changes.
Per-asset details
The most common contract shape for MSPs. You charge per endpoint (or per M365 user, or per anything that counts as a billable asset).
Asset count is live: at invoice time, OpsMerge counts the client's billable assets and bills accordingly.
What counts as a billable asset depends on the line's quantity source — typically:
- Endpoint per-month: every Windows/Mac/Linux endpoint with the agent installed, excluding archived/excluded ones.
- M365 user per-month: managed M365 identities under a connected CIPP tenant.
- Network device per-month: routers, switches, APs added as RMM-monitored network assets.
Common patterns:
- One per-asset line covering everything: "Per managed asset @ £X" where the count = endpoints + network devices + M365 users.
- Multiple per-asset lines for different categories: "Per endpoint @ £X" + "Per M365 user @ £Y". More flexible pricing but more lines to manage.
Block hours
Sells N hours of support per month at a fixed fee. Time logged on the client's tickets draws down the block. Time beyond the block bills at the contract's hourly rate.
Configure:
- Block size (e.g. 10 hours).
- Block fee (e.g. £750/month).
- Overage rate (e.g. £85/hour).
- Rollover (does unused block carry over? Default: no, use-it-or-lose-it).
Block status appears on every ticket and on the client page so your techs see "this client has 3 hours of block left this month".
All-you-can-eat
Flat monthly fee, unlimited support time. No overage tracking. The contract is just a recurring line for the fee, plus any per-asset lines if applicable.
Pay-as-you-go
No recurring fee, no monthly line. Time on the client's tickets bills at the contract's hourly rate, accumulating into an invoice at the end of each cycle (or however your invoicing frequency is set).
Contract changes mid-cycle
OpsMerge handles mid-cycle changes by proration:
- Asset count changes — the next invoice prorates by day-fraction of the cycle (5 days at 100 assets, 25 days at 110 assets = prorated total).
- Contract upgrade/downgrade mid-cycle — typically wait until cycle end. If you change mid-cycle for some reason, the next invoice prorates the two phases.
SLA tiers
Each contract carries an SLA tier that drives:
- Ticket response-time targets per priority.
- Ticket resolution-time targets per priority.
- Whether VIP escalation applies.
- Whether the SLA clock pauses on "Waiting on Client".
Out of the box we ship Bronze / Silver / Gold with reasonable defaults. Customise at Settings → PSA → SLA tiers.
Ending a contract
Client → Contracts → contract → End.
Set the end date. From that date:
- No further recurring invoices generated.
- Existing block-hour usage is finalised on the next invoice run.
- Tickets continue to work but with no SLA tier (or a fallback "no contract" tier).
You can have multiple contracts on a single client — useful when sliding from one structure to another. Just give them non-overlapping date ranges.
Voiding vs ending
- End: contract had a normal lifecycle; ends gracefully; everything to date is billable.
- Void: contract was a mistake or fraud; treat as never having existed.
Voiding a contract triggers reversals — including reversal of any recurring invoices issued under it (creates credit notes, releases any committed time, cancels Stripe charges). Use carefully.
Common patterns
"I want to charge a flat fee plus per-asset"
Two lines on one contract:
- Line 1: "Base monthly fee" — Fixed quantity 1, unit price £500.
- Line 2: "Per endpoint" — Live asset count, unit price £15.
"Different price per asset for servers vs workstations"
Two lines, both per-asset, with billing-category filters:
- Line 1: "Per workstation @ £12" — quantity source = endpoints with category = workstation.
- Line 2: "Per server @ £40" — quantity source = endpoints with category = server.
Asset categories are set per-asset (often automated based on OS edition). See Recurring invoices.
"Project work that's outside the contract"
Project work goes on tickets typed "Project". Project tickets bypass the block-hour countdown and bill at a separate project rate. Set up at Settings → PSA → Project billing.
Common issues
Recurring invoice ran but I expected a different total. Check the contract's recurring lines at the moment of invoice run. The "live asset count" lines pull the count at run time — if assets were added or removed since you set up the contract, the bill reflects that. The invoice itself has a breakdown showing the count used per line.
Block hours appear over-drawn but I'm confident we logged less. Internal time entries (non-billable) don't draw from the block; double-check the time entries are marked as the right type.
SLA targets feel wrong on this client's tickets. The contract's SLA tier drives the targets. Check what tier is set; check the tier's definition at Settings → PSA → SLA tiers.
I changed a contract line and the next invoice still used the old value. Recurring lines snapshot at the moment of invoice generation. The change applies to the next run, not the one that already happened.
Next
- Recurring invoices — what contracts produce
- Billing & invoices — the broader invoicing surface
- Time tracking — how time is logged and applied to block hours