Solutions Showcase: part 2 of 4

The complete text of the site in 4 parts. Parts:

Part 1 has the contents list of every section and case study.

Case studies in full

AI Post Rewrites and CTA Rotation for a Content Team

Two n8n workflows that rewrite a social post when a reviewer ticks Redo, and add the best call-to-action to each thread from a rotating library.

Section: n8n Automations

Purpose

A content team keeps its social post drafts in Airtable, with a version for X, LinkedIn and Threads. A reviewer checks each draft there. These two n8n workflows handle two jobs inside that review loop: rewriting a draft when the reviewer asks for changes, and adding the right call-to-action (CTA) to each thread.

The Solution

Both workflows read and write the same Airtable base, and both send their writing tasks to Claude through one shared sub-workflow.

Workflow 1: Redo (rewrites a draft from reviewer feedback)

What the prompt enforces

Workflow 2: CTA Auto-Insert (picks the call-to-action for each thread)

Image: CTA Auto-Insert in n8n: a schedule trigger, an Airtable search, a read of the CTA library, a code step that ranks the CTAs, a prompt step, the Claude pick through a shared sub-workflow, a code step that builds the thread, and an Airtable update that links the CTA, followed by two branches that raise the Times Used counters.

Good to Know

Page · Plain text

AI-Powered E-Commerce Product Price Monitoring

A scheduled workflow that tracks product prices, logs history to Google Sheets, and alerts you only on meaningful price drops.

Section: n8n Automations, AI Agents

1. The Problem: Manual Price Checking Wastes Time

Before automation, tracking product prices across online stores was slow, repetitive, and error-prone:

Users had to manually

Often missed opportunities

Impact per user

Core challenge: People want to buy at the right time but don’t want to constantly monitor prices themselves.

2. Results After Automation

Once the automation was implemented

Time & Effort Savings

Before

45 minutes/day × 30 days ≈ 22.5 hours/month

After

Monthly impact

Accuracy & Opportunity Gains

3. The Solution: AI-Powered Price Monitoring System

This automation acts as a virtual price tracker and analyst:

4. How the System Works

Phase 1: Scheduled Price Collection

Workflow runs automatically (daily, or custom schedule)

Visits product pages and extracts

Phase 2: Price Comparison & History Logging

Phase 3: AI-Driven Analysis

AI evaluates

Phase 4: Smart Notifications

Sends alerts only when

5. Business Value

6. How You Can Duplicate This System

Open the JSON workflow

Click the attached file

E-Commerce Price Monitoring Automation.json

Click New → Workflow

Name it temporarily; rename later

Import / Paste the JSON

AI Analysis Node: Add API credentials (OpenAI / Gemini)

Verify end-to-end

7. Final Outcome

With this automation

This system turns slow, error-prone manual price tracking into a fast, reliable, and fully automated workflow.

Page · Plain text

AI-Powered Social Media Content Creation

An automation that generates LinkedIn captions and images, sends them for approval, and publishes only approved posts.

Section: n8n Automations, AI Agents

1. The Problem: Social Media Management Is Inconsistent

Before automation, creating and publishing social media content required juggling multiple tools and manual steps:

Impact per team

Core challenge: Teams needed a single system to reliably create, review, approve, and publish content at scale, without operational chaos.

2. Results After Automation

Once the automation was implemented

Time & Effort Savings

Before

3 hours/day × 20 workdays ≈ 60 hours/month

After

Monthly impact

Accuracy & Consistency Gains

3. The Solution: AI-Powered Social Media Automation

This automation acts as a virtual social media manager:

4. How the System Works

Phase 1: AI Caption Generation

Triggered automatically when a new row is added to Google Sheets

AI generates captions based on

Phase 2: Image & Post Creation

Caption is used to generate an AI-powered post image

Image uploaded to Google Drive

Google Sheets logs

Image URL

Phase 3: Approval & Publishing

Google Sheets is updated with

5. Business Value

6. How You Can Duplicate This System

Open the JSON workflow

Click the attached file

Social Media Automation Workflow.json

Rename to: Social Media Content Automation

Verify end-to-end

Toggle to Active

Content creation, approval, and publishing now run automatically with minimal manual input

7. Final Outcome

With this automation

This system turns manual, error-prone social media management into a predictable, auditable, and fully automated workflow.

Page · Plain text

ClickUp Structure: Boots & Bags (Ecommerce Dropshipping)

Detailed ClickUp workspace structure for an ecommerce dropshipping store’s operations.

Section: ClickUp Setups

Main Folder: Boots & Bags E-Commerce Operations

Fulfillment

Lists

Templates

Customer Service

Lists

Templates

Collection and Product Pages

Lists

Templates

Marketing

Lists

Website and Branding

Website Health Checks

Routine audits to ensure optimal functionality and performance of the website.

Custom Fields

Automations

Branding Consistency Reviews

Regular reviews to ensure all marketing materials and online content adhere to brand guidelines.

Custom Fields

Automations

User Experience Optimization

