Jake runs Southern Rivers Fly Fishing with five guides. People book Jake because of Jake. The guiding was never the problem. Everything around it was.
Impact
- Bookings this year, with no extra admin
- 2x
- Admin per booking, down from about 3 hours
- 30 min
- Handed back every season
- ~250 hrs
- Email backlog waiting after a trip
- None
Jake doubled his bookings this year. The admin didn't double with them, because a set of AI agents now does the work that used to live in his head and his inbox.
The problem
One person, five guides, and a business held together by Gmail and Google Calendar. Jake was losing 10 to 20 hours a week to admin. Invoices were built by hand in Xero. Declarations arrived as email attachments.
The worst bit was coming off the river. Jake would guide for days, then face an inbox stacked with enquiries. He'd lose a couple of days checking dates, digging out client details and replying to everyone. The business couldn't grow past him. Every new guide just meant more email.
How it grew
I didn't start with an AI agent. I started with the most annoying form in the business, and kept going.
- October 2025A booking form
Clients filled in their trip details and declarations online instead of over email. Airtable underneath.
- November 2025Years of bookings, rescued
I pulled 822 past bookings out of the guides' Google Calendars, using AI to turn calendar notes into clean booking records.
- December 2025An admin portal
One place for every booking, then a portal for the guides in January.
- March 2026A proper back office
Moved off Airtable to Supabase and added Xero invoicing.
- May 2026The email agent
Plugged into Jake's Gmail. Every customer email now arrives with a draft reply waiting.
- June 2026Reading Jake's replies too
A second agent reads what Jake sends, so the CRM stays right even when he answers from his phone on the riverbank.
How it works
- App: Next.js on Vercel, with a Supabase database and a pgvector knowledge base.
- Agents: Claude, with a fast model for triage and a stronger one for drafting, running tool loops through the Vercel AI SDK.
- Background work: 22 Inngest jobs. Some run on a schedule, like checking Gmail every five minutes or sending pre-trip emails each morning. The rest react to events like a paid invoice.
- Integrations: Gmail, Google Calendar, Xero, Mailchimp and Resend.
Forwards: every customer email
Every five minutes, the system checks Jake's inbox. A small, fast model reads each new email and decides if it needs a reply. Newsletters and auto-replies get ignored.
If it does need one, the email agent reads the whole thread, not just the last message. It has 16 tools. It can look up the client, find their past trips, check which guides are free on those dates, search Jake's knowledge base for trip details, and create the enquiry in the CRM. Then it writes a reply in Jake's voice and leaves it as a draft in the same Gmail thread.
It never sends anything. Jake reads it, tweaks it if he wants, and hits send.
Backwards: every reply Jake sends
Jake doesn't always use the draft. Sometimes he replies from his phone, or agrees a change on the call. If the CRM only listened to customers, it would drift out of date.
So a second agent reads Jake's sent mail. When he replies on a thread linked to a booking, it pulls out anything new, like dates, party size, cost or accommodation, and updates the booking. It can't draft or send email at all. Its only job is keeping the record straight.
A CRM that keeps itself current
Every client has one profile: contact details, medical and dietary notes, their trips, and every email the agent has drafted for them. When the agent meets a new enquirer, it creates the client and tags them in Mailchimp as interested in fly fishing or hunting. Nobody types anything into the mailing list any more.
Invoices without the chasing
Deposit and final invoices are created in Xero straight from the booking, with the right line items and GST, ready for Jake to approve. When a client pays, Xero tells the system. A paid deposit confirms the booking, emails the client, and lets the guides know. Nobody has to check who's paid.
Everything else runs on its own
The rest of the admin happens in the background:
- Pre-trip emails go out six, three and one week before each trip, asking for trip info and chasing unsigned declarations.
- Clients nominate their group and sign safety declarations in their own portal.
- Guides see their own trips and availability in theirs.
- Every booking syncs to Google Calendar.
- A review request goes out after each trip, once the final invoice is paid.
Built to be trusted
An agent with access to someone's inbox and customers has to earn it. A few rules made that possible:
- Jake sends every email. The agent only ever drafts.
- Hard limits. It can't confirm a booking, assign a guide, or cancel anyone else's trip.
- A kill switch for each mailbox, if Jake ever wants it off.
- Tested on real history. Prompt changes are run against hundreds of Jake's past email threads, and a separate AI grades the drafts.
- Nothing happens twice. Every step can be retried safely, without a duplicate email, draft or invoice.
- Everything is logged. Every run, tool call and change shows up in one activity feed, tagged by who did it: Jake, a client, the system or an agent.
"Having you to bounce ideas off is amazing and I can't wait to brainstorm more and see where it takes things. I really appreciate all your efforts with this, you have been a dream to work with. You can be proud of that mate."
Jake, Owner Operator, Southern Rivers Fly Fishing