Skip to main content
Back to blog
๐Ÿ“Š Business 8 min readApril 11, 2026

The iOS Shortcut Stack I Use for Solo Business Ops (Shortcuts + Claude + Stripe)

A privacy-conscious automation setup built from Apple Shortcuts, a local Claude bridge, and a few Stripe webhooks - without a heavy automation platform.

I got tired of Zapier's $30/month tax and the nagging feeling that my customer data was sitting in someone else's database, getting shuffled through their API pools. So I built my whole business stack on Apple Shortcuts instead, connecting Stripe, Claude, email, and my notes directly from my iPhone. No Zapier. No Make. No third-party data brokers.

Here's what I learned: for a solo founder on macOS/iOS, Shortcuts + Claude's API + Stripe webhooks is genuinely better than the no-code automation tools everyone recommends. It's faster, it's private, and it costs nothing after your first coffee break.

Why Shortcuts Over Zapier (for Privacy-First Operators)

The pitch for Zapier is seductive: "just pick your apps, build flows, done." But the catch is brutal:

  • Your data passes through their infrastructure. Every Stripe webhook, every customer email, every JSON payload touches Zapier's servers before reaching your next step. They say it's encrypted, but it's still not local.
  • $30โ€“$100/month baseline. That's $360โ€“$1200 a year for automation that should be free when you own the API credentials.
  • Lock-in. If you want to migrate, you export a Zapier JSON file and rebuild everything in Make or n8n. You own nothing.
  • Latency. Zapier has retry logic and queuing. A Stripe webhook might take seconds or minutes to trigger your action.

Apple Shortcuts, by contrast, runs on your device, or on your Mac via Always-On automation. Your data stays local until you explicitly send it somewhere. There's no queue, no middleman, no monthly invoice.

The catch? Shortcuts has less GUI magic. You'll write a few cURL equivalents (no code, just visual blocks). You'll parse JSON by hand. You'll wrangle headers. But for an experienced operator, that's not a bug. It's the feature. You have total control.

The Stack: What Actually Runs

My automation stack looks like this:

  1. Stripe webhooks โ†’ trigger a Mac-based Always-On Shortcut (or URL Scheme from Shortcuts server)
  2. Claude API (via HTTP GET Contents of URL) parses, summarizes, or enriches data
  3. macOS/iOS Shortcuts with branching logic handles the rest (email, notes, Slack, reminders)
  4. iCloud Notes and Mail act as the database and output layer

The beauty: I own every step. Stripe talks directly to a webhook I control. Claude only sees what I ask it to see. My data never touches Zapier.


Shortcut #1: Triage Incoming Stripe Customer Emails (Webhook Trigger)

The job: When a customer emails about a payment issue, a Stripe webhook fires โ†’ Shortcut extracts the customer ID โ†’ Claude reads their recent invoice history โ†’ a summary lands in my Inbox.

Trigger: Stripe webhook (customer.subscription.updated event) โ†’ HTTP POST to a webhook receiver (ngrok, Hookdeck, or a lightweight Node server)