Ongoing optimization tasks aimed at improving the overall user experience on the website.

Custom Fields

Automations

Page · Plain text

AI-Powered Whatsapp message Assistant

An AI assistant inside WhatsApp that understands text, voice and images and answers from your business knowledge, 24/7.

Section: n8n Automations, AI Agents, AI Agents for WhatsApp

1. The Problem: WhatsApp Customer Support Didn’t Scale

Before this automation, customer support over WhatsApp was fully manual and increasingly difficult to manage:

Staff had to reply to every WhatsApp message manually

Repetitive questions about

For a small business receiving 80–120 WhatsApp messages per day, this meant:

Core challenge

WhatsApp was the main customer channel, but human-only support could not keep up without increasing headcount.

2. Results After Automation

Once the WhatsApp AI Business Assistant was deployed:

Time & Workload Impact

Before automation

After automation

Net savings

This allowed the business to scale WhatsApp support without hiring additional staff.

3. The Solution: An AI Assistant Inside WhatsApp

The system acts as a virtual support agent that lives directly inside WhatsApp:

Customers never feel like they’re talking to a bot, just fast, helpful support.

4. How the System Works

All of this happens automatically in seconds.

5. Business Value

6. Reliability & Safety

This ensures trust, safety, and accuracy at scale.

7. How to Replicate This System

Built using WhatsApp Cloud API + n8n + OpenAI + Supabase Vector Store.

Set Up WhatsApp Cloud API

Configure

Ensure it can

Create WhatsApp Webhook in n8n

Paste this URL into

Meta → WhatsApp → Webhooks configuration

This connects WhatsApp messages to the automation.

Import the JSON file

AI-Powered WhatsApp Assistant.json

Connect AI & Data Services

Configure the following nodes

Enable

Supabase Vector Store

Add Supabase project URL & API key

Confirm vector table contains

This enables accurate AI responses (RAG).

Configure Message Routing

Open the Switch node

Verify routing rules

Text → AI Agent

Voice → Transcription → AI Agent

Image → Image analysis → AI Agent

This keeps processing efficient and cost-effective.

Test the Flow

Send test messages on WhatsApp

Verify

Enable the Workflow

Toggle the workflow to Active

The assistant is now live

Customers can now chat with your AI assistant 24/7 on WhatsApp.

8. Final Outcome

With the WhatsApp AI Business Assistant in production:

The system transformed WhatsApp from a manual support burden into an always-on AI-powered customer assistant.

Page · Plain text

Power BI: Turning Five Booking Systems Into One Revenue Engine

A governed Power BI model and two dashboards that replaced three days of manual owner-statement assembly with an automated daily refresh for a short-term rental portfolio.

Section: Power BI

Power BI Case Study

BnB Heaven: short-term rental & boutique B&B management · 6-week engagement

BnB Heaven manages a portfolio of short-term rentals and boutique B&Bs across the UK. Bookings arrived from Airbnb, Booking.com, Vrbo and their own direct site; cleaning and turnovers lived in the ops tool; finance sat in the accounting system. Owner statements and the monthly board pack took three days to assemble by hand. This case study shows how we consolidated everything into one governed Power BI model with two dashboards, cutting reporting effort by roughly 90% and giving the team occupancy, rate and channel-profitability numbers they finally trust.

The Challenge

Before the project, 'how are we doing?' was a surprisingly hard question to answer. Three problems came up in every conversation with the team.

The Approach

Rather than bolt a chart onto each platform, we built one properly modelled layer underneath a small number of focused dashboards. Four phases over six weeks:

The Solution

Executive overview

The board-level view answers leadership’s core questions on one screen: where revenue comes from, how occupancy and rate are trending, which properties and channels pull their weight, and whether the year is on target.

Image: Revenue & Occupancy: the executive overview page, live in Power BI Desktop, with KPIs, revenue trend, channel mix, property and location breakdowns and target attainment.

Operations & guests

The operations view is a daily working screen for the wider team: booking volume against occupancy, manager contribution, the direct-site booking funnel and guest satisfaction by location.

Image: Operations & Guest Experience: bookings vs occupancy, manager revenue, booking funnel and 5-star reviews by location.

Under the Hood

LayerWhat We BuiltTools
SourcesAirbnb, Booking.com, Vrbo, direct site, PMS / channel manager, accountingREST / API / file connectors
Ingest & cleanDedupe, key standardisation, fee / refund / cancellation handlingPower Query (M)
ModelStar schema, shared date table, reusable measuresPower BI model + DAX
GovernanceRow-level security by owner / manager, documented definitionsRLS roles
DeliveryTwo role-based dashboards, automated daily refreshPower BI Service + gateway

The Results

MeasureBeforeAfter
Owner statements & board pack~3 days, manualAutomatic, ready by 06:00
Data freshness~3 weeks oldRefreshed daily
Channel profit (net of fees)InvisibleLive, per channel
Sources reconciledManually, error-proneReconciled to accounts automatically

