Skip to content

Recurring Contracts

Recurring Contracts automate your managed-services billing. Define what a customer is charged and how often, and Breeze generates the invoices on schedule – resolving per-device and per-seat counts at billing time so the amount always reflects the customer’s actual environment. Open Contracts from the sidebar.

Contracts are partner-scoped and bound to a customer organization.

Contracts, along with the rest of the Billing section, are only available when the Service Management module is enabled for your account; see Service Management mode.

Two settings determine the rhythm:

  • Billing timing – in advance (bill at the start of each period) or in arrears (bill at the end).
  • Interval – monthly, quarterly, annually, or a custom number of months.

From these, Breeze computes the next billing date. When that date arrives, a billing period is created, line quantities are resolved, and – if auto-issue is on – an invoice is generated automatically.

Status Meaning
Draft Being set up; not yet billing
Active Billing on schedule
Paused Billing temporarily stopped
Cancelled Ended
Expired Past its end date

Each line is one charge on the contract. Lines can resolve their quantity in different ways:

Line type How quantity is determined
Flat A fixed amount each period, regardless of count
Per device Counts the customer’s devices at billing time × unit price
Per device role Counts the customer’s devices whose role is in the line’s set (for example switch + router + firewall, or workstation + server) at billing time × unit price
Per device group Counts the members of one device group at billing time × unit price. Static groups bill their current members; dynamic groups are evaluated from their filter when the estimate or invoice is computed
Per seat Counts the customer’s seats/users at billing time × unit price
Block hours A prepaid bank of support hours for each billing period at a flat price. Technician time draws it down; hours beyond it bill at an overage rate. See Block hours
Manual A fixed quantity you set × unit price

Per-device and per-device-role lines can be scoped to a specific site so you bill only the devices at that location. A per-device-group line is not site-scoped: make the group itself site-bound instead. Per-seat lines always bill the organization’s whole active-user count and cannot be site-scoped. A line can link to a catalog item, which prefills its description and price.

Editing a line. On a draft or active contract you can edit a line in place – its description, price, tax flag, quantity, site, device roles, device group and catalog link – from the contract editor. The line keeps its identity, so invoices already generated from it stay linked to it and any allowance you set later is preserved. The line type cannot be changed: remove the line and add a new one instead. A catalog-linked line keeps the price it was given when it was added; use Refresh price from catalog to re-price it. Clearing a catalog link asks you for a unit price, because nothing re-prices the line afterwards. Edits apply from the next billing period onward; invoices that have already been generated are never rewritten. Adding, changing, or removing a line is recorded in the Audit Trail against the contract — the entry names which fields changed, and the old and new unit price when the price moved. There is no per-line history on the contract page itself.

Any line that counts something — per device, per device role, per device group or per seat — can carry an included quantity: “up to 25 devices included”. With an included quantity set, the line bills that quantity every period, even when fewer are counted — it is a fixed inclusion, not a cap on a variable count. Anything above it is handled one of two ways:

  • Bill extras. A second, customer-visible line is added to the invoice for the units above the included quantity, at the overage price you set, directly under the line it belongs to. It is an ordinary line: it follows the base line’s tax treatment, it counts toward margin, and you can edit or remove it on a draft invoice.
  • Flag extras for review. Nothing extra is invoiced. The excess is reported on the contract estimate, on the result of a manual Generate now, and in the nightly billing log, so somebody can decide whether to raise the included quantity or add a line.

The overage price must be valid in the contract’s currency (a yen contract cannot have a ¥12.50 rate), and an overage price of zero is allowed — the extras are itemised on the customer’s invoice at no charge. An included quantity must be a whole number greater than zero (a Block hours line takes fractional hours), and cannot go on a flat or manual line. While any line carries an overage price, the contract’s currency cannot be restamped: clear the allowance (or the lines) first, because an overage price you typed by hand cannot be re-derived from a price book.

