We built a QR-to-phone pipeline in nine days
Scan a QR at an event, your phone rings within 90 seconds with an AI agent that already knows your business. Here's the full architecture, end to end.
For a recent meetup, we wanted a small piece of theatre that doubles as a real demo of what we build. The brief: scan a QR code on a business card, fill in a 60-second form, and your phone rings with an AI agent that has already read your website and knows how to talk about your business.
We built it in nine days, and it now lives at autore.ai/connect.
The architecture
The whole thing is a single Next.js app on Vercel, with one durable workflow on Inngest doing the orchestration:
form submit → /api/connect → Inngest event → leadCaptured workflow
│
┌───────────────────────────┼───────────────────────────┐
▼ ▼ ▼
Airtable row Firecrawl scrape VAPI dial-out
│
▼
Claude summarises site
│
▼
Resend welcome email
Each step in the workflow runs through Inngest's step.run, which means:
- Each step is durable — if Resend has a hiccup, only that step retries, and the rest of the workflow doesn't replay
- Each step is observable — the dashboard shows a green-or-red square per step, with timing and inputs
- The whole thing is retryable — three retries per step before the function gives up
The 60-second budget
Most of the time goes into Firecrawl (the website scrape, ~5–15s depending on the site) and the two Claude calls (~3–6s each). Everything else is in single-digit seconds.
Critical decision: we kick off the VAPI call after the Claude summary completes, not in parallel. Why? Because the call's first sentence references the summary. Running them concurrently could leave the agent dialling before it has anything to say.
The hard part wasn't writing any single piece. It was the orchestration — making sure each step was durable, retryable, and visible without lashing them together with
try/catchand prayers.
What we'd change if we did it again
A few small things we'd do differently next time:
- Pre-warm Firecrawl on form mount. The form sits there for ~30s while the user types. We could fire a "warm-up scrape" the moment the URL field validates. That'd shave 5s off the perceived latency on submit.
- Send the welcome email before the call, not as a parallel step. Right now they're sequential. Most users glance at the email subject line first, and a "we're calling now" subject line makes the call feel less abrupt.
- Surface the workflow status to the user. The thanks page just says "we've got it". A live progress strip ("scraping site… drafting email… calling now") would be a small but nice touch.
When this pattern makes sense
Anywhere you want to convert a single moment of attention (a QR scan, a webinar registration, a download) into a richer follow-up than "we'll be in touch".
If you're running an event and want this same pipeline pointed at your audience, book a call. We can have a customised version live in a fortnight.