With channel profitability visible net of platform fees, BnB Heaven leaned into direct bookings and trimmed commission-heavy inventory, finishing the year 6% ahead of target.

Page · Plain text

Telegram Thread Builder: From Dropped Screenshots to a Reviewed X Thread

An n8n workflow that turns a source text and screenshots dropped in a Telegram chat into a ready-to-review X thread, with automatic image blurring, AI writing and a card created in Airtable.

Section: n8n Automations

Purpose

A content team collects ideas in a Telegram group chat: a piece of source text, plus screenshots of results. This workflow lets them turn that material into an X thread, or a single post, without leaving Telegram. The finished draft lands in Airtable as a card for review.

The Solution

The chat works like a conversation. A person opens a session, drops the material, answers a few short questions, and the workflow builds the thread. Every message in the chat is saved in Airtable against the session, so nothing is lost between steps.

Step 1: Open a session

Step 2: Answer the setup questions

Step 3: Prepare and blur the images

Step 4: Write the thread

Step 5: Clean up, add CTAs and deliver

Image: The Telegram thread session workflow in n8n: messages come in on the left and are routed by what they mean (start, image, note, cancel, done, ask, single post). The long middle row builds the thread, from blurring the images to the Claude writer, the Airtable card and the Telegram summary. The rows below handle the setup questions with the 10-minute timer, and single-post sessions.

Single Posts

The same chat also handles posts that are not threads. After “Go”, the bot asks the shorter set of questions. The workflow then merges the text, captions, first image and chosen CTA into one request and hands it to the team’s existing intake workflow, so single posts use the same writer, blur and card steps as everything else.

Built-in Safeguards

Good to Know

Page · Plain text

AI-Powered 24/7 Voice Support Agent for eCommerce Stores

A 24/7 AI voice agent that answers store calls using your product and policy data, escalating only complex calls to humans.

Section: n8n Automations, AI Agents

1. The Problem: Support Calls Don’t Scale

Before automation, customer support teams manually handled calls:

Impact per team

Core challenge: Teams needed a 24/7 system to handle most customer queries automatically, using the store’s own data as a trusted knowledge base.

2. Results After Automation

Once the AI voice agent was implemented

Time & Effort Savings

Before

After

Monthly impact

Accuracy & Consistency Gains

3. The Solution: AI-Powered Voice Agent

This system acts as a virtual support agent, capable of handling most customer queries autonomously:

4. How the System Works

Phase 1: Knowledge Base & Store Data

Phase 2: Voice Agent Flow

Incoming Call

Intent & Query Understanding

Knowledge Base Lookup

Searches store data for relevant answers

Voice Response Generation

Multi-Turn Conversation

Escalation to Human (Optional)

5. Business Value

6. Expected Impact

Time Savings

Error Reduction

Call Handling Speed

Knowledge Utilization

7. How You Can Duplicate This System

Built using VAPI + n8n + Slack + Google Sheets.

Create the VAPI Call Agent

Ensure it can

Answer FAQs

Handle product & policy questions

Add Webhook to VAPI

Import JSON

ShopTalk AI – Call Summary & Lead Capture (1).json

Test the Flow

Verify

Enable the Workflow

8. Final Outcome

With this automation

This system turns manual, error-prone customer support into a fast, reliable, and fully automated 24/7 voice operation.

Page · Plain text

Monday.com Setup: Veterinary Specialist Partners

Monday.com board setup built for Veterinary Specialist Partners’ operations.

Section: Monday.com Setups

Introduction

Veterinary Specialist Partners (VSP) is a specialized veterinary hospital network with facilities in Louisville and Evansville, known for its expert handling of complex medical conditions in pets. Before automating their operations, VSP managed appointments, patient records, and inter-departmental communications manually, which often led to inefficiencies and potential delays in patient care.

To enhance operational efficiency and patient service delivery, VSP partnered with our team to transition from a fully manual system to an automated solution using monday.com, aiming to streamline processes from appointment booking to patient follow-ups and referrals management.

Background

The hospital faced significant operational challenges:

Objectives

The main objectives for implementing monday.com were to:

Solutions Implemented

Monday.com Integration and Automation

Automated Appointment System

Integration with External Scheduling Tools

Patient Records Management

Task Automation for Follow-Ups and Referrals

Outcomes and Results

Improved Operational Efficiency

Enhanced Communication

Technical Highlights

Future Steps and Sustainability

Conclusion

The implementation of monday.com revolutionized VSP’s operations, enabling them to deliver exceptional care with greater efficiency and precision. This case study demonstrates the transformative impact of customized automation solutions in complex healthcare settings, proving monday.com’s capability to handle intricate workflows and extensive data management.

Page · Plain text

AI-Powered Customer Support Agent

An AI agent that reads support tickets, applies your SOPs and product manuals, and drafts accurate replies in the customer’s language.

Section: AI Agents for Ecommerce, AI Agents

AI-Powered Ticket Resolution Using SOPs & Product Manuals

1. The Problem: Manual Customer Support Doesn’t Scale