Dynamic groups on a contract are evaluated live when the estimate or invoice is computed, not from the member list cached on the Device Groups page, so a device that changed since the group was last refreshed is still billed correctly. The one exception is a filter condition that tests membership in another group, which reads that group’s cached list. A group billed by a draft, active or paused contract cannot be deleted until the line is removed; a group deleted after a contract ended stays on that contract’s lines by name.

Device roles come from the agent’s automatic classification, a network discovery scan, or a manual override on the device. A device whose role is still Unknown is never billed by a per-device-role line, though a per-device or per-device-group line bills it like any other machine. The contract’s estimate and each generated invoice report how many devices on the organization are not billed by any line, broken down by role – and each role in that breakdown is a link to the devices list, already filtered to that role in that customer’s organization, so you can classify them or add a line before the next period. The link carries the organization, so opening it in a new tab switches your org scope to the contract’s customer.

Coverage is worked out live every time you look at it – nothing is stored – and only active contracts count. A device covered by a draft contract still reads “no active contract line bills this device” on its own page until the contract is activated, even though the draft contract’s own estimate counts it: the two answer different questions.

A contract is priced in the customer organization’s billing currency, which the organization inherits from your partner currency when it is created. Every line must be in that currency, and the invoices the contract generates inherit it.

  1. Go to Contracts and click New contract.
  2. Select the customer organization, name the contract, and set the billing timing, interval, and start date.
  3. Add lines – choose flat, per device, per device role, per device group, per seat, or manual, and set the price (and quantity, roles or group where applicable). Link a catalog item to prefill description and price. You can edit any line later from the same screen while the contract is a draft or active.
  4. Add any terms and notes.
  5. Review the estimated value this period – per-device, per-device-role and per-seat lines resolve to live counts so the estimate is real, not a placeholder, and any devices no line bills are called out.
  6. Activate the contract to start billing.

The contract list shows an estimated monthly recurring strip across active contracts (normalized for cadence) and a per-contract estimate column, so you can see recurring value at a glance.

When a customer accepts a quote or proposal that includes recurring (monthly or annual) line items, Breeze automatically creates a draft contract from those recurring lines — so an accepted proposal turns straight into the agreement that bills it, with no re-keying.

  • Monthly and annual lines are split into separate draft contracts (one billing cadence each).
  • The draft inherits the quote’s terms, currency, and the prices the customer agreed to.
  • It lands as a draft for you to review, adjust lines, and activate when you’re ready to start billing.

A recurring quote line that bills a device set becomes a contract line of the matching type (per device, per device role, per device group or per seat) instead of a fixed-quantity line, with the accepted unit price frozen, so the contract bills the actual count every period.

Any one-time charges on the same quote become an invoice instead, not a contract.

A contract line scoped to a site records the site’s name as well as its id. If that site is deleted, the line stops billing and says so. The contract detail shows “site deleted,” and generating an invoice refuses instead of quietly falling back to billing every device in the organization. Nothing is written — the whole generation run stops, so you never get a partial invoice. Re-scope the line to another site, or remove it, and generation resumes.

The refusal currently surfaces as the raw message from the server, naming the internal line id and the deleted site — technical-looking, but it tells you exactly which line to fix.

A line whose site was deleted before this behavior shipped cannot be recovered because its site name was never recorded. It stays organization-wide until a technician re-scopes it.

A Block hours line sells a prepaid bank of support hours for each billing period – for example “10 hours a month for a flat price”. Your technicians’ time draws the bank down, and hours beyond it bill at an overage rate you set on the line.

Setting Meaning
Included hours Hours in the block each period. Fractions are allowed (for example 7.5)
Overage rate Price per hour beyond the block, in the contract’s currency. Required, and overage is always billed on an invoice
Rollover None: unused hours expire when the period ends. Carry forward: unused hours join the next period, optionally capped at a number of hours
Alert at Optional percentage (1 to 100). Your team is notified once when the open period’s usage reaches it

A customer can have one live block at a time, across all of their contracts, drafts included. To draft next term’s contract with a block, retire the current block first.

