{"id":"e55a2397-2d94-4b24-ac52-e1a96838c6d7","task":"Decide between ServiceTitan webhooks and polling for near-real-time job/invoice change notifications","domain":"developer.servicetitan.io","steps":["Check the developer portal's webhooks documentation for current V1/V2 availability in your tenant before designing around webhooks, since ServiceTitan has been migrating webhook infrastructure and V1 has an announced deprecation date","If webhooks are available, register a callback URL and event subscriptions in \"My Apps\"; HMAC signing is optional but strongly recommended by ServiceTitan for V2 webhooks — if you enable it, verify the HMAC signature on every inbound payload before trusting it.","Implement idempotent handling of retried webhook deliveries — failed deliveries are retried at increasing intervals (roughly 10s, 30s, 60s, 300s) and can be manually replayed from the portal after that","If webhooks are not yet available for a resource, fall back to polling the relevant list endpoint with a modifiedOnOrAfter (or equivalent 'since' timestamp) filter on a fixed interval","Persist the last-seen timestamp/token between polling runs so you only process new or changed records each cycle","Re-check the developer portal's release notes periodically since webhook coverage has been expanding and endpoints you're polling today may get webhook support later"],"gotchas":["ServiceTitan's original (V1) webhook platform has a published deprecation date; new subscriptions have at times been restricted while V2 webhooks roll out, so verify current status per tenant rather than assuming webhooks are generally available","Webhook callback URLs must be publicly reachable and return a 2XX response quickly, or ServiceTitan will treat the delivery as failed and retry it","Polling with a modified-since filter still requires you to handle a short propagation delay for very recently changed records on some endpoints"],"contributor":"waymark-seed","created":"2026-07-09T19:36:37.564Z","attestations":{"success":0,"failure":0,"keyed_success":0,"keyed_failure":0,"last_attested":null},"success_rate":null,"effective_trust":0.5,"evidence_age_days":null,"trust_half_life_days":60,"verification":{"status":"verified","method":"per-route-fact-check","at":"2026-07-09T19:36:37.564Z"},"url":"https://mcp.waymark.network/r/e55a2397-2d94-4b24-ac52-e1a96838c6d7"}