Before automation, customer support teams faced daily operational friction:

Agents manually read long tickets and threads

Switching between

Inconsistent decisions for

Resulting Issues

Core challenge: Teams had the knowledge, but no system to retrieve, apply, and respond consistently at scale.

2. Results After Automation

Once the AI support agent was implemented

Time & Effort Savings

Before

After

Monthly impact

Accuracy & Consistency Gains

3. The Solution: AI Customer Support Agent

This system acts as a virtual senior support agent:

4. How the System Works

Phase 1: Ticket Intake & Understanding

New customer ticket arrives

AI

Phase 2: Smart Ticket Classification

Identifies

Phase 3: SOP-Driven Decision Making

Applies company SOPs exactly as written

Phase 4: Product Manual Intelligence (RAG)

Phase 5: Drafting the Response

For every ticket, AI generates

1️⃣ Customer Reply Draft

2️⃣ Internal Support Notes

Phase 6: Continuous Knowledge Updates

5. Business Value

6. Expected Impact

Time Savings

Error Reduction

Faster Resolution Times

Knowledge Reuse

Cost Efficiency

7. How to Replicate This System

Copy the attached workflow JSON

Customer support Agent.json

Open Workflow Automation Tool

Connect Credentials

Test the Workflow

Send test ticket

Verify

Enable the Workflow

Toggle Active

From now on

8. Final Outcome

With this AI Customer Support Agent

This system turns manual, error-prone support into a fast, reliable, and fully automated AI-driven operation.

Page · Plain text

Paid List vs. Rooming List

Compare payment and rooming records, identify discrepancies, and keep group travel organized with confidence through faster, smarter, and more accurate data reconciliation.

Section: Custom SaaS Platforms

Project Overview

The Paid List vs. Rooming List is a web application designed for a group travel company to compare payment records with room assignments. It identifies missing guests, unpaid balances, and similar-looking names, helping staff detect discrepancies quickly and maintain accurate travel records. Users can upload CSV files exported from Google Sheets and receive categorized comparison results without manually checking hundreds of rows.

Business Problem

The group travel company managed payment records and room assignments in separate Google Sheets, making it difficult to keep both lists consistent. Staff had to manually check hundreds of rows to identify guests who had paid but were missing from the rooming list, guests assigned to rooms without payment records, and names with slight spelling differences. This process was time-consuming, error-prone, and made it harder to identify discrepancies quickly.

Proposed Solution

The solution is a web application that compares the Paid List and Rooming List using uploaded CSV files exported from Google Sheets. It automatically matches guest names, verifies payment status, and categorizes results into three groups: Matched, Paid List Issues, and Rooming List Issues. It also highlights similar-looking names to help staff identify possible spelling differences and avoid overlooking guests. Each results table can be sorted and downloaded separately as a CSV file, making the reconciliation process faster and more reliable.

End-to-End Workflow

Image: Figure: Workflow Overview

How It Works

1. CSV Upload and Parsing: Staff upload the Paid List and Rooming List as CSV files exported from Google Sheets. The system handles differences in file formats, including header rows, optional row-number columns, and variations in payment column names.

2. Rooming List Processing: Rooming List rows are converted into individual guest records, including multiple occupants assigned to the same room.

3. Guest Name Matching: The system compares names using case-insensitive exact matching. If an exact match is not found, it checks for similar names based on shared surnames, minor spelling differences, or possible nicknames.

4. Discrepancy Detection: The application identifies guests missing from either list, flags payment statuses that are not marked “Paid in Full,” and highlights potential name matches for further review.

5. Categorized Results: Results are displayed in three separate tables: Matched, Paid List Issues, and Rooming List Issues. Red highlights indicate discrepancies, while yellow highlights indicate possible similar-name matches.

6. Review and Export: Staff can sort the results and download each table as a separate CSV file for further review and record-keeping.

Results Categories

Product Experience

The application provides a simple, browser-based interface that allows staff to upload CSV files, compare guest records, and review discrepancies in organized tables. Results are separated into three categories

so users can quickly identify records that need attention. The tables support sorting and individual CSV downloads, making it easier to investigate issues and share results with the team.

Image: The upload screen: a staff member adds the Rooming List and Paid List CSVs exported from the group’s Google Sheet and clicks Compare.

Image: The results summary and the Paid List issues. Red rows are real discrepancies and yellow rows are similar-name warnings. Names, amounts, room and confirmation numbers are blurred for privacy.

Image: The Rooming List issues: people on the rooming list who are not on the paid list. Names and booking numbers are blurred for privacy.

Image: The matched list: people who paid in full and are on the rooming list, with no action needed. Names, amounts and booking numbers are blurred for privacy.

Technology Stack

TechnologyPurpose
TypeScriptCore application logic and type-safe data processing
Node.jsRuns the backend using a plain HTTP server without a web framework
HTML, CSS & Vanilla JavaScriptProvides the browser interface, interactive result tables, sorting, and CSV downloads
Google Sheets & CSVSource of the Paid List and Rooming List data, uploaded as CSV files
RailwayCloud deployment and application hosting

