How Fixly dispatches home service jobs by SMS
The tech behind first-to-claim job offers — how nearby 1099 pros get pinged, how they claim work, and how it stays fair.

## Why SMS dispatch beats a "book anytime" calendar
Most home service apps let you pick a slot on a calendar and then quietly ping a dispatcher who calls around until someone says yes. Fixly flips the model. The moment a customer pays, the job goes live to every verified pro inside a widening radius. First pro to tap Claim wins the job. No back-office phone tag, no "we'll get back to you," no ghost bookings.
This post walks through exactly how it works, why we built it this way, and what happens when nobody claims the job in the first pass.
The 4-stage lifecycle of every job
Every Fixly job moves through four states, and each state has a clear owner:
1. Paid — Stripe confirms the charge and the job row flips to `awaiting_admin` (during our manual-review launch) or `offered` (once auto-dispatch is on). 2. Offered — The dispatch engine ranks nearby verified pros by distance, rating, and recent response rate, then blasts an SMS with a claim link. 3. Claimed — The first pro to tap the link wins atomically. Every other pro sees "already claimed" and moves on. 4. Scheduled → Completed — The winning pro coordinates arrival time with the customer, marks the job done, uploads before/after photos, and gets paid.
The atomicity in step 3 matters more than anything else. If two pros tap Claim at the same second, exactly one wins — enforced by a Postgres row-level update guard, not by application code that could race.
Why widening radius, not a fixed one
A fixed 10-mile radius sounds simple but breaks in two directions:
- In dense metros, 10 miles is too wide — you're pinging pros who won't drive across town for a $59 TV mount.
- In suburbs, 10 miles is too narrow — the nearest verified pro might be 14 miles away, sitting idle.
Fixly starts at 3 miles for quick handyman jobs and 8 miles for multi-hour cleans, then widens by 3 miles every 4 minutes if nobody claims. The escalation is capped at 25 miles. If nobody claims by then, the job auto-refunds through Stripe and we email the customer — no manual intervention, no orphaned charges.
What "verified" actually means
Before a pro can receive dispatch SMS, they clear four gates:
- Identity — government ID upload, matched to their onboarding name
- Background — self-attested criminal history disclosure with a signed acknowledgment
- Liability agreement — the E-SIGN Pro Services Agreement, digitally signed, storing IP and timestamp
- Payout account — verified ACH or PayPal so we can pay them within 48 hours of job completion
See what Fixly verifies before dispatch for the full breakdown.
Why SMS, not push notifications
Push notifications require an app install. An app install requires an app store review. App store review requires a company entity, screenshots, a privacy policy review, and about six weeks of back-and-forth. SMS works on every phone that can accept a booking today.
Twilio delivery to a US carrier averages 3–8 seconds. A pro sees the SMS on their lock screen while they're finishing a different job, taps the link, and either claims it or dismisses. No app, no login, no friction.
For the customer side we still use email and the web app for confirmation and receipts — but the pro side is intentionally SMS-only.
The claim link is a signed URL
The SMS a pro receives looks like this:
> New Fixly job — TV Mount, $59, Fresno CA. Claim: https://letsfixly.com/pro/claim/abc123?t=… Reply STOP to opt out.
That `?t=` token is a short-lived HMAC-signed claim token. It carries the job ID and the pro ID together. When the pro taps it, the server verifies the signature before accepting the claim. No token, no claim. And because it's tied to the pro ID, forwarding the SMS to another pro won't let them claim it.
What if nobody claims?
Two guardrails:
- Escalation — every 4 minutes an escalation cron widens the radius and re-blasts. Pros who were already offered don't receive a duplicate SMS.
- Auto-refund — at the 25-mile cap the job flips to `refunded`, the customer receives a "sorry, no pros available" email, and Stripe issues a full refund automatically. No dispatcher, no phone call, no manual queue to clear.
What if two pros race to claim?
This is where most first-to-claim marketplaces quietly cheat — they mark it "claimed" for whoever the server saw first, then hope the second pro doesn't refresh. Fixly uses a Postgres row-level guard: the claim SQL is an update-with-where-clause that fails silently if the job is already in `claimed` state. The second pro sees a clear "already claimed" screen and their SMS thread is closed.
We also log every claim attempt (winning or losing) to `job_events` so we can audit races in support.
Booking a Fixly job
If you're a landlord or homeowner reading this, browse services and book — the dispatch engine kicks in the moment payment clears. If you're a pro who wants to start receiving dispatch SMS, start the onboarding wizard. Four steps, about ten minutes, and you're in the pool.
Book a Fixly pro in minutes
Fixed-price cleans, handyman fixes, and rental condition reports — SMS-dispatched to nearby 1099 pros.
Get started