Skip to content

Webhooks: leads & estimates to your CRM

A webhook sends a copy of your data, automatically, to an address you choose — no exporting, no checking back in the dashboard to see if something new came in.

Both live in Settings → Integrations, and they are entirely separate — pasting a URL into one has no effect on the other.

  • Webhook URL fires once for every new lead, right after it’s captured.
  • Estimate handoff webhook URL fires once when a rep in the field app marks an estimate Sent.

You can set either, both, or neither. A contractor who only wants new leads flowing into their CRM never needs to touch the second field.

Both webhooks send a POST request with a JSON body — the same format nearly every CRM, Zapier, and Make integration expects out of the box.

The lead payload carries the homeowner’s contact details, the price tiers they were shown, which trees were pinned, and — when it’s available — the visit history that led to the lead and the estimated value reported toward your ad conversions. It’s built to be safe to hand to a CRM’s customer-facing timeline.

The estimate payload carries what a rep priced in the field: the customer’s name and address, every tree line with its diameter, service type, and price, and the total the rep actually quoted. This one is your own pricing detail, not something to forward to the homeowner — it includes your base rates and multipliers, which are meant to stay inside your business.

One thing the estimate payload never includes: any AI species suggestion or plant-health note added by the field app’s tree classifier. That stays internal to your account and never reaches this webhook.

Both payloads gain new fields from time to time as features ship. If you want the complete, field-by-field reference to build an integration against, ask support for it — it’s kept current outside this wiki so it never drifts out of sync with what’s actually sent.

Point either URL at a Zapier “Catch Hook” trigger, a Make webhook module, or an endpoint on your own system that accepts a POST with a JSON body. From there, map the fields you care about — name, phone, email, address, and price are usually the starting set for a new lead; customer name, total, and status for a sent estimate.

The fastest way to confirm a webhook works is to trigger the real thing: submit a test quote through your online estimator to fire the lead webhook, or send a test estimate from the field app to fire the estimate webhook. Check the receiving end — Zapier’s task history, Make’s run history, or your own endpoint’s logs — for the incoming request.

Neither webhook retries. Each one makes a single attempt. If your receiving endpoint is down or times out, that delivery is gone — it won’t be tried again. This never affects the lead or estimate itself, which is always saved first regardless of what the webhook does.

A failed lead webhook doesn’t fail the lead. Lead capture and estimate saving both happen first, independent of whether the webhook succeeds. For leads, you can see whether the last delivery succeeded or failed on the lead’s detail screen, once that delivery attempt has finished — it’s blank on a lead you’re viewing the instant it was captured. The estimate webhook doesn’t currently record its outcome anywhere you can check — if you suspect deliveries are failing, confirm on the receiving end.

Read fields by name, never by position. New fields get added to both payloads as the product grows, and the order of things in the JSON isn’t a promise. A Zap or script that reads “the third item in the array” will eventually break in a way that’s hard to trace; one that reads a named field survives additions cleanly.

These addresses are your own — nothing about them changes what your ad platforms see. That’s a separate topic, covered next.