Data Handling & Limitations

The application processes uploaded CSV files in real time and returns comparison results directly in the browser. It is stateless, meaning uploaded data is not saved to disk. Each comparison runs independently, and users can download the Matched, Paid List Issues, and Rooming List Issues tables as separate CSV files.

Limitations: The accuracy of the results depends on the quality and consistency of the uploaded data. Similar-name detection helps identify potential matches but may require manual verification. Staff should review flagged discrepancies before making changes to payment records or room assignments.

Closing Summary

The Paid List vs. Rooming List application simplifies group travel reconciliation by automatically comparing payment records with room assignments. Through exact name matching, similar-name detection, payment status validation, and categorized discrepancy reports, it helps staff identify issues faster and reduce manual checking. Built with TypeScript, Node.js, and a lightweight web interface, the tool provides a practical and efficient way to maintain accurate guest records and support smoother group travel operations.

Page · Plain text

ClickUp: Automating Operations for Veterinary Specialist Partners

ClickUp setup used to automate operations for a veterinary specialist partnership.

Section: ClickUp Setups

Introduction

Veterinary Specialist Partners (VSP) is a specialized veterinary hospital with locations in Louisville and Evansville. The hospital is renowned for its expert management of complex medical diseases in pets, ranging from autoimmune disorders and various cancers to critical care involving advanced surgical procedures. Prior to the implementation of automation, VSP managed appointments, patient records, and inter-departmental communications manually, leading to inefficiencies and potential delays in patient care.

Recognizing the need to enhance their operational efficiencies and patient service delivery, VSP partnered with our team to transition from a fully manual system to a fully automated one, streamlining everything from appointment booking to patient follow-ups and referrals management.

Background

The hospital faced several operational challenges:

Objectives

The primary goal was to automate critical aspects of VSP’s operations, including:

Solutions Implemented

ClickUp Integration and Automation

Calendly to ClickUp Integration

JotForm Integration

Lab Results Automation

Email Integration: Automatically imports email communications and attachments from associated labs directly into ClickUp. This ensures that all pertinent lab results are accessible within the patient’s specific task, eliminating the need for manual email checks and data entry.

Appointment Cancellation Handling

Automated Cancellation Management: If an appointment is canceled in Calendly, the system automatically removes the appointment from the active list and moves it to a ‘Cancelled Appointments’ list. This helps in maintaining accurate and up-to-date appointment statuses without manual intervention.

Centralized Appointment Management

Past Appointment Pruning

Automated Cleanup: The system automatically removes appointments whose dates have passed from all lists in ClickUp, helping to keep the database current and focused only on upcoming and actionable appointments.

Enhanced Scheduling and Reminders

Outcomes and Results

Improved Operational Efficiency

Enhanced Communication

Technical Highlights

Future Steps and Sustainability

Screenshots

Conclusion

The implementation of ClickUp and the integration of essential tools have revolutionized Veterinary Specialist Partners’ operations, positioning them to continue delivering exceptional care with enhanced efficiency and accuracy. This case study illustrates the power of tailored automation solutions in solving complex operational challenges in healthcare environments.

Page · Plain text

Event-Driven Quote Triage for a Freight Brokerage

An event-driven Python service (FastAPI, Celery, Playwright and Claude) that answers load quote requests from a shared inbox with three ranked carriers. Median first reply: 48 seconds, down from 7 minutes 40.

Section: Python Automation

The problem

Load quote requests landed in a shared quotes@ inbox, around 40 a day. A dispatcher would read the request, log into the carrier portal (no public API for what they needed), check which trucks were available on that lane, cross-reference an internal rate sheet, and reply with three carriers and a price. Six to nine minutes each, every time.

Their first automation attempt was a Python script on a five-minute cron driving a hosted agent platform. It worked about 70% of the time, cost roughly $0.42 per request, and failed silently. They usually found out from a customer, not a log.

Three root causes, and all three shaped the rebuild:

The architecture

Everything runs as a small Python service on a single Fly.io machine, a FastAPI app that receives Gmail push notifications, and a Celery worker pool that does the actual work.

Image: Event-driven quote triage pipeline: a FastAPI webhook verifies and acknowledges the push, the request is de-duplicated and queued (Postgres key, Redis queue), Browserbase and Playwright check portal availability while an Airtable rate sheet supplies lanes, margins and exclusions, Claude ranks the top 3 carriers, and a threaded reply goes out on Gmail and Slack.

Key engineering decisions

Real-time trigger, not a cron. Gmail's users.watch publishes to a Google Pub/Sub topic, which pushes to a FastAPI endpoint. The handler does three things and nothing else: verify the JWT on the push request, write the message ID to Postgres, and return 204. Pub/Sub redelivers anything not acked within 10 seconds, so all real work is handed to Celery and the endpoint stays under 50 ms.

