Skip to main content
All schedule & jobs articles

Projects — multi-visit job rollups

Group multiple appointments, invoices, change orders, and receipts under one project so revenue, cost, and profit roll up together.

Updated 2026-05-02

A project is a parent rollup for multi-visit jobs. Use them when one customer has several appointments, multiple invoices, change orders, and receipts on the same job. The project page shows total invoiced, materials, labor, profit, plus links to every child entity in one place.

When to use projects (and when NOT to)

  • USE for a 6-week kitchen remodel: 8 visits, 12 invoices, 15 receipts, 32 labor hours.
  • USE for a multi-week landscape install: 4 crews, 3 invoices for materials + labor, weekly progress visits.
  • USE for any job over $5k that spans more than one visit.
  • DON'T USE for a one-off service call: a single appointment + a single invoice doesn't need a parent.
  • DON'T USE for recurring contracts: those have their own roll-up at /portal/contracts/[id].

Creating a project

  1. 1
    Go to /portal/projects → New project

    Pick the customer, name the project (e.g. 'Master bathroom remodel'), describe scope, optionally set quoted total + start + expected completion.

  2. 2
    Address inherits from customer

    Defaults to the customer's billing address. Override if the project is at a different site (rental property, second home).

  3. 3
    Save

    You're now ready to link child entities. Future quotes, invoices, appointments, change orders, receipts, and time entries can be tagged with this project_id from their respective composers.

What rolls up

InvoicedSum of every linked invoice's total_cents.
CollectedSum of every linked invoice's amount_paid_cents.
MaterialsSum of every linked expense's amount_cents.
LaborSum of every linked time_entry's cost_cents.
Net profitInvoiced − materials − labor. Live updated as new entities link in.
Quoted vs invoicedIf you set a quoted_total_cents at create time, the project page shows variance (+ or − vs quoted).
Mark complete when the job is done

Click 'Mark complete' on the project detail page when work wraps. The project moves to a completed state with a completed_at timestamp — useful for year-over-year reporting + 'how long did this kitchen actually take?' analysis.

Linking is opt-in for now

v1 ships with project-tagging on the data model but the composers (quote, invoice, appointment) don't yet expose the project picker. You can backfill via API or wait for the composer wiring in a follow-up release. The project rollup only counts entities with project_id explicitly set.

Ready to try this in the actual product?

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

More schedule & jobs articles