Why this is better than Zapier: The webhook arrives instantly, no queue. Claude runs client-side logic (not Zapier's LLM service). You pay nothing.

Recipe:

  1. Receive the webhook payload

Your webhook endpoint gets this from Stripe:

``json { "id": "evt_1234", "type": "customer.subscription.updated", "data": { "object": { "customer": "cus_ABC123", "status": "active", "current_period_end": 1234567890 } } } ``

  1. Shortcut: Parse the webhook and call Claude

```

  1. Receive webhook (Ask for [customer_id], [event_type])
  2. Get Contents of URL:

https://api.anthropic.com/v1/messages Headers: x-api-key: YOUR_ANTHROPIC_API_KEY content-type: application/json Method: POST Body: { "model": "claude-3-5-sonnet-20241022", "max_tokens": 500, "messages": [ { "role": "user", "content": "Customer ID: cus_ABC123 just had subscription updated. Based on what you know, summarize any red flags: payment failures, usage spikes, churn risk." } ] }

  1. Parse the response (Get dictionary value โ†’ "content" โ†’ extract the text block)
  2. Send me a Notification with the summary
  3. Append to iCloud Notes (Customers โ†’ [date] โ†’ summary)

```

  1. Set up the webhook receiver

If you're running this on a Mac with Always-On automations (iOS 18+), use a lightweight receiver. Otherwise, point Stripe to Pushcut or Webhook.cool, which can relay to your Shortcut via URL Scheme.

Stripe webhook setup: ``bash curl -X POST https://api.stripe.com/v1/webhook_endpoints \ -u sk_live_YOUR_KEY: \ -d url=https://your-webhook-url.com/stripe \ -d "enabled_events[]=customer.subscription.updated" ``

Why it wins:

  • No Zapier middleman seeing your customer IDs.
  • Claude runs inline; you control the prompt, the tokens, the model.
  • Your webhook URL is yours; Stripe doesn't store the data, just delivers it.

Shortcut #2: Daily Revenue Summary (Time-Based Trigger)

The job: Every morning at 8 AM, fetch yesterday's Stripe transactions โ†’ Claude summarizes MoM growth โ†’ I see it in a Notification before opening my email.

Trigger: Daily at 8:00 AM (Personal Automation on iOS, or Always-On on macOS)

Recipe:

  1. Fetch Stripe charges from the last 24 hours

`` Get Contents of URL: https://api.stripe.com/v1/charges?created[gte]=YESTERDAY_EPOCH&limit=100 Headers: Authorization: Basic <base64(sk_live_YOUR_KEY:)> Method: GET ``

  1. Parse and aggregate

``` Get dictionary value โ†’ data (array of charges) Loop through each charge:

  • Add amount (charge.amount / 100 to convert cents)
  • Add customer email

Sum total ```

  1. Ask Claude to summarize

`` Get Contents of URL: https://api.anthropic.com/v1/messages Method: POST Body: { "model": "claude-3-5-sonnet-20241022", "max_tokens": 300, "messages": [ { "role": "user", "content": "Here are yesterday's Stripe charges: [paste JSON]. Calculate total revenue, customer count, and average transaction. Give me a one-liner on trend vs last week." } ] } ``

  1. Deliver the result

`` Send Notification: "[date] Revenue: [summary from Claude]" ``

Why it wins:

  • Runs every morning without Zapier running.
  • Stripe API keys stay on your device; you never type them into a Zapier interface.
  • Claude processes locally (you control the model and prompt tuning).

Shortcut #3: Customer Churn Alert (Event-Based Email Trigger)

The job: When a customer cancels their subscription, I get an instant notification and a Slack message with their churn risk profile.

Trigger: Email arrives from Stripe โ†’ Personal Automation triggers on sender (Stripe's email) or webhook

Recipe:

  1. Set up email automation

In the Shortcuts app โ†’ Automations โ†’ Email โ†’ "If emails arrive from [email protected]"

  1. Extract the subscription ID from the email

`` Get the email body (Mail action โ†’ Last Message) Text โ†’ Get text between "subscription_" and space Store as [sub_id] ``

  1. Look up the customer via Stripe

`` Get Contents of URL: https://api.stripe.com/v1/subscriptions/[sub_id] Headers: Authorization: Basic <base64(sk_live_YOUR_KEY:)> Method: GET ``

  1. Ask Claude for churn context

`` Get Contents of URL: https://api.anthropic.com/v1/messages Method: POST Body: { "model": "claude-3-5-sonnet-20241022", "max_tokens": 250, "messages": [ { "role": "user", "content": "Customer subscription ID [sub_id] just canceled. Tenure: 6 months, LTV: $400. Should I reach out? If yes, suggest a winback message in one sentence." } ] } ``

  1. Post to Slack

`` Get Contents of URL: https://hooks.slack.com/services/YOUR/WEBHOOK/URL Method: POST Body: { "text": "Churn alert: [customer email]. Claude says: [response]" } ``

Why it wins:

  • Instant (no Zapier queue).
  • Data never leaves your device or Slack. No middleman logging it.
  • You can iterate the Claude prompt (e.g., "suggest a discount" or "analyze LTV") without rebuilding the Shortcut.

Shortcut #4: Lead Scoring & CRM Sync (Webhook + Claude)

The job: When a new customer signs up (Stripe checkout.session.completed), Claude rates them on potential lifetime value โ†’ the profile lands in iCloud Notes.

Trigger: Stripe webhook (checkout.session.completed)

Recipe:

  1. Webhook delivers signup data

``json { "type": "checkout.session.completed", "data": { "object": { "customer_email": "[email protected]", "customer_details": { "address": { "country": "US" }, "name": "Alice Chen" }, "amount_total": 4999, "metadata": { "plan": "Pro" } } } } ``

  1. Shortcut: Score with Claude

`` Get Contents of URL: https://api.anthropic.com/v1/messages Method: POST Body: { "model": "claude-3-5-sonnet-20241022", "max_tokens": 400, "messages": [ { "role": "user", "content": "New customer: [email protected], plan: Pro ($49.99), country: US. Score their LTV potential on 1โ€“10. Flag if they look like a high-value SaaS buyer. Suggest an onboarding email angle." } ] } ``

  1. Parse and store

`` Get dictionary value โ†’ content[0].text Append to iCloud Notes: Folder: "CRM/High-Value Leads" Date: [today] Content: "[email protected] | Score: [Claude output]" ``

  1. Optional: Send them a personalized email

`` Send Email: To: [email protected] Body: "Welcome to Pro! Based on your signup, here's a personalized onboarding plan: [Claude suggestion]" ``

Why it wins:

  • Churn models and LTV scoring used to cost $500/month add-ons in Salesforce or HubSpot.
  • Now it's free. Claude runs it. Webhook is instant.
  • Your raw customer data never touches a third-party CRM (it lives in iCloud Notes, which you control).

Shortcut #5: Recurring Revenue Forecast (Time-Based, Async)

The job: Every Sunday, calculate projected MRR for next month based on active subscriptions and churn trends.

Trigger: Weekly on Sundays at 10:00 AM

Recipe:

  1. Fetch all active subscriptions

`` Get Contents of URL: https://api.stripe.com/v1/subscriptions?status=active&limit=100 Headers: Authorization: Basic <base64(sk_live_YOUR_KEY:)> Method: GET ``

  1. Loop and aggregate

``` For each subscription in the response:

  • Get amount (sub.items.data[0].price.unit_amount)
  • Get billing cycle (sub.billing_cycle_anchor)
  • Add to running total

Calculate average revenue per subscription (ARPS) ```

  1. Ask Claude for a forecast

`` Get Contents of URL: https://api.anthropic.com/v1/messages Method: POST Body: { "model": "claude-3-5-sonnet-20241022", "max_tokens": 300, "messages": [ { "role": "user", "content": "Current MRR: $12,000. Active subs: 48. ARPS: $250. Churn rate: 5%/month. Growth rate: 8%/month. Project MRR for 90 days out. Be conservative." } ] } ``

  1. Store and notify

`` Append to iCloud Notes (Finance โ†’ Forecasts) Send Notification: "Weekly forecast: [Claude prediction]" ``

Why it wins:

  • No spreadsheet, no manual math.
  • Stripe data is live; your forecast is always current.
  • You own the forecast logic (no black-box SaaS model).

Shortcut #6: Invoice-to-Notes OCR + Summary (File-Based Automation)

The job: When a vendor invoice lands in Mail, extract the amounts โ†’ OCR the PDF โ†’ Claude summarizes it โ†’ it goes to iCloud Notes for bookkeeping.

Trigger: Email arrives with PDF attachment

Recipe:

  1. Capture the email and attachment

`` Automation: New Email If sender contains "invoice" or attachment is PDF Ask for attachment ``

  1. Save the PDF locally

`` Get attachment (Mail action โ†’ Attachment) Save to iCloud Drive (Folder: "Invoices/Incoming") ``

  1. OCR with Claude Vision (if available in your Claude plan)

`` Get Contents of URL: https://api.anthropic.com/v1/messages Method: POST Headers: x-api-key: YOUR_ANTHROPIC_API_KEY content-type: application/json Body: { "model": "claude-3-5-sonnet-20241022", "max_tokens": 500, "messages": [ { "role": "user", "content": [ { "type": "text", "text": "Extract from this invoice: vendor name, invoice number, total amount, due date, line items." }, { "type": "image", "source": { "type": "base64", "media_type": "application/pdf", "data": "[base64-encoded PDF]" } } ] } ] } ``

  1. Parse and file

`` Get dictionary value โ†’ content[0].text Append to iCloud Notes: Folder: "Bookkeeping/Invoices" Format: "Vendor | Amount | Due Date | [Claude summary]" ``

Why it wins:

  • No Zapier PDF parsing action (it's clunky and slow).
  • Claude Vision sees the invoice structure and context, not just OCR'd text.
  • Your invoices stay in iCloud, not in a Zapier audit log.

Shortcut #7: Slack Sync for Team (Webhook Relay)

The job: Important Stripe and business events (high-value subscriptions, churn, feature requests from customers) โ†’ Slack notifications, without Zapier touching the data.

Trigger: Various (email, webhook, time-based)

Recipe:

  1. Set up a private Slack incoming webhook

In Slack admin โ†’ Apps โ†’ Incoming Webhooks โ†’ Create You get a URL like: https://hooks.slack.com/services/YOUR/UNIQUE/TOKEN

  1. Shortcut: Post to Slack with formatted blocks

`` Get Contents of URL: https://hooks.slack.com/services/YOUR/WEBHOOK/URL Method: POST Headers: content-type: application/json Body: { "blocks": [ { "type": "section", "text": { "type": "mrkdwn", "text": "*Churn Alert*\nCustomer: [email protected]\nLTV: $500\nReason: Feature request for X" } }, { "type": "section", "fields": [ { "type": "mrkdwn", "text": "*Next Step:*\nOutreach email drafted by Claude" } ] } ] } ``

  1. Trigger from other Shortcuts

Whenever a critical event fires (Stripe webhook, customer email), call this Slack-posting Shortcut as a sub-action.

Why it wins:

  • Slack keeps the data, not Zapier.
  • You control the message format (no Zapier template limits).
  • Instant delivery, no queue.

Shortcut #8: Personal Expense Reporting (Async, Time-Based)

The job: Monthly on the 1st, gather all personal expenses from email receipts โ†’ Claude categorizes them โ†’ summary goes to a Notes folder for tax season.

Trigger: Monthly on the 1st at 9:00 AM

Recipe:

  1. Search Mail for receipt emails from the last 30 days

`` Automation: Time-based (1st of month) Search Mail: From: (stripe.com OR invoice OR receipt) Date range: Last 30 days Get all matching emails ``

  1. Extract amounts and vendors

`` For each email: Extract text between $ and space Extract sender domain Append to list: ["$amount", "vendor"] ``

  1. Ask Claude to categorize

`` Get Contents of URL: https://api.anthropic.com/v1/messages Method: POST Body: { "model": "claude-3-5-sonnet-20241022", "max_tokens": 500, "messages": [ { "role": "user", "content": "Categorize these expenses for business tax purposes: [list]. Show: Category, Amount, Deductible? (Yes/No). Summary total." } ] } ``

  1. File for tax records

`` Append to iCloud Notes: Folder: "Tax/Expenses" Title: "January 2026" Content: [Claude categorized list] Send Notification: "Monthly expense report ready" ``

Why it wins:

  • Recurring, hands-off. No Zapier monthly fee for the privilege of doing this.
  • Claude is smarter about tax categories than a Zapier rule.
  • Your receipt data never leaves iCloud.

How to Deploy: The Nuts and Bolts

1. Get Your API Keys

2. Set Up Shortcuts

  • Open the Shortcuts app on iOS or macOS.
  • Create a new Shortcut (+ button).
  • Start with a trigger: Time, Email, Webhook, or Manual.

3. Build the HTTP action

Use Get Contents of URL:

Action: Get Contents of URL
URL: https://api.example.com/v1/endpoint
Method: POST (or GET)
Headers:
  Authorization: Basic [base64(key:)]
  Content-Type: application/json
Request body: [your JSON]

To build a Basic Auth header:

echo -n "sk_live_ABC123:" | base64
# Output: c2tfbGl2ZV9BQkMxMjM6

Then in the header: Authorization: Basic c2tfbGl2ZV9BQkMxMjM6

4. Parse the response

Use Get dictionary value to extract fields from JSON:

Action: Get dictionary value
From: [result of Get Contents of URL]
Key: "data.object.amount"

5. Test locally first

Use a tool like [Webhook.cool](https://webhook.cool) or [ngrok](https://ngrok.com) to capture webhook payloads and debug locally before going live.

6. Secure your keys

  • Store keys in the Keychain (Shortcuts action: Ask for password or Get keychain item).
  • Never paste them into text fields where they might be logged.
  • Use environment variables on your Mac (Always-On automation supports these).

7. Monitor and iterate

Use iCloud Notes or a simple HTML dashboard to log what your Shortcuts are doing. Check once a week: Did any calls fail? Did Claude give bad output?


Quick Reference: API Calls You'll Need

Stripe: Fetch recent charges

curl -u sk_live_YOUR_KEY: \
  https://api.stripe.com/v1/charges?created[gte]=1700000000&limit=100

Stripe: Get a subscription

curl -u sk_live_YOUR_KEY: \
  https://api.stripe.com/v1/subscriptions/sub_ABC123

Claude: Send a message

curl https://api.anthropic.com/v1/messages \
  -H "x-api-key: sk-ant-YOUR_KEY" \
  -H "content-type: application/json" \
  -d '{
    "model": "claude-3-5-sonnet-20241022",
    "max_tokens": 500,
    "messages": [
      {
        "role": "user",
        "content": "What is 2 + 2?"
      }
    ]
  }'

Slack: Post a message

curl https://hooks.slack.com/services/YOUR/WEBHOOK/URL \
  -X POST \
  -H content-type:application/json \
  -d '{
    "text": "Hello from a Shortcut!"
  }'

Why This Beats Zapier (and Make, and n8n)

FeatureShortcuts + ClaudeZapier
Monthly cost$0$30โ€“$300
Data residencyLocal to your deviceZapier's servers
LatencyInstant (no queue)Seconds to minutes (queue)
Model controlYou pick Claude version, tokens, tempZapier's black box
PrivacyYour keys, your dataZapier has access
Iteration speedEdit the Shortcut, test immediatelyRebuild the Zap
AI qualityClaude's latest modelsZapier's own or third-party APIs

The trade-off: you need to understand APIs and JSON. You'll debug HTTP errors. But for an experienced founder on Apple devices, that's not a bug. That's control.


Next Steps

  1. Pick one Shortcut from above that saves you the most time (e.g., revenue summary or churn alert). Start there.
  2. Get your API keys from Stripe and Anthropic. Keep them secret.
  3. Build the Shortcut using the recipes above. Test with Webhook.cool if you need a webhook URL to start.
  4. Iterate the Claude prompt. The beauty of owning your prompt is you can fine-tune it every morning without Zapier's limitations.
  5. Add a second Shortcut once the first is stable. Each one takes 10โ€“30 minutes to build.

If you run a business on Apple devices and care about privacy, you now have zero excuse to pay Zapier. Your stack is simpler, faster, and yours.


Sources

Get the free quick-start pack

Subscribe and get the Quick-Start Checklist Pack plus a 10% welcome code. Useful emails only, unsubscribe anytime.