@app.post("/gmail/push")
async def gmail_push(req: Request, claims=Depends(verify_pubsub_jwt)):
    envelope = await req.json()
    history_id = decode_message(envelope["message"])["historyId"]
    for msg in gmail.list_since(history_id):
        if requests_repo.claim(msg.thread_id):   # INSERT ... ON CONFLICT DO NOTHING
            process_quote.delay(msg.thread_id)
    return Response(status_code=204)

Idempotency lives in the database, not in memory. claim() is an INSERT ... ON CONFLICT DO NOTHING on the Gmail thread ID. If Pub/Sub redelivers, or the safety net and a live webhook race each other, exactly one worker wins the row. This is the piece that eliminated duplicate replies outright.

Cached navigation instead of per-run LLM planning. Playwright drives a Browserbase session with stored credentials and a persistent context. The first time the portal layout is seen, an LLM produces a navigation plan, a sequence of selectors and actions, which is hashed against the page structure and cached in Postgres. Every subsequent run replays the cached plan with plain Playwright calls: no LLM, no tokens, sub-second steps. Only when a replay step fails does the code fall back to re-planning, write the new plan, and post a Slack notice that the portal changed. That's the same idea as Skyvern's Route Memorization, built explicitly so the failure path is visible rather than silent.

Prompt caching on the ranking call. The system prompt, the scoring rubric, and the serialised carrier roster are static across requests and sit in a cached block; only the parsed request and the fresh availability data go in the user turn. Roughly 11k stable input tokens moved to cache reads.

system=[{
    "type": "text",
    "text": RUBRIC + roster_block,
    "cache_control": {"type": "ephemeral"},
}]

Concurrency capped deliberately. The Celery pool runs three workers. The portal rate-limits aggressively and had previously locked the shared account twice, so throughput was traded for account safety.

State machine and the safety net

Every request row moves through an explicit status column. The hourly sweep is the belt-and-braces layer for the rare case where a Pub/Sub push is lost or a worker dies mid-run.

Image: Request states and recovery: a request is processing (row claimed, timestamp set), then done (reply sent, thread id) on success or failed (alert posted to Slack) on error. An hourly sweep re-runs rows stuck for more than 15 minutes.

The sweep is a Celery Beat task, about 30 lines: select rows in processing with claimed_at < now() - interval '15 minutes', reset the attempt counter, re-enqueue. After three attempts it moves to failed and posts a Slack alert with the thread link and the last exception, so a dispatcher can handle it manually and an engineer can see exactly where it broke.

Errors are handled in three tiers rather than one generic retry: transient network and portal timeouts retry with exponential backoff inside the task; a failed selector replay triggers re-planning and a "portal layout changed" notice; anything else fails the row loudly.

Results

BeforeAfter
Time to first reply (median)7 min 40 s48 s
Cost per request$0.42$0.06
Success rate (30-day)71%98.6%
Duplicate replies / week4–60
Silent failuresroutinenone, every failure alerts

The cost drop came from two places roughly equally: cached navigation removed the per-run planning tokens, and prompt caching cut input cost on the ranking call.

Delivered

Dockerised FastAPI + Celery service with a one-command deploy; Postgres schema and migrations; the Browserbase automation module with cached-plan replay and fallback; the Claude ranking module with the rubric prompt; Slack alerting; a runbook covering the four common failure modes and how to re-run a request by thread ID; and a 45-minute handoff call testing a live request end to end.

Page · Plain text

Ingredient Quoting Across 22 Supplier Portals

A Python pipeline (Prefect, Skyvern and GPT-4.1) that quotes all 22 approved suppliers for every ingredient reorder and delivers a ranked comparison in about four hours instead of 3.5 days.

Section: Python Automation

At a glance

Mid-size generic drug manufacturer, ~40 SKUs in production. Five weeks. Python 3.12, Prefect, Skyvern Cloud, OpenAI GPT-4.1, Postgres, S3, Slack. Went from quoting a fifth of their supplier base per order to quoting all of it.

The 6% nobody could see

Production planning flags a reorder for an active ingredient. A procurement officer opens a portal, searches the CAS number, pulls a price, downloads the spec sheet, pastes it into Excel. Then the next portal. Then the next.

Twenty-two suppliers were on the approved list. In practice the officer got through five or six before the purchase order had to go out, and the same five or six every time, the ones with the least annoying logins.

The waste wasn't the officer's afternoon. It was the sixteen vendors nobody had time to ask. When the full list was finally quoted, the cheapest compliant supplier turned out not to be one of the usual five surprisingly often.

Why this wasn't a scraping job

Three things ruled out the obvious approach, and a hand-written Playwright suite had already been abandoned for exactly these reasons.

Vendors don't agree on what anything is called. Metformin HCl USP, metformin hydrochloride BP/EP, or a bare product code, same molecule, three listings, no shared key except the CAS number buried somewhere on the page.

Quotes don't arrive in one shape. Some portals render a price table. Some hand back a PDF. Some won't tell you anything until you've submitted an RFQ form and waited for an email.

