Skip to main content
All quotes & invoices articles

Recurring service contracts

Set up customers on a recurring schedule (weekly, biweekly, monthly) — Plyrium auto-generates the visits + handles billing.

Updated 2026-04-30

A recurring service contract puts a customer on a repeating schedule — weekly mowing, biweekly cleaning, monthly water-softener service, quarterly HVAC tune-up, etc. Plyrium auto-generates appointments on your calendar via a nightly cron, and handles billing one of three ways depending on what fits your shop.

Creating a contract

  1. 1
    Go to /portal/contracts and click 'New contract'

    Or open any customer's detail page and use the 'Set up recurring →' link in the Recurring contracts section.

  2. 2
    Pick the customer + service

    Customer must already exist. Service name is free-form (e.g. 'Biweekly drain inspection').

  3. 3
    Set frequency + day

    Weekly or biweekly → pick day of week. Monthly → pick day of month (Feb-29 auto-clamps to Feb-28). Time of day defaults to 9am; override per-contract.

  4. 4
    Set price + start date

    Price/visit, start date (defaults to today), optional end date (leave blank for indefinite). End date auto-stops the contract; cancel manually any time.

  5. 5
    Pick pricing + collection mode

    Two independent axes — see the Collection modes article. Default: per-visit pricing with auto-invoice each cycle.

  6. 6
    Save

    Cron generates appointments on its next 5am UTC run. Or trigger it manually for testing.

What you get

  • Appointments auto-appear on /portal/schedule with a '♻ recurring' badge linking back to the contract.
  • Customer detail page shows their active contracts in a dedicated section.
  • Contract detail page (/portal/contracts/[id]) shows next 3 visits, full visit history, and the active billing pipeline.
  • Pause / resume / cancel from the contract row actions or detail page.

When the cron skips a contract

  • Status is 'cancelled' or 'completed' (no future visits).
  • Status is 'paused' AND today is before paused_until.
  • End date is in the past.
  • Visit on the target date already exists (idempotency — re-running the cron is safe).
The recurring revenue tile

/portal/contracts shows estimated monthly recurring revenue from active contracts at the top. It's a quick read on how much of your monthly cash flow is locked in vs. job-by-job.

Ready to try this in the actual product?

14-day free trial, no card charged for 14 days, cancel anytime.

More quotes & invoices articles