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
- 1Go 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.
- 2Pick the customer + service
Customer must already exist. Service name is free-form (e.g. 'Biweekly drain inspection').
- 3Set 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.
- 4Set 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.
- 5Pick pricing + collection mode
Two independent axes — see the Collection modes article. Default: per-visit pricing with auto-invoice each cycle.
- 6Save
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).
/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.