And it's a regulated purchase. Pharmacopoeia grade, GMP status, and whether the supplier holds a DMF or CEP are pass/fail gates, not preferences. A cheap quote from a vendor without the right filing isn't a cheap quote. It's not a quote at all. Every choice has to survive an audit two years later.

Following one RFQ through

Image: Multi-vendor ingredient quoting pipeline: RFQ intake (CAS number, grade, quantity), a Skyvern browser handles login, 2FA and CAPTCHA, prices come from an in-page table or from a downloaded and parsed PDF or emailed quote, GPT-4.1 normalises and validates them, and the ranked comparison goes to a Slack thread with an audit log.

A reorder request arrives as a CAS number, a grade, and a quantity. Before anything opens a browser, that gets resolved against an internal ingredient register, deterministically, on the CAS number, never on the product name.

Prefect then fans the request out to twenty-two isolated subflows, one per vendor. Each launches its own Skyvern cloud browser and logs in. Nine of these portals want 2FA and two sit behind CAPTCHAs; that's handled inside the login step rather than being a per-vendor engineering problem.

From there the paths diverge by portal. Where the price sits in the page, it's read straight off the page against a schema. Where it only exists as a PDF or an emailed quote sheet, the file is downloaded and parsed separately.

Everything then funnels back into a single normalisation pass, one model call, one strict schema, twenty-two vendors reduced to comparable rows: unit price, currency, unit of measure, MOQ, lead time, incoterm, grade, GMP status, DMF reference.

The ranked comparison lands in Slack about four hours later, with every row linking to the evidence behind it.

Four forks in the road

Skyvern rather than raw Playwright

The rejected option was writing and maintaining twenty-two scripts. That's what had already failed. At this many portals somebody is always redesigning something, and the maintenance load quietly exceeded the hours the automation was saving. Buying the resilience rather than building it was the entire reason the project was viable a second time.

1Password rather than a second vault

Skyvern can read credentials from several providers, and the client was already on 1Password. The alternative, standing up a dedicated secrets store, would have meant twenty-two sets of credentials living in two places, which is worse security dressed up as better engineering.

Selectors first, model second

Every stable element on a page gets a selector and a prompt. The selector runs, costs nothing, and usually works; the model only engages when it misses. Going model-first on everything would have been simpler to write and roughly ten times the running cost.

The model never decides what an ingredient is

It was tempting to let a model reconcile vendor product names. It isn't allowed to. Where a listing has no CAS field, the model may suggest a match, and that suggestion goes to a human. Misidentifying an ingredient in this industry isn't a data quality issue, and no accuracy figure would have made that trade acceptable.

When it breaks

Image: Route Memorization in practice: a memorized route replays deterministically. If the replay works the quote is captured with its evidence hash; if the route breaks it is regenerated by AI with a diff alert; if it keeps failing it goes to a review queue with the session recording attached.

Skyvern's Route Memorization compiles a successful run into a deterministic script and replays it. When a portal changes and the replay fails, it re-plans with AI, finds the new path, and regenerates the script. That mechanism does the heavy lifting here.

What it doesn't do is announce itself. A regenerated route is a silent event, and silent events don't belong in a regulated purchasing process.

So the wrapper watches for it. Each subflow records its action count and wall-clock duration; a memorised replay sits in a tight, predictable band, and an AI re-plan blows straight through it. That signal tags the run as a regeneration, diffs the new route against the old one, and drops a summary into Slack so someone can see what the portal changed before the next cycle.

If a regenerated route produces a quote that can't be evidence-checked, that vendor goes to a review queue with its session recording attached instead of into the comparison. About 4% of quotes land there, mostly from two portals that render prices as images.

The result is that failure is local. One portal breaking means twenty-one quotes still land and the RFQ is still useful.

Impact

BeforeAfter
Vendors quoted per RFQ5–622
Time to full comparison3.5 days~4 hours
Procurement hours per month~26~3

Page · Plain text

Enterprise Ticketing & Revenue Data Pipeline

Turning daily ticketing PDFs and emails from multiple vendors into one automated revenue dashboard for a music festival organizer.

Section: Python Automation

Overview

Palm Tree Crew, a live music festival organizer, needed accurate daily revenue and attendance numbers across several cities. We built a custom Python pipeline on Google Cloud that reads vendor audit emails, applies the client’s business rules, stores everything in BigQuery and renders an executive dashboard in Google Sheets with no manual steps.

The business problem

Every day the operations team downloaded static PDF audits from Ticketmaster, Front Gate Tickets and Posh. They split passes by hand (a 2-Day Pass counts toward both Friday and Saturday) and typed the numbers into a master Google Sheet. The work took hours and invited mistakes. VIP Table and Corporate Sponsorship revenue lived in separate spreadsheets, so leadership never saw total gross and remaining capacity in one place.

The solution

A cloud-hosted ETL pipeline runs on a schedule. It intercepts vendor emails through the Gmail API, parses PDF and HTML reports with custom Python code, calculates the client’s metrics, loads the results into Google BigQuery and rebuilds a styled Google Sheets dashboard. Offline revenue from other spreadsheets is linked in through a manual configuration area.

