The Rate Card tab on a customer profile is the primary billing workflow for recurring service — units that live at a customer's sites on an ongoing basis. It's a fully editable table, not just an audit: every row can be edited in place, and it drives both automatic service-job creation and cycle invoicing.
Overview
PortaPro supports three billing sources, set per customer:
Two ways to set up a Service Plan
Setup is no longer confined to one tab — both of these paths open the same Service Plan modal and write to the same underlying Rate Card rows:
Use whichever entry point fits your workflow — auditing revenue from the Rate Card tab, or setting up a new site while you're already in the Sites tab. There's no functional difference between the two.
The Rate Card table
The Rate Card tab displays a table with one row per declared unit type at a site:
| Column | Description |
|--------|-------------|
| Location Address | Street address and location name |
| Units | Number of units declared for this row |
| Type | Unit type (e.g., Standard PT, ADA, Hand Wash) |
| Frequency | How often a driver visits, plus a job chip if a service job exists for this row |
| Rate | Service rate per unit per billing cycle |
| Cycle Value | The dollar amount this row bills per cycle |
The Rate Card tab is fully editable in place — it's not a read-only audit view. Click into any row's actions to change units, rate, frequency, or unit type at any time.
Summary cards
Below the table:
Multi-row sites
A single site can now declare more than one unit type. A construction yard might have 4 Standard PT units on a weekly route, 1 ADA unit on the same route, and a hand-wash station billed separately — that's three Rate Card rows, all tied to the same address. To add a second declaration at a site you're already servicing, open its Service Plan modal (from either entry point above) and click Add another unit type. Each row is independent: its own unit count, type, rate, rate period, and frequency.
How service jobs are created and assigned
Every night, around 04:00 UTC, PortaPro walks the Rate Card. For each row whose next visit (last service date + frequency interval) falls within the organization's configured job lead days (Settings → Finance → Cycle Billing), it creates an unassigned service job on the dispatch board. You don't create these jobs manually — the Rate Card generates them from the frequency you've set on the row.
Assign a driver from the Dispatch board or from the customer's Rentals & Service tab — both write to the same assignment. The route optimizer treats the customer's Preferred Driver (set in Edit Customer) as a hard constraint, so if one is set, only that driver will be suggested for the stop.
On Call rows never auto-schedule. Since the customer calls when they need service, there's no predictable interval to generate a job from — you create those jobs manually when the customer reaches out.
Job chip on Rate Card rows
When a service job exists for a row — auto-generated or manual — a small chip appears in the Frequency column, like "Job Jul 10 · unassigned" or "Job Jul 10 · Mike." Click it to jump straight to the job detail without leaving the Rate Card.
Customer Default Rates
Section 2 of the Rate Card tab holds per-customer catalog price overrides — negotiated pricing that isn't tied to a specific site. For example, a high-volume customer might pay $88/month for a Standard PT instead of the $110 catalog price. Add one via Rate Card tab → Customer Default Rates → Add Default Rate. A summary of these overrides also appears on the Overview tab → Details → "Negotiated pricing" card, so you don't have to open the Rate Card tab just to see what a customer's special pricing looks like.
How pricing resolves
PortaPro prices things two different ways depending on what you're billing, and they don't share a hierarchy.
Track A — Recurring cycle invoices. Each Rate Card row bills its own declared service rate directly when a Cycle Invoice generates. There's no resolver and no fallback chain here — the row's rate is the rate.
Track B — Job and quote line items. One-off jobs, quotes, and manual invoices resolve pricing through a three-layer hierarchy, most specific first: a site's Additional Charge matching the item's description, then the customer's Default Rate, then the catalog price. Recurring Rate Card rows never participate in this hierarchy — they're not a lookup layer for one-off work, they're the billing source for the cycle invoice.
If you're ever unsure which track applies: recurring service billed by the Rate Card is Track A. Anything you build line-by-line in the job, quote, or invoice wizard is Track B.
Billing source
Set per customer in Edit Customer → Billing → Billing source:
| Source | Behavior |
|--------|----------|
| Rate Card | Bill declared units × rate per cycle, straight from the Rate Card rows |
| Completed Work | Bill per completed maintenance report |
| Both | Rate Card base charges plus overage lines at the customer's Overage Rate |
Double-billing warning
If a customer has both an active autopay schedule and billable Rate Card rows, you'll see an amber warning banner on the Rate Card tab, and a warning toast appears when you click Generate Cycle Invoice. Autopay and the Rate Card's cycle invoicing run as two independent billing engines — if both are active for the same charges, the customer gets billed twice. Pause one of them to avoid it.
Unit Type picker
The Unit Type field in the Service Plan modal is a picker over your product catalog — choose an existing catalog product to link the row to it, and service jobs generated from that row will bill it automatically. You can also enter free text for a one-off or unusual unit type that isn't in your catalog; free-text rows still bill correctly, they just aren't linked to a catalog product for auto-fill purposes.
Generating a Cycle Invoice
`[Site Name] — [Unit Count] [Unit Type] x $[Rate]`
You do NOT need to create a job or complete a maintenance report to generate a cycle invoice. Rate Card billing invoices the contract, not individual service visits.
Duplicate prevention
If a cycle invoice already exists for the current billing period, clicking Generate Cycle Invoice will not create a duplicate.
How MRR is calculated
MRR sums every eligible row's rate, normalized to a monthly equivalent. It includes Weekly, Bi-Weekly, Monthly, Twice Monthly, Daily, 28-day-cycle, Quarterly, Annual — and On Call rows (they bill every cycle they're invoiced, so they count). It excludes only flat-rate rows and rows with an unknown or missing frequency, since neither is predictable revenue.
Common questions
Do I need to create a job to invoice for standing units?
No. Set the unit count and rate on a Rate Card row (from either the Sites tab or the Rate Card tab), then generate a cycle invoice.
Can a site have more than one unit type?
Yes. Add another unit type from the Service Plan modal — each becomes its own Rate Card row at the same address.
Is the Rate Card tab read-only?
No. Every row is editable in place from the Rate Card tab itself, in addition to the Sites tab.
Can I see monthly revenue per customer?
Yes. The Rate Card tab shows MRR calculated from all eligible rows, plus a per-row breakdown and a Flagged count for rows needing attention.
Can I mix contract billing with per-visit charges?
Yes. Set billing source to "Both" — PortaPro generates a Rate Card invoice and appends overage lines from completed maintenance reports outside the contract.
