How it works
Webhooks → Zapier Catch Hook → any of 6,000 apps.
- 1. Create a Zap with a Webhooks by Zapier trigger. Pick "Catch Hook" — Zapier gives you a unique URL.
- 2. Register that URL as a DirtFleet subscription. In-app:
/settings→ Webhooks → New. Pick the events you want. Save and grab the signing secret (shown once). - 3. Wire the rest of the Zap. Add an action step targeting whatever tool you want — Slack, QuickBooks, Google Sheets, etc. Map fields from the trigger payload to the action's inputs.
- 4. (Optional) Signature verification. If you want Zapier to verify the HMAC signature before running the Zap, add a JavaScript code step that recomputes the signature with your secret and rejects if mismatched. For most low-stakes channels (Slack notifications, spreadsheet rows) the obscurity of the URL itself is sufficient.
Triggers
The twelve tool / fleet webhook events Zapier can react to.
flag.createdWhen a flag is raised
Driver or AUTO_PM raised a YELLOW or RED flag against an asset. Payload includes asset nickname, severity, note, photo URL, who raised it.
flag.resolvedWhen a flag is resolved
Flag closed out. Payload includes resolution note and who resolved it.
workorder.completedWhen a work order is completed
Work order flipped to DONE. Payload includes WO number, total labor hours, total cost, completion timestamp.
hours.loggedWhen meter hours are logged
Driver or device submitted a new HoursLog. Payload includes asset id, new reading, delta from previous reading.
asset.createdWhen an asset is added to the fleet
New Asset row. Payload includes assetClass and meter type.
tool.failureWhen a tool is reported broken
Tool status changed to BROKEN. Payload includes tool name, category, who reported it, optional notes.
tool.checked_outWhen a tool is checked out
Tool moved to a user, vehicle, or linked-asset checkout. Payload includes toUserId, toVehicleId, optional linkedAssetId, the eventId of the underlying CHECK_OUT row.
tool.checked_inWhen a tool is checked back in
Tool returned. Payload includes the observed condition (GOOD / NEEDS_ATTENTION / BROKEN), the resulting Tool.status, and the auto-spawned workOrderId when condition is BROKEN.
tool.low_stockWhen a consumable just crossed under its reorder threshold
A POST /tools/{id}/adjust-stock call dropped the stockLevel below COALESCE(minStockLevel, 5) for the first time. Payload includes previousStockLevel, newStockLevel, the row-level minStockLevel (or null for the org-wide fallback), and the effective thresholdUsed. Only the crossing fires — going further below or restocking does not retrigger.
tool.assignment_changedWhen a tool gets reassigned (user / vehicle / yard / kit)
A PATCH /tools/{id} call moved assignedUserId, assignedVehicleId, assignedYardId, or parentKitId. Payload includes a changes array enumerating each kind that moved in the same PATCH (one delivery per PATCH, even if multiple fields changed) plus the actorId who initiated it. Mirrors the internal ASSIGNMENT ToolEvent audit feed.
tool.servicedWhen a PM service is recorded on a tool
A POST /tools/{id}/mark-serviced call updated lastServicedAt. Payload includes previousLastServicedAt (null on first service), newLastServicedAt, the pmIntervalDays in effect at service time, the actorId, and any free-form note. Mirrors the internal pm_serviced: AUDIT ToolEvent.
tool.createdWhen a new tool is created (single or bulk)
A POST /tools or POST /tools/batch entry created a new Tool. Bulk imports emit one delivery per row. Payload includes toolId, name, category, isConsumable, scanToken (so receivers can immediately render the QR/NFC label), optional purchaseCost (useful to prime asset depreciation), and the actorId (null on bulk-import paths).
Ready-to-copy
Six prebuilt zap templates.
Pick one that matches your workflow and recreate it in Zapier with these field mappings. Total setup time per template: under 5 minutes.
Red flag → Slack channel
Post a message to your shop's #flags Slack channel every time a RED flag fires. Includes asset name and the photo if one was attached.
- Trigger
- flag.created (filter: severity = RED)
- Action
- Slack: Send Channel Message
- Field mappings
- • Channel: "#flags"
- • Message: "{{asset_nickname}} just got flagged RED — {{note}}"
- • Attachment: {{photo_url}} (if present)
Completed WO → QuickBooks Online expense
When the shop closes a work order, create a corresponding expense entry in QuickBooks under the asset's project P&L category.
- Trigger
- workorder.completed
- Action
- QuickBooks Online: Create Expense
- Field mappings
- • Vendor: DirtFleet (or the parts supplier from the repair log)
- • Amount: {{cost}}
- • Memo: "WO #{{number}} on {{asset_nickname}}"
- • Category: {{project_id}} → mapped to your QBO class
Hours log → Google Sheets row
Append every hours log to a shared Google Sheet — the finance team's backup ledger that runs alongside DirtFleet's own export.
- Trigger
- hours.logged
- Action
- Google Sheets: Create Spreadsheet Row
- Field mappings
- • Spreadsheet: shop-hours-2026
- • Row: [loggedAt, asset_nickname, hours_reading, delta, logged_by]
Urgent WO → SMS to on-call mechanic
Page the on-call mechanic by SMS when a URGENT work order is created. Uses your existing on-call rotation in Pagerduty or Twilio.
- Trigger
- workorder.created (filter: priority = URGENT)
- Action
- Twilio: Send SMS
- Field mappings
- • To: lookup from on-call rotation
- • Message: "URGENT WO #{{number}}: {{title}} — {{asset_nickname}}"
Tool failure → Maintenance Slack
Notify the tools-and-equipment Slack channel when a power tool gets reported BROKEN — so the next crew using it knows before they pack the truck.
- Trigger
- tool.failure
- Action
- Slack: Send Channel Message
- Field mappings
- • Channel: "#tools"
- • Message: "{{name}} ({{category}}) reported broken by {{reporter_name}}. {{notes}}"
New asset → CMMS sync
Mirror new assets into your secondary CMMS or spare-parts inventory system so the records stay in lockstep.
- Trigger
- asset.created
- Action
- Your CMMS API / generic Webhook
- Field mappings
- • Body: { id, nickname, assetClass, meterType, vin, serial }
Tool checked out → log to job sheet
Append every tool checkout to the row in a job spreadsheet so finance can attribute equipment usage to the right project. Pairs naturally with the linkedAssetId field on the payload.
- Trigger
- tool.checked_out
- Action
- Google Sheets: Create Spreadsheet Row
- Field mappings
- • Spreadsheet: job-tool-attribution-2026
- • Row: [occurredAt, tool_name, toUser_name, linked_asset, note]
Low stock → reorder via supplier portal
When a consumable crosses its reorder threshold, POST to your supplier's purchase-request endpoint (Grainger, Fastenal, Amazon Business) so the box ships before the drill bits run out. Pair the webhook with the supplier field on the Tool to route the right SKU.
- Trigger
- tool.low_stock
- Action
- Webhooks by Zapier: POST
- Field mappings
- • URL: https://your-supplier.example/orders (or Slack)
- • Body: { "tool_id": "{{toolId}}", "sku": "{{tool.serial}}", "current_qty": "{{newStockLevel}}", "reorder_to": "{{thresholdUsed * 4}}" }
Tool reassigned → mirror to accounting / HR ledger
Every time tool ownership moves (user / vehicle / yard / kit), POST the change to your accounting or HR system so the parallel asset register stays in lockstep with DirtFleet — no nightly reconciliation job needed.
- Trigger
- tool.assignment_changed
- Action
- Webhooks by Zapier: POST
- Field mappings
- • URL: https://your-erp.example/tool-transfers
- • Body: { "tool_id": "{{toolId}}", "actor_id": "{{actorId}}", "changes": {{changes}}, "at": "{{at}}" }
PM service → mirror to asset depreciation system
Every time a mechanic marks a tool serviced, push the event to your depreciation / warranty system so service history stays in lockstep without nightly reconciliation. Use the pmIntervalDays field to compute the next due date.
- Trigger
- tool.serviced
- Action
- Webhooks by Zapier: POST
- Field mappings
- • URL: https://your-cmms.example/service-history
- • Body: { "tool_id": "{{toolId}}", "serviced_at": "{{newLastServicedAt}}", "previous": "{{previousLastServicedAt}}", "interval_days": "{{pmIntervalDays}}", "note": "{{note}}" }
New tool created → seed accounting / asset register
When a tool is created (single or bulk import), push it into your accounting or asset-register system so the new row exists before its first checkout/depreciation event arrives. The scanToken in the payload lets you immediately render and print the QR/NFC label.
- Trigger
- tool.created
- Action
- Webhooks by Zapier: POST
- Field mappings
- • URL: https://your-erp.example/assets
- • Body: { "tool_id": "{{toolId}}", "name": "{{name}}", "category": "{{category}}", "purchase_cost": "{{purchaseCost}}", "scan_token": "{{scanToken}}", "created_by": "{{actorId}}", "created_at": "{{at}}" }
Beyond Zapier
Native API integration
Zapier is the no-code path. For tighter integration the public REST API at /docs/api gives you typed access to every resource (assets, hours, flags, work orders, tools, projects, yards, webhooks). OpenAPI spec at /openapi.yaml; AsyncAPI spec at /asyncapi.yaml for the webhook side. Codegen guides at /docs/api/sdk.
Need a template that isn't here? Email support@dirtfleet.app — if it's a common ask we'll write it up and add it to this page.