Project snapshot

ItemDetail
ClientPalm Tree Crew
IndustryLive events and entertainment (music festivals)
LanguagePython, written as custom code
CloudGoogle Cloud Run and Cloud Scheduler
Data warehouseGoogle BigQuery
IntegrationsGmail API, Google Sheets API
Ticketing sourcesTicketmaster (PDF), Front Gate Tickets (HTML email), Posh

How the System Works

The pipeline runs once per reporting cycle with no human steps, from vendor email to finished dashboard.

StepProcess
1. Scheduled startGoogle Cloud Scheduler triggers the Python service on Cloud Run.
2. Email ingestionThe Gmail API, with secure OAuth, picks up the daily audit emails from each ticketing vendor.
3. ParsingVendor-specific parsers read the data: a PDF scraper for Ticketmaster, an HTML table parser for Front Gate Tickets.
4. Business logicCode applies the client’s rules: the 2-Day Rule, wrap rates and capacity detection.
5. Warehouse loadResults are written to BigQuery in three tables, so every ticket sold keeps an audit trail.
6. Dashboard renderThe Google Sheets API rebuilds a formatted executive dashboard, including linked offline revenue.

Architecture

Image: Vendor emails enter through Gmail, the Python service on Cloud Run parses them and applies the client’s rules, BigQuery keeps the history, and the Google Sheets dashboard shows the result.

Offline VIP and sponsorship sheets are linked into the dashboard with IMPORTRANGE.

Core Pipeline Components

The pipeline is custom Python code split into four parts, each with one job.

Automated ingestion and parsing

The Gmail API with secure OAuth intercepts the daily audit emails from each vendor. Bespoke parsing engines handle the unstructured formats:

Business logic

The code applies the client’s own rules instead of only moving data:

Data warehouse

All parsed data goes into Google BigQuery to keep full fidelity and prevent double-counting. Three tables hold the history of every ticket sold:

TablePurpose
raw_reportsThe original report as received from each vendor.
report_linesThe individual lines parsed out of each report.
daily_snapshotsThe calculated daily position used by the dashboard.

Dynamic dashboard rendering

The final step renders an executive-ready Google Sheets dashboard. The code formats the layout, freezes rows, color-codes stale data feeds and calculates multi-day averages.

A #MANUAL configuration area lets non-technical team members link external spreadsheets with =IMPORTRANGE() for offline VIP Table and Sponsorship revenue. The dashboard syncs this data automatically, so total top-line revenue appears in one view.

Product Experience

The executive team sees one Google Sheets dashboard that is rebuilt automatically from the BigQuery data. It formats itself, freezes the header rows, color-codes feeds that have not updated and shows multi-day averages, daily wrap rates and remaining capacity per show.

Results & Impact

The daily reporting cycle went from hours of manual transcription to no manual steps. The report gives no counts of events, hours saved or revenue, so none are stated here.

AreaResult
Manual data entryNone. The pipeline runs on Google Cloud Scheduler.
Data accuracyTranscription errors and arithmetic mistakes removed. The dashboard is the single source of truth for executives.
Revenue viewOnline ticket sales and offline VIP and sponsorship revenue in one top-line view.
Onboarding new showsA standard New Show Onboarding Template lets the client add a festival or ticketing platform in minutes.
Decision supportReal-time capacity and daily wrap rates inform ad spend and tier pricing.

Technical Challenges & Solutions

Unstructured vendor formats

Challenge

Ticketmaster sends static PDFs behind AWS API Gateway redirects, and Front Gate sends tables inside email bodies.

Solution

A custom PDF scraper that follows the redirects and adapts to layout changes, plus an HTML parser for inline tables.

Outcome

Both vendors feed the pipeline without manual downloads.

Business rules that were done in the operator’s head

Challenge

A 2-Day Pass had to be split across Friday and Saturday by hand.

Solution

The 2-Day Rule, wrap rates and capacity detection are coded into the pipeline.

Outcome

Consistent daily buckets with no mental math.

Outdated hardcoded limits

Challenge

Venue capacities change, and fixed numbers in code go stale.

Solution

Capacities are read from live vendor reports.

Outcome

The dashboard shows current remaining capacity.

Double-counting and audit trail

Challenge

Daily reports overlap, so repeated loads could count a ticket twice.

Solution

A three-table BigQuery design (raw_reports, report_lines, daily_snapshots) keeps the original data and the calculated snapshots separate.

Outcome

A historical record of every ticket sold.

Offline revenue in separate sheets

Challenge

VIP Tables and Sponsorships were tracked outside the main sheet and maintained by non-technical staff.

Solution

A #MANUAL configuration area where staff link external sheets with =IMPORTRANGE().

Outcome

Offline revenue appears in the dashboard without code changes.

Key Takeaways & Future Development

Key takeaways

Future development

Page · Plain text

End of part 2 of 4. Continue with part 3.