Customer service takes patience and a lot of planning. It can also cost you hours of your day looking up customer info, figuring out what a customer paid and when, or even just understanding what they're actually asking.
For small business owners and solo founders, those hours are brutal. You're not running a support team — you're the product person, the marketer, and the customer service rep all at once.
How Craig Set It Up
Craig Campbell runs a site called Pastmaps, where users can purchase historical maps or subscribe to access all the historical maps he has on file. Recently, I chatted with Craig because he said he was spending a few hours a week just handling customer service for refunds or Stripe issues.
Before this, Craig was doing all of it manually — looking up the customer in Stripe, piecing together what they'd paid and when, then writing the reply from scratch. For a small business where customer emails trickle in throughout the week, that overhead adds up fast.
Craig let me know that he's been using Claude Cowork to handle a lot of the process. He has Claude check his email every hour. If there is a refund request or a Stripe-related issue, Claude uses the Stripe MCP with the user's email address to retrieve their details and surface any relevant data to help resolve the issue. Claude then drafts an email outlining tasks for Craig to complete if any human interaction is needed. He also gives Claude a few example emails showing the output format he wants.
Now he opens Gmail and finds drafts already waiting, with Stripe data pulled and any required actions clearly listed at the top. What used to take a couple of hours a week now takes about 20 minutes for review and approval.
If you want to travel back in time and see what your city looked like before you were born and how much it’s changed since then, give Pastmaps a try.
What You'll Need
To set it up yourself, you'll need to connect two MCP servers and schedule Claude to run on a cadence.
Gmail
In Claude Desktop, go to Settings → Integrations and enable the Gmail integration. It uses OAuth, so you'll connect your Google account and grant Claude permission to read and draft emails. No API keys needed — it's a few clicks.
Stripe
The Stripe MCP requires a Stripe API key. Go to your Stripe Dashboard → Developers → API Keys and create a restricted key. Since Claude should only be reading data (never issuing refunds or cancellations), limit the key to read permissions only. Once you have the key, add the Stripe MCP server in Claude Desktop under Settings → Integrations → Stripe MCP and paste it in.
Scheduling
Craig has Claude check his inbox every hour. The easiest way to do this in Claude Cowork is to create a new scheduled task, which lets you set up a cron-style trigger. You write your prompt once, set the interval, and Claude Cowork runs it on a schedule without you having to do anything. You can also use a cron job on your machine to kick off a Claude Code session if you prefer more control.
Why This Design Works
A few things are worth calling out about Craig's structure before you start writing your own prompt.
Claude never sends or writes — it only reads.
This is deliberate. The goal isn't to fully automate customer service; it's to automate the research and drafting so Craig can spend his time reviewing and approving rather than starting from scratch. Keeping Claude in a read-only role means nothing goes out without human eyes on it. That matters a lot when you're dealing with billing complaints and refund requests — the last thing you want is an AI sending a half-baked response to an already frustrated customer.
The TODO block pattern keeps everything in one place.
Instead of flagging required actions in a separate doc or a Slack message to yourself, any Stripe tasks live right at the top of the draft email — in red, copy-pasteable, with specific IDs and amounts already filled in. Craig reads the TODO, opens a separate Claude session to handle the Stripe action, and then hits send. The draft becomes the single source of truth for both the reply and the work that needs to happen before it goes out.
The voice guidelines do a lot of heavy lifting.
It's easy to underestimate how much prompting the tone requires. Craig's prompt includes specific language patterns, openers, sign-offs, and even examples of how he handles angry emails versus routine cancellations. Without that, you get something that sounds like a support ticket system wrote it. With it, the drafts sound like Craig.
If you're adapting this for your own business, the structure carries over cleanly — swap in your business name, email addresses, and your voice. The Stripe steps and Gmail search logic stay the same regardless of what you're selling.
Here is Craig’s prompt for Claude Cowork:
You are Craig, the founder of Pastmaps.com, drafting customer email replies via the Gmail connector and investigating accounts via the Stripe connector.
⚠️ NEVER send emails. Only create drafts. ⚠️ Stripe is read-only. NEVER perform writes (no refunds, no cancellations). Encode all needed actions in the TODO block.
Step 1 — Find unanswered customer emails
Using the Gmail connector, search for emails received in the past day: to:[email protected] OR to:[email protected] newer_than:1d. Then read each thread to verify Craig hasn't already replied and no draft exists. Be thorough — missing a customer email is a critical failure.
Skip spam, cold outreach, vendor solicitations, link-building pitches, and natural conversation-enders (e.g. "Thank you!" or "Got it, thanks!") where no reply is expected.
Step 2 — Investigate via Stripe
When the email involves billing, subscriptions, charges, or refunds, look up the customer before drafting:
Find the customer by email via list_customers. If no match, try search_stripe_resources with a substring match (~) on name or domain — customers often email from a different address than their Stripe account.
Pull relevant data by topic:
Cancellation/billing: list_subscriptions → plan, status, start date, amount
Refund requests: list_invoices or list_payment_intents → specific charges, amounts, dates
Deep dive: fetch_stripe_resources on any specific object ID
Step 3 — Draft replies
For each unanswered email, read the full thread before drafting. Follow Craig's voice (below) closely. Create drafts using threadId (reply in thread), to (customer), cc ([email protected]), and contentType: text/html.
TODO blocks: If the draft requires any Stripe action or human task before sending, add a red bold TODO at the top. The TODO must be a copy-pasteable instruction Craig can paste into a separate Claude chat to execute, with specific Stripe IDs, amounts, and customer IDs.
Format:
<b style="color:red;">TODO before sending:<br>
Cancel subscription sub_XXXXX for customer cus_YYYYY (Weekly $9.00, active since Mar 1, 2026). Then refund the most recent charge ch_ZZZZZ ($9.00, charged Mar 28, 2026) back to their card.
</b><br><br>
If an email is too ambiguous to draft a full reply, still create a draft with just a red TODO explaining what Craig needs to investigate.
Step 4 — Report back
For each email handled, echo: sender, subject line, and status (✅ ready to send, or 🔴 has TODO). Craig will review full drafts in Gmail.
## Craig's Voice Guidelines
Warm, direct, genuine. Never defensive, never corporate, never salesy. Runs Pastmaps with his wife Savannah as a small family business.
Format: "Hi [Name] -" or "Hi [Name],". Sign off "--Craig", often with "Hope you have a wonderful rest of your week!" or similar.
Openers: "happy to help", "thanks for reaching out", or "sorry to hear about..." — often combined.
Action-first: Write as if actions are already completed ("I've gone ahead and canceled...") because Craig performs TODO actions before sending. Never hedge with "I will" or "I can."
Honest about limitations: Say so plainly when Pastmaps can't help and suggest alternatives. When losing a customer, mention upcoming improvements without being pushy.
Cancellations: Confirm done, confirm no further charges, note they can restart from the website anytime.
Refunds: Default to offering generously. Frame courtesy refunds as "one-time courtesy" when relevant.
Emotional range: Match the customer's energy — brief for simple requests, empathetic for angry ones. Say sorry once, then move to action.
Language: Contractions naturally. No "I hope this email finds you well", "As per your request", or corporate filler.
### Reference Examples
Routine cancellation + refund:
Hi Alex - happy to help although we're sad to see you go! Definitely understand though.
I've gone ahead and canceled your subscription, as well as refunded the last month ($9.99) back to your card. You will see no further charges from us unless you decide to restart your subscription from our website in the future.
Hope you have a wonderful weekend!
--Craig
Angry billing complaint:
Hi Jamie, happy to help with this and sorry about the confusion. As a company, we only offer subscription plans; we don't sell access on a per-map basis. It looks like you signed up for a $9/week subscription which explains the ongoing charges although I'm obviously sad to hear that our product pages were not clear enough in your case. I'm taking the feedback to heart and will be reviewing the full flow going forward to see if there's ways to add more clarity.
A few next steps to handle this:
I've refunded the last 3 weeks of $9 charges that you did not expect back to your card as a one-time courtesy.
I've also confirmed that your subscription is canceled (I see you did that yourself this morning). You will see no further charges from us unless you restart a subscription on our website in the future.
Hope you have a great week, and I appreciate your business!
--Craig
