All projects

Every workflow I've shipped

Invoice Intake & Anomaly Detection

Catches invoice math errors and duplicate payments before they cost money, with zero manual data entry.

n8nGeminiGmail APIGoogle SheetsSlack
Problem

Meridian Advisory processes vendor invoices by hand: someone opens each emailed PDF, retypes the totals into a spreadsheet, and eyeballs the numbers. Two failure modes recur and both cost real money when missed, line items that don't add up to the stated total, and the same invoice getting paid twice because it was re-sent.

Key Features
  • Watches a Gmail inbox for PDF invoices, no manual upload step
  • Gemini extracts invoice number, vendor, totals, and dates as structured fields
  • Recalculates the line item sum independently and flags any mismatch down to the exact dollar difference
  • Duplicate invoice numbers are caught and filed to a separate audit tab, never double logged
  • Only a genuine anomaly triggers a Slack alert, valid invoices log silently so the channel stays useful
  • Every invoice lands in one sortable Google Sheet with status and a processed timestamp
Outcome

This replaced a manual review step that depended on someone catching a bad total by eye. Every invoice now gets checked the same way, every time, and the only thing that reaches a human is something that actually needs a decision.

Read case study →

AI Lead Scoring and Routing

Scores every inbound lead on intent and fit, then routes it to the right regional team with an SLA attached, automatically.

n8nGeminiGoogle SheetsGmailSlack
Problem

A form fill only tells you what a prospect typed into structured fields. It doesn't tell you whether they're ready to buy or just browsing, and sorting that out by hand for every submission doesn't scale, especially once duplicate and low-quality submissions are mixed in with real ones.

Key Features
  • Nine-field intake form with browser-level required-field and email format validation
  • Sanitizes input and blocks disposable or suspicious email domains before anything reaches the CRM
  • Duplicate detection against the CRM sheet stops repeat submissions from creating a second record or a second AI call
  • Gemini reads the free-text message for intent and urgency, combined with deterministic scoring rules
  • Three-tier routing, Hot gets a 1-hour SLA, Warm gets 24 hours, Cold is logged with no notification
  • Routes to the right regional Slack channel automatically, and sends a branded confirmation email to the lead
Outcome

Every lead now gets the same consistent, structured read, no submission waits on someone being free to triage it by hand, and the team's attention goes to the leads actually worth an hour-long SLA instead of being split evenly across everything that comes in.

Read case study →

Meridian Advisory Scheduling Agent

An AI receptionist that books, reschedules, and cancels consultations over Telegram, with the database, not the model, deciding what's actually allowed to happen.

n8nMCPGeminiGoogle CalendarSupabaseTelegram
Problem

An LLM agent is good at understanding what a customer wants. It's a bad place to put the actual source of truth for anything transactional, since a model can misremember, get talked into contradicting itself, or simply be wrong with total confidence. Scheduling needs something underneath it that can't be talked out of enforcing a rule.

Key Features
  • Books, reschedules, cancels, and lists consultations through natural conversation on Telegram
  • Google Calendar creates the customer-facing event and sends real calendar invites
  • Supabase Postgres is the final authority, with database-level constraints that make double booking structurally impossible, not just unlikely
  • A customer's own retried request is recognized and confirmed silently instead of being rejected as a false conflict
  • Duplicated Telegram message deliveries are dropped before they ever reach the agent
  • If the database rejects a booking after the calendar event already exists, the calendar event is automatically deleted so the two systems never drift out of sync
Outcome

The result is a receptionist that never double-books, never leaves the calendar and the database disagreeing about what happened, and treats its own model's confidence as advisory, not authoritative. That's the pattern I use across client scheduling work, this is the clearest, smallest version of it I could build end to end.

Read case study →

Stripe Docs Support Bot

A Telegram bot that answers Stripe integration questions by retrieving Stripe's own docs, and says so plainly when it doesn't know.

n8nGeminiSupabaseTelegram
Problem

An LLM's training data on a fast-moving API like Stripe's goes stale, and a model that answers integration questions from memory alone will eventually give a confident, wrong answer. The harder problem isn't hooking up retrieval, it's making sure retrieval actually works against real documentation formatting, and making the agent admit when what it retrieved doesn't actually answer the question.

Key Features
  • Answers developer questions on Stripe Payments, Checkout, Billing, Webhooks, Disputes, and Errors, citing the retrieved documentation
  • Refuses to answer from general knowledge when the retrieved context doesn't actually address the question
  • Persistent per-user conversation memory on Telegram, isolated by chat ID, so follow-up questions carry context
  • Custom ingestion step flattens Stripe's pipe-delimited tables into natural language before chunking and embedding
  • Logs every conversation turn to Google Sheets for review
Outcome

The bot answers from Stripe's actual current documentation instead of the model's training data, and correctly declines questions outside its 26-page corpus rather than guessing. That refusal behavior was the harder engineering problem, and it's the part of this build I'd point to first.

Read case study →