What draws the block down. Billable time entries for the customer that have ended inside the period and have not been billed yet. Approval is not required, so unapproved time draws down too (the contract page shows how much of the used hours is still unapproved). Each entry’s hours are rounded to two decimals and then added, so three 20-minute entries count as 0.99 hours. Non-billable and no-charge time never draws down, and time with no hourly rate still does, because the unit is hours. Time already marked as included by its work type does not draw the block down. Time stamped in a different currency than the contract still draws hours – no money is converted – and is flagged on the contract page.

When a period closes. After a period has ended, the next invoice run closes it: the entries it drew are marked as covered by the contract, the period’s figures are frozen, and any overage is added to the invoice as a line that names the period, for example “Support hours – hours over block, 2026-08-01 – 2026-09-01”. A closed period is never recalculated. Once an entry has been drawn by a block it can no longer be edited or deleted.

Advance billing runs one period behind. On a contract billed in advance, the block fee is invoiced at the start of the period, but that period’s overage lands on the following invoice, because the hours had not been worked when the first invoice was cut. On a contract billed in arrears the fee and the overage appear together on the same invoice.

Rollover. Unused hours (the period’s included hours plus anything carried in, minus the hours used) carry forward under Carry forward, up to the cap if you set one. Carried hours do not expire separately, and the first period of a block carries nothing in.

Held entries on ad-hoc invoices. While a period is open, the time it will draw is reserved for the block. A hand-built invoice or a ticket invoice leaves those entries out and reports how many hours were held, so the customer is not charged ad hoc for hours the block already covers.

Entries made after a period closed. A closed period never reopens. Time that was entered for work done in a period that has already closed is not drawn from the block; it bills ad hoc as usual, and the contract page shows how many hours were entered after close.

Retire or delete. Removing a block line that has closed periods (or a claimed period) retires it instead of deleting it: it stops billing its fee, keeps its history, and any period it had already billed still closes. A block that never billed anything is simply deleted. Cancelling or expiring a contract retires its block. When a contract ends, the final period is closed by a daily sweep and any overage is put on a draft invoice that is never issued automatically, so someone reviews it first.

Moving time between customers. Moving a ticket or a device to another organization is refused (HOUR_BLOCK_DRAWN_TIME) while it holds time a block has already drawn. The message names how many entries are affected.

Alerts. With Alert at set, your team gets an in-app notification (event contract.hour_block_threshold) the first time the open period’s usage reaches the percentage – once per period and threshold, however many times the daily check runs. Recipients are the users who can read contracts and have access to the customer, or the contract’s creator if none do. Changing the percentage mid-period can notify once more for the new level.

Customer visibility. The customer can see their balance in the portal. See Support hours.

Action Effect
Activate Move a draft to active and set the next billing date
Pause Temporarily stop generating invoices
Resume Continue billing from a paused state
Cancel End the contract

You can also generate now to create the current period’s invoice immediately rather than waiting for the schedule.

Breeze records the exact devices behind every auto-counted line at generation and never re-derives them. Reclassifying, deleting or moving a device afterwards cannot change what a past invoice says it billed. If that invoice is voided and reissued, its recorded device evidence is copied to the replacement rather than recalculated.

Each billed period also records how many devices no line on that contract billed, by role, together with the flagged and billed overage totals. The contract’s billing history shows this outcome for each period.

Uncovered device identity is not stored. A period says how many devices were uncovered and by which role, never which ones. To answer “Which devices are uncovered right now?”, use the device Billing panel or the contract’s coverage notice. Both check today’s fleet live.

Periods billed before this feature was available have no recorded outcome and show Not recorded. A period on a contract with no device-counted line shows No device lines. That means no measurement was taken, not that zero devices were measured.

A contract with an end date can be set to renew itself automatically instead of expiring. When auto-renew is on, Breeze extends the contract’s term in place before it lapses, so billing continues without a gap and you never have to recreate the agreement.

To enable it, give the contract an end date, then turn on Auto-renew at end of term and set:

  • Renewal term (months) — how far each renewal extends the end date (for example, 12 to renew for another year).
  • Advance notice (days) — how many days before the end date Breeze warns you that a renewal is coming. Defaults to 30.

