How do you structure your service agreements in FieldPulse?

We've got about 40 commercial HVAC clients on annual maintenance agreements and I'm trying to figure out the cleanest way to handle this in FieldPulse without creating a mess.

Right now we're creating recurring work orders for each quarterly visit, but that means 4 separate WOs per customer per year and no real visibility into "this customer is under contract" vs "this is a one-off."

Also billing is a pain. Some customers prepay the year, some pay quarterly, some we invoice after each visit. FieldPulse doesn't seem to have a "service agreement" object so I'm hacking it with tags and custom fields.

What's actually working for people? Am I missing something obvious or is this just not what the tool was built for?

  • Mike, you're not missing anything — there's no native service agreement entity. Here's how we've structured it for 67 active contracts:

    • Master WO as the "contract record" — status stays Open all year, custom field for contract value, start/end dates, billing terms
    • Child WOs linked via reference number — we put the master WO # in the description of each visit
    • Tag hierarchy: contract-commercial, contract-residential, billing-prepaid, billing-per-visit

    The master WO lets us see contract status at a glance. Reporting is still clunky — I export and pivot in Excel for renewal forecasting.

    Pro tip: Set up an automation rule (if you have API access) to email you 60 days before contract end. We were missing renewals until we did this.

  • Master WO approach is interesting. How do you handle the customers who prepay — do you create a $0 WO for each visit or still show the labor rate and just know not to invoice?

  • We still show real labor/parts rates on each WO. Accounting knows to reference the master WO # — if it exists, check the billing tag before invoicing. Not elegant but it works.

    The $0 approach messes with your technician performance metrics. Don't do that.

  • Another way to think about this: we use the Customer custom fields as our contract ledger. Fields for Contract Type, Expiration Date, Annual Value, Visits Included.

    Recurring WOs are created normally, but the "contract" lives at the customer level. This avoids the orphan WO problem when someone cancels — you don't have a random open WO sitting there.

    From a governance perspective, I prefer this. One source of truth. The tradeoff is you lose the at-a-glance WO status, but our dispatchers know to check the customer record.

  • Nadia's approach is what I'd recommend if you're starting fresh. We're locked into the master WO method now and migrating would be painful.

    One thing I'd add: whatever you pick, document it. We had a dispatcher create WOs as "invoiced" status for prepaid customers thinking she was being helpful. Took weeks to untangle the reporting.

  • Hi Mike! Thanks for bringing this up — service agreements are definitely a hot topic with our larger customers.

    I wanted to share that we're actively exploring a more native service agreement feature for 2026. No timeline to commit to yet, but I'd love to connect you with our product team for a brief call if you're open to sharing more about your specific workflows. Your input would be invaluable.

    In the meantime, I'd echo Gwen and Nadia's approaches. We've seen both work well depending on team size and reporting needs.

    Feel free to DM me if you'd like to chat further!

  • we just use spreadsheets outside fieldpulse for this... not ideal but after 3 years nobody's convinced me the tool can handle it without making more work

  • We've been testing a hybrid: customer custom fields for contract metadata, plus a specific work order template for contract visits that auto-tags and auto-fills the billing reference. The template pulls the contract # from the customer field into the WO description.

    Still manual for renewals but it's cut our setup time per visit significantly. Happy to share the template export if anyone's interested.