The Recurring-Job Conundrum
Many construction and facilities teams still manage monthly or weekly maintenance with spreadsheets, calendar invites, and ad hoc reminders. When these manual workflows shift to automated flows—built in Power Automate or Azure Functions—scheduling can misfire: two identical service calls landing on the same day. That annoys clients and double-books technicians, eroding trust in “modernized” processes.
That time a Ballard coffee shop’s cleaning crew showed up twice in one morning
In Seattle’s Ballard neighborhood, a local café reported cleaners arriving at 7 AM and 8 AM on a single date. The underlying Azure flow retried on a transient timeout, issuing a duplicate order. Technicians billed hours for both visits. After correcting the retry logic, the issue vanished.
Untangling the Logic and the API
A midwestern HVAC contractor discovered that ServiceTrade’s REST API deduplicates on both frequency
and serviceSchedule.startDate
. A single-letter typo—freqency
—broke the check. Once the JSON matched the published schema exactly, schedule audits dropped by 75%.

Some teams now include an idempotencyKey with each POST—an insurance policy that prevents accidental duplicates when retries occur. This practice comes from fintech, where repeated transaction requests must never post twice.
- webhook loops
- When a webhook triggers an update that fires the same webhook again, causing infinite retries.
- idempotency
- The property that lets repeated API calls have the same effect as a single call.
- calendar drift
- When recurring dates shift over time due to month-length differences or timezone handling.
From Prototype to Production
Skanska’s initial orchestration used Azure Functions, but rapid feedback on r/dotnet noted weak model validation and opaque errors. They migrated to a .NET Web API with dependency injection and strong-typed models. Now JSON schema mismatches surface at build time, not in production.
Deep dive: .NET Web API vs. Azure Functions
- Azure Functions: Easy to spin up, limited model validation, callbacks can hide exceptions.
- .NET Web API: Dependency injection, middleware-based schema checks, clearer stack traces.
- AWS Lambda + QuickBooks Online + Procore: Polling-based orchestrator for final runs.
To close the payroll loop, they integrated the Paiy timesheet API, ensuring technicians’ clock-in/out times match service dates before invoices post.
The Road Ahead
Over 500 recurring jobs now run automatically, saving 60 hours of reconciliation each month. Real-time errors appear on Kibana dashboards, and new admins test against ServiceTrade’s API before deploying flows.
Key best practices:
- Validate every JSON key against OpenAPI or JSON Schema—catch mismatches early.
- Embrace schema-first contracts to lock down payload shapes.
- Include an idempotencyKey for all recurring POSTs.
- Upcoming: Subscribe to ServiceTrade webhooks for instant schedule updates.
Business Analysis, Financial Operations, Tennessee, Ohio, QuickBooks, QBO, Procore, Construction CRM, API Integration, Workflow Automation, REST API, Data Deduplication, Power Automate, Azure Functions, .NET Web API, JSON Schema, Idempotency, Scheduling Automation, Recurring Jobs, Construction Software, Financial Data Accuracy, Error Resolution, Webhook Management, Schedule Optimization, Real-Time Monitoring, API Best Practices