Client Engagement
How Riverstone Labs Helped OfficeCrew Ship Production-Ready AI Integrations in 6 Weeks
OfficeCrew had built an AI phone agent for trade businesses. The integration layer underneath — ServiceM8, Xero, MYOB, calendar systems — kept breaking in production. We shipped the production stack in 6 weeks.
OfficeCrew came to us with a problem most AI startups eventually hit. Their voice agent worked beautifully in demos. The integration layer underneath — the part that actually connects an AI conversation to a real plumber's calendar, a real Xero ledger, a real ServiceM8 job — kept breaking in production. They'd spent three months fighting it before bringing us in. We shipped the production stack in six.
The pitch that resonated
OfficeCrew had a clear value proposition: AI phone answering for Australian trade businesses that actually integrates with their job management systems. No more missed calls. No more voicemail tag. An AI agent that answers 24/7, captures job details, gives accurate quotes, and books straight into the calendar.
The concept landed immediately with plumbing, electrical, and HVAC businesses. The founders had trade industry experience. They knew the pain firsthand: owners on tools all day, one part-time admin overwhelmed, competitors picking up the calls you miss.
But when they started building, they hit a wall. The AI conversation layer worked fine in demos. The integration layer — connecting that AI to real job systems, real calendars, real customer databases — was a different story.
The reality: integration is where AI projects die
OfficeCrew's core promise depended on four capabilities:
- Real-time calendar availability — Check if the plumber is free Thursday morning before booking.
- Quote calculation — Price a blocked drain based on service type and postcode.
- Job creation — Push the booked job into the business's job management system.
- Customer lookup — Know if this caller is an existing customer with service history.
Each of these sounds simple. None of them are. We're still not sure why job management platforms make calendar availability so difficult to query, but they do.
Australian trade businesses use a fragmented mix of systems: ServiceM8 for job management, Xero and MYOB for accounting, ServiceTitan for larger operations, plus Google Calendar and Microsoft 365 for scheduling. Each with different APIs, auth flows, and data models. What "customer" means in ServiceM8 is not what it means in Xero. Calendar availability in Google Calendar requires completely different queries than in Microsoft 365.
OfficeCrew's first ServiceM8 integration worked in testing. Then they deployed to a real plumbing business and discovered: webhooks failed silently when the API rate limit hit, quote calculations returned wrong amounts for certain postcodes, and the OAuth token refresh logic broke every 14 days requiring manual reconnection. They couldn't scale sales while debugging integration edge cases.
Why we got the call
We'd shipped ServiceM8 + Xero integrations in production for other Australian businesses. In our first conversation, OfficeCrew's founder described an OAuth refresh bug they'd been fighting for two weeks when connecting to Xero — and we recognised it from a deployment we'd shipped six months earlier on a different project. The integration patterns repeat; the trick is having seen them in production before.
OfficeCrew needed deep knowledge of Australian trade software ecosystems, production-grade architecture, and speed. The brief was specific: we'd build and maintain the integration layer; they'd focus on the AI conversation, customer onboarding, and sales. Clear scope, clear ownership.
What we built
A unified integration architecture
Instead of one-off connectors per platform, we built an abstraction layer that normalises across job management systems. Separate connectors would have taken 4x longer and created a maintenance nightmare downstream.
- Common data model — Customer, Job, Appointment, Quote, and ServiceType objects that map to each platform's specific schema.
- Authentication management — OAuth flow handling, token refresh logic, and credential rotation across three different OAuth philosophies.
- Error handling — Retry logic, circuit breakers, and graceful degradation when third-party APIs are down (they are, more than you'd think).
- Webhook processing — Real-time event ingestion for calendar changes, job updates, and customer modifications.
OfficeCrew's voice product writes to a single API. We handle the translation to ServiceM8's job endpoints, Xero's contact and invoice structures, MYOB's different authentication flow, ServiceTitan's heavier API requirements, and the calendar quirks of both Google and Microsoft 365.
The hard parts
ServiceM8, Xero, and MYOB: three different OAuth philosophies. ServiceM8's API is powerful but particular — OAuth tokens expire silently, rate limits kick in without warning. Xero uses a different token refresh pattern entirely. MYOB adds another variation with partner-level auth requirements. We built a unified auth manager that handles each platform's quirks: token refresh logic that fails gracefully, retry logic with exponential backoff, and credential rotation that doesn't break live connections.
Google Calendar and Microsoft 365: two different time formats. The AI can't say "let me check" and pause for 5 seconds — callers hang up. But Google Calendar and Microsoft 365 handle availability queries completely differently. Google uses RFC 3339 timestamps. Microsoft uses their own dateTime format with timezones that behave unexpectedly. We built a caching layer with aggressive invalidation: calendar data is fresh within 30 seconds, but lookups return in under 200ms. When the cache misses, the AI gives a fallback response while the lookup happens async.
Quote calculation engine. Trade businesses have complex pricing: call-out fees vary by distance, hourly rates differ by service type, after-hours premiums apply. OfficeCrew needed postcode-aware pricing that could handle 40+ service variations. We built a rules engine that accepts natural-language inputs ("blocked drain in North Lakes") and returns accurate quotes without hardcoding every postcode.
Race conditions. A caller asks for Thursday 10am. The AI checks: available. The caller confirms. Before the job is created, another call books that slot. We implemented pessimistic locking with 5-minute holds — when the AI quotes a time, it's reserved until the call completes or times out.
The "I don't know what's wrong" problem. Callers often don't know if they need a plumber or an electrician. They describe symptoms: "my hot water's making a weird noise." We built classification logic that maps fuzzy descriptions to service types with confidence scoring. Low confidence triggers a human handoff rather than a wrong booking.
Voice-to-data pipeline
The voice layer produces conversation transcripts. We built the pipeline that turns those into structured data the integration layer can act on: entity extraction (service type, location, urgency, preferred time, contact details), validation (postcode, phone number, business hours), context enrichment (existing customer lookup, service history, outstanding jobs), and the job creation payload formatted to each platform's specific required/optional fields.
Results
Six weeks from engagement to production launch. Six platform integrations live: ServiceM8, Xero, MYOB, ServiceTitan, Google Calendar, Microsoft 365. Real-time calendar sync with sub-second lookup times. Quote calculation engine handling 40+ service types across Australian postcodes.
First three months in production:
- 10,000+ calls processed with zero data loss
- 2.4 second average time from call answer to job creation
- 31% of calls resulted in direct AI booking without human touch
- 12 hours/week average time saved per trade business owner on phone admin
What we learned
Integration is 80% of the work, 20% of the demo. Everyone focuses on making the AI sound natural. That's table stakes in 2026. The hard part is making the AI do something useful with the information it collects. That requires deep, reliable, production-grade integrations.
Trade businesses are snowflakes. Every plumbing business thinks their workflow is unique. They're mostly right. Quote logic, service areas, escalation rules — they all vary. We built configuration layers that let the platform customise per client without writing new code.
Fallbacks matter more than perfect AI. When the integration fails, the AI needs to know. When confidence is low, the handoff needs to be clean. We spent as much time on "what happens when this breaks" as on the happy path.
Most AI projects fail at the integration layer, not the model layer. Getting a model to sound human is straightforward now. Getting it to reliably check a ServiceM8 calendar, sync with Xero contacts, write to Google Calendar, calculate a postcode-based quote, handle API failures gracefully, and book a job without double-booking — that's the actual work.
If you're building something similar and the integration reality is killing you, book a Diagnose call. And if you run a trade business — OfficeCrew is doing serious work on the AI phone-answering side.
Want a similar outcome?
Free 30-minute Diagnose call. We'll look at your specific situation and tell you upfront whether we're the right fit for what you're trying to build.
Book a Diagnose call