Procore
Authentication
OAuth 2.0 with org-level + project-level scopes. Refresh-token rotation every 12h.
Sync model
Bi-directional event-driven via webhooks + 4h fallback poll. OmniTakeoff is source-of-truth for takeoff data; Procore is source-of-truth for project metadata + RFIs.
Conflict resolution
Last-writer-wins on metadata. Hard conflict on quantities (e.g., user edits same line in both systems within sync window) → flagged in /audit and surfaced to project owner. Never silently overwrite.
Webhook events / API surface
project.created → OmniTakeoff project + bid scaffoldrfi.created → OmniTakeoff RFI tracker entrysubmittal.created → spec-link backrefdrawing.published → re-take-off prompt + diff against prior
Rate limits + throttling
Procore: 1000 req/hr per token (we self-throttle to 600). OmniTakeoff outbound: 60 req/min per integration with token-bucket smoothing.
Failure modes we've hit + handle
- Procore token refresh failure — surfaced in admin dashboard with 'reconnect' CTA after 1 silent retry
- Webhook delivery delayed >2h — falls back to next 4h poll, no data loss but staleness visible in UI
- Schema drift on Procore API — we pin to a stable API version + announce 30-day migration windows