On the contract’s detail page, the Renewal summary shows the current setting (the renewal term, the current end date, and the notice lead time) or that the contract does not auto-renew.

Select contracts using the checkboxes in the contract list to reveal a bulk action bar.

Action Permission required
Cancel Contract management
Delete drafts Contract write

Actions run per-item in isolation, so partial success is possible.

Service deliverables (v0.113.0+) track the recurring work a customer is paying for — the monthly patch report, the quarterly review, the annual DR test — so nothing is silently missed and the customer can see what was delivered. Deliverables live on the organization, optionally tied to a contract, and appear in three places:

  • the organization’s Service tab (Organizations → (organization) → Service), with an Upcoming 90 days panel;
  • a Service deliverables section on each contract’s detail page, for deliverables tied to that contract;
  • the customer portal’s Service page, when you turn it on for that customer (see Customer Portal).
  1. Open the organization’s Service tab and click Add deliverable.
  2. Name it, describe it, and optionally pick the Contract it belongs to (or leave Not tied to a contract).
  3. Choose a Cadence — Monthly, Quarterly, Every six months, Annually or One time — and the First due date. Effective from / until bound the schedule; Lead time controls how many days before the due date the occurrence opens, and Grace period how long after it a late delivery still counts before it is Missed.
  4. Decide how an occurrence completes: Marked delivered by a technician, or Delivered when the linked ticket resolves. Turn on Evidence required before marking delivered if a report, screenshot or PDF must be attached first; Attach report runs as evidence files matching report runs automatically.
  5. Optionally set an Owner and a Ticket category — the daily sweep opens a ticket for each occurrence that comes due, assigned and categorised from these — and Show in customer portal.

Each deliverable rolls up to a status of On track, Due soon, Late, Missed or Inactive. Each occurrence is Scheduled, Open, Awaiting evidence, Delivered, Missed or Waived; from an occurrence you can Mark delivered, Waive, Reopen, Reschedule, or Add / Remove evidence. Evidence is a PDF, JPEG, PNG or WebP up to 10 MB and is filed in the organization’s document library as it is attached.

The Service tab also keeps the organization’s key dates — insurance renewals, vendor contract ends, compliance deadlines, audits, or anything else. Give each one a label, a date, a Remind (days before) lead, and optionally an owner, notes, Repeats every year and Show in customer portal. When the reminder window opens, the daily sweep raises a ticket (once per date) for the owner; annual key dates roll forward to the next anniversary after they pass.

Define a service tier once and apply it to any customer. Under Settings → Deliverable Templates, create a template set — owned by All organizations (partner-wide) or This organization only — and add the deliverables it contains. From an organization’s Service tab, Apply template set creates every deliverable in the set for that organization (optionally tied to a contract, with an effective-from date and an owner) and reports what it created and what it skipped because it was already present. Managing partner-wide sets requires full partner organization access.

A template item’s evidence source can also be set to one of the automated evidence reports (identity & access review, vulnerability management, endpoint management review, threat detection review). Every organization the template applies to then gets a period-correct evidence artifact generated automatically for that deliverable, instead of a technician needing to run and attach a report by hand each period.

The legal document a customer signs with a proposal – your MSA or standard terms – is an agreement template, and the copy they signed is a signed agreement. Both live in their own area now: see Agreements. A signed agreement is filed against the contract the accepting quote created, and appears in the Signed agreements section of that contract.

Contract access is governed by role permissions: viewing requires contract read access, creating and editing requires contract write access, and lifecycle actions (activate, pause, resume, cancel) require contract management access. Service deliverables ride on the same contract permissions, and attaching evidence to a deliverable additionally needs the Documents: write permission (documents:write), because evidence is filed in the organization’s document library.

Agreement templates and signed agreements have their own permissions (agreements:read / agreements:write), documented on the Agreements page. Splitting them lets you grant one without the other: a technician who needs a customer’s signed MSA does not need contract billing authority, and a billing clerk who runs recurring contracts does not need to author legal terms.

Assign these through Settings → Users & Roles.