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)
- The reviewer ticks the Redo checkbox on a card and writes what to change in the Feedback field.
- n8n finds every card with Redo ticked and source text filled in. A dispatcher workflow can start it, and an hourly run catches anything that was missed.
- It reads the current Post Rules and Craft Playbook from a settings record in Airtable. The team edits them there, and every new draft follows them first.
- Claude gets the original source, the previous draft and the feedback. It applies the feedback exactly, keeps everything the reviewer did not mention, and returns three versions: the X post, a LinkedIn post of 600 to 1,100 characters, and a Threads post of about 420 characters (500 at most) that ends on a complete sentence.
- A clean-up step removes hedging lines such as “the source does not establish…”. It also keeps the “shared by a publisher” credit line only on posts that carry an image, and moves it to the last line.
- n8n writes all three drafts back to the card, unticks Redo and sets the status to Pending Review. Because Redo is cleared, each request is handled once. The feedback stays on the card as a record.
What the prompt enforces
- Use only facts that appear in the source text or the previous draft, and never invent numbers, dates, figures or view counts.
- Return the full revised post, not a list of changes.
- If the feedback asks for a quote, keep the publisher’s own words word for word in quotation marks, and write any analysis separately after it.
- Follow the account’s voice rules, with a list of banned words and AI-sounding phrases.
Workflow 2: CTA Auto-Insert (picks the call-to-action for each thread)
- Every two minutes it looks for draft cards that have no CTA linked yet.
- It reads every active CTA from a CTA library in Airtable. Each entry has the CTA text, link, category, weight, times used, conversions, a weekly cap and a “use when” note.
- A code step drops CTAs that have reached their cap and scores the rest. Weight counts double, each conversion adds half a point, and each earlier use takes one point off. The list is sorted best first.
- Claude receives the post, its source and the ranked list. It picks one primary CTA that fits the topic and a different secondary CTA, using the “use when” notes. When two fit equally well, it takes the higher-ranked one so no CTA is overused. It writes the reply in the account’s voice and keeps each link exactly as stored.
- Another code step builds the thread. The lead post comes first, the primary CTA is the first reply, the rest of the thread follows, and the secondary CTA goes at the end. Each part is numbered 1/, 2/ and so on.
- n8n saves the thread on the card and links the primary CTA record to it. A linked CTA means the card no longer matches the search, so it is not processed twice.
- The Times Used counter goes up by one for the primary CTA, and for the secondary CTA when there is one, so the rotation stays fair.
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
- The Redo workflow is live. The CTA workflow is switched off in this version, because checking every two minutes would use about 21,600 executions a month.
- Both workflows have an exit rule that stops a card from being handled twice: Redo is unticked in the first, and a CTA is linked in the second.
- The rules, the playbook and the CTA library all live in Airtable, so the team can change how posts are written and which CTAs are used without opening n8n.
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
- Open multiple product pages
- Check prices repeatedly
- Record or remember previous prices
Often missed opportunities
- Price drops
- Limited-time deals
- No historical visibility into price trends
- Buying decisions were based on guesswork rather than data
Impact per user
- 30–60 minutes per day spent manually checking prices
- Missed savings on deals and discounts
- Decisions based on incomplete information
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
- Price monitoring happens automatically every day
- Alerts are sent only when meaningful changes occur
- Users make data-driven purchasing decisions
- Historical price trends are logged and accessible
- No human involvement is needed for routine checks
Time & Effort Savings
Before
45 minutes/day × 30 days ≈ 22.5 hours/month
After
- Fully automated
- Humantime required = near zero
Monthly impact
- ~20–25 hours saved per user per month
- Equivalent to freeing 0.5 full-time workdays per user
Accuracy & Opportunity Gains
- 100% of monitored prices captured accurately
- Never miss a price drop or limited-time deal
- Improved buying decisions based on AI analysis
3. The Solution: AI-Powered Price Monitoring System
This automation acts as a virtual price tracker and analyst:
- Scheduled scraping collects product prices automatically
- Google Sheets logs historical prices
- AI evaluates trends and identifies best-value opportunities
- Notifications sent via Slack, email, or preferred channels
- Only meaningful changes trigger alerts, reducing noise
4. How the System Works
Phase 1: Scheduled Price Collection
Workflow runs automatically (daily, or custom schedule)
Visits product pages and extracts
- Product name
- Current price
- Skips incomplete or erroneous entries
Phase 2: Price Comparison & History Logging
- Prices for multiple products are compared
- Each run adds a new row to Google Sheets
- Builds a complete price history over time
Phase 3: AI-Driven Analysis
AI evaluates
- Current price vs historical prices
- Which product offers the best value today
- Significant changes worthy of notification
Phase 4: Smart Notifications
Sends alerts only when
- Price drops significantly
- A better deal appears
- Stays silent if no meaningful change occurs
- Notifications sent via Slack, email, or other channels
- Notification
5. Business Value
- Zero Manual Monitoring: No human effort required for routine checks
- Never Miss a Deal: Immediate alerts for better prices
- Data-Driven Decisions: AI identifies the optimal product choice
- Historical Visibility: Full record of price trends for smarter buying
- Reduced Noise: Only meaningful alerts, no unnecessary notifications
- Time & Cost Savings: ~20–25 hours/month saved per user
6. How You Can Duplicate This System
Open the JSON workflow
Click the attached file
E-Commerce Price Monitoring Automation.json
- Copy all content from the JSON file
- Open n8n (cloud or self-hosted)
- Log in to your n8n instance
- ➕ Create a new workflow
Click New → Workflow
Name it temporarily; rename later
Import / Paste the JSON
- Paste the copied JSON into the workflow editor
- n8n rebuilds all nodes and connections automatically
- Update credentials & connections
- Scheduler / Cron Node: Set frequency (daily, weekly, or custom)
- HTTP / Scraping Nodes: Update product URLs, test extraction
- Google Sheets: Add credentials, select spreadsheet and columns (Product, Price, Date, Comparison Result)
AI Analysis Node: Add API credentials (OpenAI / Gemini)
- Notification Node: Slack or email credentials, configure messages
- Run a full workflow test
- Manually execute the workflow
Verify end-to-end
- Data collection → analysis → notification
- Ensure no alerts if prices haven’t changed
- Enable the workflow
- Toggle workflow to Active
- System now monitors prices automatically, analyzes trends, and sends alerts only when necessary
7. Final Outcome
With this automation
- Price monitoring is fully automated
- Buying decisions are data-driven and timely
- Users save 20–25 hours per month
- Deals are never missed
- Alerts are meaningful and non-intrusive
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:
- Writing captions repeatedly for each platform
- Designing post images manually
- Maintaining content variety without duplication
- Tracking approvals via email or chat
- Posting manually on LinkedIn
- Losing visibility into what was drafted, approved, or published
Impact per team
- 2–4 hours/day spent manually creating, approving, and publishing posts
- Risk of duplicate, missed, or unapproved posts
- Inconsistent brand messaging across channels
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
- Captions and images are generated automatically
- Posts are published only after approval
- One centralized control panel tracks all content
- Manual effort in content creation and publishing is nearly eliminated
Time & Effort Savings
Before
3 hours/day × 20 workdays ≈ 60 hours/month
After
- Fully automated
- Humantime required = 5–10 minutes for approvals
Monthly impact
- ~50–55 hours saved per team per month
- Equivalent to freeing more than 1 full-time resource for other tasks
Accuracy & Consistency Gains
- 100% approved posts follow brand tone and guidelines
- No accidental or duplicate publishing
- Content is tracked and auditable in one system
3. The Solution: AI-Powered Social Media Automation
This automation acts as a virtual social media manager:
- Generates LinkedIn captions using AI based on topic, brand tone, and content goals
- Creates post images automatically aligned with captions
- Uses Google Sheets as a centralized control panel
- Sends posts for approval and publishes automatically once approved
- Logs all content and live URLs for tracking and reporting
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
- Topic
- Brand context
- Content objective
- Captions are structured, formatted, and optimized for LinkedIn
- Stored in Google Sheets for visibility and approvals
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
- Caption
- Status (pending/approved/published)
- Eliminates manual image design while keeping visuals aligned with content
Phase 3: Approval & Publishing
- Approval emails are sent automatically
- Posts are blocked until approval is received
- Only approved posts are published on LinkedIn
Google Sheets is updated with
- Publishing status
- Live post URL
- Ensures no missed or duplicate posts
5. Business Value
- End-to-End Automation: From caption generation to publishing in one workflow
- Centralized Control Panel: Full visibility of drafts, approvals, and published posts
- Consistent Brand Voice: AI ensures tone and style are consistent
- Approval-Safe Publishing: No post goes live without explicit approval
- Full Tracking & Reporting: All posts logged with status and live URLs
- Time & Cost Savings: ~50+ hours/month saved per team, reduced reliance on designers
6. How You Can Duplicate This System
Open the JSON workflow
Click the attached file
Social Media Automation Workflow.json
- Copy all content from the JSON file
- Open n8n (cloud or self-hosted)
- Log in to your n8n instance
- ➕ Create a new workflow
- Paste the JSON into the editor
- Save the workflow
Rename to: Social Media Content Automation
- Update credentials & connections
- Google Sheets: Connect OAuth credentials, ensure columns for Topic, Caption, Image URL, Status, Post URL
- AI Caption Generation: Add AI credentials, verify brand context and prompt setup
- Image Generation: Confirm image prompts are derived from captions and saved to Drive
- Approval & Publishing: Configure email/LinkedIn credentials, ensure workflow updates Google Sheets correctly
- Run a full workflow test
- Execute workflow manually
Verify end-to-end
- Captions & images appear in control panel
- Approval logic blocks unapproved posts
- Approved posts publish correctly
- Statuses and URLs update accurately
- Enable the workflow
Toggle to Active
Content creation, approval, and publishing now run automatically with minimal manual input
7. Final Outcome
With this automation
- Social media content creation becomes fast, consistent, and repeatable
- Posting is approval-safe and error-free
- Teams operate from one centralized control panel
- Social media operations scale without increasing workload
- Manual effort is reduced by ~50 hours/month, freeing time for strategic work
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
- Orders Management: Automatically imports orders from Shopify.
- Custom Fields: Order ID, Customer Name, Order Date, Status, Product SKU, Quantity, Shipping Address.
- Automations: Notify fulfillment team upon new order entry; tag urgent orders based on delivery date.
- Out of Stock: Tracks inventory shortages.
- Custom Fields: Product ID, Last Available Date, Expected Restock Date, Supplier Contact.
- Automations: Alert purchasing manager when stock levels drop below a predefined threshold.
- Disputed Orders: Manages customer disputes.
- Custom Fields: Order ID, Dispute Reason, Resolution Status, Customer Contact, Resolution Date.
- Automations: Escalate unresolved disputes over 5 days old to senior management.
- Order Reshipment: Manages reshipment processes.
- Custom Fields: Original Order ID, Reshipment Reason, New Tracking Number, Reshipment Status.
- Automations: Generate a reshipment task when a customer service request is approved; notify logistics.
Templates
- Order Processing Checklist: Includes steps for verifying, packing, and shipping orders.
- Dispute Resolution Guide: Detailed steps for handling disputes, including escalation paths.
Customer Service
Lists
- Reshipment Requests: Handles manual entry of reshipment requests, linked to Fulfillment’s Order Reshipment list.
- Custom Fields: Customer ID, Request Date, Issue Description, Resolution Status, Agent Handling.
- Automations: Create a linked task in Order Reshipment upon approval; notify customer when processed.
Templates
- Customer Inquiry Response Template: Predefined responses for common inquiries and issues.
Collection and Product Pages
Lists
- Product Research: For adding potential new products.
- Custom Fields: Product ID, Research Date, Approval Status, Market Analysis, Supplier Details.
- Automations: Move approved products to the Product Upload list; notify the upload team.
- Product Upload: Prepares products for listing on Shopify.
- Custom Fields: Product ID, Upload Date, SEO Keywords, Price, Image URLs.
- Automations: Notify marketing once product is live for promotional activities.
Templates
- Product Proposal Template: Includes comprehensive fields for proposing new products.
- Product Upload Checklist: Steps for uploading products, ensuring all data fields are completed.
Marketing
Lists
- Facebook Marketing: Manages Facebook ad campaigns.
- Custom Fields: Campaign ID, Start Date, End Date, Target Audience, Budget, Actual Spend, ROI.
- Automations: Generate weekly performance reports; adjust budgets based on performance metrics.
- Google Ads & Bing Marketing: Manages PPC campaigns across platforms.
- Email, SMS, WhatsApp, and Push Notifications: Coordinates all direct marketing campaigns.
- Custom Fields: Campaign Type, Content Schedule, Engagement Rate, Conversion Rate.
- Automations: Schedule campaigns based on customer interaction history; A/B test messaging.
Website and Branding
Website Health Checks
Routine audits to ensure optimal functionality and performance of the website.
Custom Fields
- Check Date: Date when the check was performed.
- Performance Score: Scores from tools like Google PageSpeed Insights.
- SEO Score: SEO performance indicators.
- Issues Identified: Specific issues found during the check.
- Urgency Level: Priority rating for issue resolution (Low, Medium, High).
- Resolution Status: Current status of the issue (Pending, In Progress, Resolved).
Automations
- Trigger a task for tech team to review any 'High' urgency issues immediately.
- Schedule next check based on the previous performance score (lower scores result in more frequent checks).
Branding Consistency Reviews
Regular reviews to ensure all marketing materials and online content adhere to brand guidelines.
Custom Fields
- Review Date: When the review was conducted.
- Inconsistencies Found: Details of any deviations from brand guidelines.
- Corrected: Checkbox to indicate whether the issue has been resolved.
- Responsible Team Member: Who is in charge of resolving the inconsistency.
Automations
- Notify marketing manager of any inconsistencies found.
- Set reminders for follow-up checks one week after the initial review.
User Experience Optimization
Ongoing optimization tasks aimed at improving the overall user experience on the website.
Custom Fields
- Task ID: Unique identifier for each optimization task.
- Initiation Date: Date when the task was started.
- Expected Impact: Estimated improvement in user engagement or satisfaction.
- Completion Date: When the task was completed.
- Impact Review: Follow-up evaluation of the task’s effectiveness.
Automations
- Automatically generate a follow-up task upon task completion to review its impact after 30 days.
- Prioritize tasks based on expected impact, focusing first on those with potential for highest user engagement improvement.
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
- Products
- Prices
- Availability
- Store policies
- Voice messages required listening and interpretation
- Image-based questions (e.g. product photos) needed human review
- Responses depended on who was replying, causing inconsistency
- Support was unavailable outside business hours
For a small business receiving 80–120 WhatsApp messages per day, this meant:
- 4–6 hours/day spent answering routine questions
- Delayed replies during peak hours
- Missed inquiries outside working hours
- High dependency on trained staff with product knowledge
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:
- 70–85% of incoming queries were handled automatically
- Customers received instant replies, even outside business hours
- Voice messages were transcribed and answered automatically
- Image-based queries (products, issues) were understood by AI
- Answers were consistent, accurate, and policy-aligned
- Human agents only handled complex or edge-case conversations
Time & Workload Impact
Before automation
- ~3–4 minutes per WhatsApp message
- 100 messages/day = ~5–6 hours/day
After automation
- Human involvement only for ~15–30 messages/day
- Manual time reduced to ~1–1.5 hours/day
Net savings
- 3–4 hours saved per day
- 90–120 hours saved per month
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:
- Understands text, voice, and images
- Remembers conversation context
- Searches business knowledge instantly
- Responds naturally like a human agent
- Chooses whether to reply with text or voice
Customers never feel like they’re talking to a bot, just fast, helpful support.
4. How the System Works
- Customers message the business on WhatsApp
- AI understands the message type and intent
- Business knowledge is retrieved using semantic search
- A context-aware response is generated
- Reply is sent instantly via WhatsApp
All of this happens automatically in seconds.
5. Business Value
- Major reduction in repetitive support workload
- Faster response times improve customer satisfaction
- Consistent answers across all customers
- Supports multilingual conversations naturally
- Operates 24/7 without staff availability
- No changes required to customer behavior
6. Reliability & Safety
- Uses verified business knowledge only
- Falls back gracefully when information is unclear
- Never processes payments or sensitive data
- Human escalation can be added anytime
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
- WhatsApp Business account
- Phone number ID
- Webhook events for incoming messages
Ensure it can
- Receive text, voice, and image messages
- Send text and audio replies
Create WhatsApp Webhook in n8n
- Create a Webhook Trigger node in n8n
- Copy the webhook URL
Paste this URL into
Meta → WhatsApp → Webhooks configuration
This connects WhatsApp messages to the automation.
- Import the n8n Workflow
- Create a new workflow in n8n
Import the JSON file
AI-Powered WhatsApp Assistant.json
Connect AI & Data Services
Configure the following nodes
- OpenAI
- Add your OpenAI API key
Enable
- Chat model
- Audio transcription
- Image analysis
- Text-to-speech
Supabase Vector Store
Add Supabase project URL & API key
Confirm vector table contains
- Products
- FAQs
- Policies
- Business information
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
- Text question (e.g., product inquiry)
- Voice message
- Image (product photo)
Verify
- Correct intent detection
- Accurate answers from business knowledge
- Responses returned via WhatsApp
- Voice replies work when triggered
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:
- Customer support became faster and more reliable
- Staff focused on higher-value conversations
- Customers received instant, accurate help
- Support scaled naturally with business growth
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
- 5 → 1: Systems unified
- ~90%: Less reporting effort
- Daily: Automated 06:00 refresh
- 6 wks: Concept to live rollout
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.
- Bookings scattered across platforms: Revenue lived in Airbnb, Booking.com, Vrbo and the direct site, with turnovers in the PMS and money in accounting. Nobody could see occupancy, nightly rate and net revenue in one place without exporting several files first.
- Owner statements ate three days a month: A manager rebuilt every owner statement and the board pack by hand (copy, paste, reconcile, repeat). By the time they were ready the numbers were weeks old, and one slip meant redoing the lot.
- No shared version of the truth: Channel profitability after platform fees was invisible. It wasn’t clear which channels actually paid off once commissions were taken out, so pricing and listing decisions were made on gut feel.
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:
- Discovery & metric definitions (week 1): Workshops to agree exactly what occupancy, ADR, RevPAR and net-of-fees revenue mean (one signed-off definition each, so the model has a single source of truth).
- Connect & clean with Power Query (weeks 2–3): ETL into all five sources, standardised property and channel keys, and consistent handling of platform fees, refunds and cancellations so figures reconcile to the accounts.
- Star-schema model & DAX (weeks 3–4): A clean fact-and-dimension model with a shared date table, reusable DAX measures (occupancy, ADR, RevPAR, YoY, target) and row-level security so each owner sees only their own properties.
- Dashboards, refresh & handover (weeks 5–6): Two role-based dashboards, an on-premises gateway for the automated 06:00 refresh, plus training and a short written guide so the team can extend the model themselves.
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.
- Cumulative revenue vs operating cost shows the margin gap at a glance.
- Channel donut exposes reliance on commission-heavy platforms vs direct.
- Top-property table ranks by revenue with live YoY growth flags.
- Gauge tracks progress against the £4.55M annual target (106%).
Under the Hood
| Layer | What We Built | Tools |
|---|
| Sources | Airbnb, Booking.com, Vrbo, direct site, PMS / channel manager, accounting | REST / API / file connectors |
| Ingest & clean | Dedupe, key standardisation, fee / refund / cancellation handling | Power Query (M) |
| Model | Star schema, shared date table, reusable measures | Power BI model + DAX |
| Governance | Row-level security by owner / manager, documented definitions | RLS roles |
| Delivery | Two role-based dashboards, automated daily refresh | Power BI Service + gateway |
The Results
- +5.6pts: Occupancy rate
- +0.14: Guest rating
- 3 days → 0: Manual reporting
- 106%: Of annual target
| Measure | Before | After |
|---|
| Owner statements & board pack | ~3 days, manual | Automatic, ready by 06:00 |
| Data freshness | ~3 weeks old | Refreshed daily |
| Channel profit (net of fees) | Invisible | Live, per channel |
| Sources reconciled | Manually, error-prone | Reconciled 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
- Someone replies “Go” to a dropped text or image. They can add a format at the same time: thread, image, text or long.
- The bot answers with the steps. Drop the images in order, where a caption under an image becomes the text for that post. Send any extra text. Send “done” when finished, or “cancel” to stop.
- Telegram splits long texts into several messages. The workflow merges those parts back together in the right order.
- Each image and text is saved in Airtable as its own row, linked to the session. A session stays open for 12 hours.
Step 2: Answer the setup questions
- When “done” arrives, the bot asks only what it does not know yet. These are numbered questions, so a reply is just a number: how many posts, which call-to-action and on which post, and whether to blur the images.
- Writing “go” at any point accepts the defaults for everything still open. Tags typed with the first “Go”, such as “no blur” or “cta newsletter”, skip those questions.
- The bot ends with a one-line summary, and a reply of 1 starts the build. If nobody answers for 10 minutes, the workflow carries on by itself with the defaults.
Step 3: Prepare and blur the images
- The workflow collects the session’s images in order, up to 15, and downloads each one from Telegram.
- Each image goes to a blur service that hides page names, logos and faces.
- A check then confirms that every image came back blurred. If any image fails, no thread is created. The session is reopened, and the bot says which images failed and why, so the team can send “done” again.
Step 4: Write the thread
- Claude receives the full source text, the team’s captions and notes, every blurred image, and the current Post Rules from Airtable. It reads the numbers and labels inside the screenshots as part of the source.
- The prompt fixes the number of posts, puts one image on each post in order, and asks Claude to use every fact from the material.
- It also sets the voice: a long opening hook, replies that each carry one step of the story, and an analysis near the end. The posts must not name any page, person or brand shown in the material.
Step 5: Clean up, add CTAs and deliver
- A code step cleans the writer’s output. It removes links, handles, “via” credits, post numbering and stock phrases, and it keeps the thread to the agreed number of posts.
- It checks that every image is used exactly once, in order, and spreads them again if the writer got that wrong.
- Call-to-actions are added from the CTA library in Airtable, for example a newsletter reply at the end, or a consulting reply placed at post 4.
- n8n creates the card in Airtable with status Pending Review, the hook and the full thread, and attaches each blurred image. It marks the session done.
- The bot replies in Telegram with the post count, the number of images, the CTA used and a preview of the hook, plus a link to the card so the team can check the blur and approve.
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
- An unblurred image is never attached, unless the team asked for no blur.
- When the blur or the writer fails, the session is reopened and the team is told in Telegram, so they can retry with “done” instead of starting again.
- If the writer returns something unusable, no card is created.
- An image that fails to upload to the card is reported in the summary message.
Good to Know
- This is a large workflow of about 65 nodes, which is why the diagram is wide. It is read from left to right, and each row has one job.
- The Post Rules, the CTA library and the session rows all live in Airtable, so the team can change how threads are written without opening n8n.
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:
- Repeating the same answers about products, sizes, shipping, returns, and order status
- Switching between CRM, store backend, and knowledge documents mid-call
- Missing calls during peak hours or off-hours
- Providing inconsistent answers depending on which agent handled the call
Impact per team
- Long wait times and dropped calls
- Frustrated customers with basic questions
- No standardized knowledge usage
- High dependency on human agents for repetitive FAQs
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
- Calls are answered instantly, any time of day or night
- FAQs are resolved automatically without human intervention
- Escalation happens only for complex or high-risk issues
- Responses are fully aligned with the store’s product and policy data
- Human agents focus on complex, high-value calls
Time & Effort Savings
Before
- 100–200 repetitive calls/week
- ~2–3 hours/day of agent time spent on FAQs
After
- Fully automated
- Humantime required = 10–15 minutes
Monthly impact
- ~40–60 hours saved per month per support team
- Equivalent to freeing up 1–1.5 full-time support agents
Accuracy & Consistency Gains
- 100% of FAQs answered correctly
- Calls aligned with latest store policies
- Reduced human error and improvisation
3. The Solution: AI-Powered Voice Agent
This system acts as a virtual support agent, capable of handling most customer queries autonomously:
- 24/7 natural, human-like voice answers
- Uses the eCommerce store’s knowledge base (products, pricing, inventory, policies, FAQs)
- Resolves common queries end-to-end without human intervention
- Escalates only complex or edge-case calls to human agents
4. How the System Works
Phase 1: Knowledge Base & Store Data
- Collect product, pricing, inventory, policy, and FAQ information
- Structure it as a real-time queryable knowledge base
- Keep it synchronized to avoid outdated information
Phase 2: Voice Agent Flow
Incoming Call
- Customer dials the support number
- VAPI answers with a natural greeting
Intent & Query Understanding
- Converts speech to text
- Analyzes intent (product info, order help, policy clarification)
Knowledge Base Lookup
Searches store data for relevant answers
- Product details (sizes, colors, availability)
- Shipping fees and delivery times
- Return/refund/exchange policies
- Promotions and bundles
- Can query order details for authenticated users (order ID/email)
Voice Response Generation
- Crafts a natural, friendly answer
- Converts text to speech and plays it in real-time
Multi-Turn Conversation
- Maintains context across follow-up questions
- Handles dynamic conversations about products, orders, or policies
Escalation to Human (Optional)
- Complex or high-risk calls forwarded
- Callback requests or ticket created with full transcript
5. Business Value
- 24/7 Instant Responses: Customers get accurate answers anytime
- Lower Load on Support Team: AI handles repetitive FAQs automatically
- Consistent, On-Brand Answers: Responses aligned with store knowledge
- Faster Resolution: FAQs resolved in seconds instead of minutes
- Better Data Utilization: Product and policy data powers voice interactions
6. Expected Impact
Time Savings
- Human agents spend fewer hours on repetitive calls
- Focus shifts to complex, high-value issues
Error Reduction
- Fewer incorrect or improvised answers
- Fully aligned with latest product and policy data
Call Handling Speed
- FAQs resolved in 1–2 exchanges
- Reduced call transfers and hold times
Knowledge Utilization
- Centralized product and policy data reused automatically
- Store knowledge drives consistent voice support
7. How You Can Duplicate This System
Built using VAPI + n8n + Slack + Google Sheets.
Create the VAPI Call Agent
- Configure greeting & voice tone
- Connect to store knowledge base
Ensure it can
Answer FAQs
Handle product & policy questions
Add Webhook to VAPI
- Add a call-end webhook
- Point to an n8n Webhook node
- Import the n8n Workflow
- Create a new workflow
Import JSON
ShopTalk AI – Call Summary & Lead Capture (1).json
- Connect Tools in n8n
- Webhook → paste URL into VAPI
- Slack → select summary channel
- Sheets → select spreadsheet & columns
Test the Flow
- Make a test call
- Ask questions and express scheduling intent
- End call
Verify
- Slack summary appears
- Sheet row is added (if applicable)
Enable the Workflow
- Activate the workflow
- The AI voice agent now handles customer calls automatically, 24/7, with minimal human input
8. Final Outcome
With this automation
- Customer queries are answered instantly, any time
- Human agents are freed from repetitive calls (~40–60 hours/month saved)
- Answers are accurate, consistent, and on-brand
- Complex issues are escalated only when necessary
- Support operations scale without adding headcount
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:
- Manual Appointment Scheduling and Management: Dependent on phone and in-person scheduling, causing bottlenecks and increased administrative overhead.
- Fragmented Patient Records Management: Dispersed patient histories and treatment records across various platforms, complicating data retrieval and management.
- Inconsistent Follow-Up Communications: Manual processes for scheduling follow-ups and managing patient reminders were error-prone and inefficient.
Objectives
The main objectives for implementing monday.com were to:
- Automate Appointment Scheduling and Management: Streamline the entire appointment lifecycle, from booking through cancellation.
- Centralize Patient Data: Create a unified system for managing patient histories and treatment records.
- Automate Communication: Enhance communication with patients regarding appointments and follow-ups.
Solutions Implemented
Monday.com Integration and Automation
Automated Appointment System
- Automated Appointments: Every new appointment booked is automatically captured and added to a specific monday.com board designated for appointments. Separate groups are maintained for each type of appointment and location.
- Patient Registration and Check-In: Automated processes for patient registration and check-in ensure that all necessary patient information is captured and stored in monday.com, linked directly to their respective appointment entries.
Integration with External Scheduling Tools
- Calendly Integration: Direct integration with Calendly allows seamless synchronization of appointment bookings and cancellations, updating monday.com boards in real-time.
- Email and SMS Reminders: Automated email and SMS reminders are set up to notify patients about upcoming appointments, using integration with email platforms and SMS gateways.
Patient Records Management
- Centralized Records: All patient records are consolidated within monday.com. Custom forms are used to collect and upload medical histories, treatment records, and other relevant documents directly into the system.
- Access Control: Different access levels are set for various team members, ensuring sensitive patient information is handled securely and in compliance with medical privacy regulations.
Task Automation for Follow-Ups and Referrals
- Follow-Up Automation: Automated tasks are created for follow-ups, ensuring patients receive timely care post-appointment. These tasks are linked to specific appointments for easy tracking.
- Referral Management: A dedicated board manages referrals to and from other specialists. Each referral triggers specific workflows to ensure no patient is overlooked and all records are shared with relevant parties.
Outcomes and Results
Improved Operational Efficiency
- Streamlined Appointment Handling: Reduction in administrative workload and minimized errors related to manual appointment management.
- Centralized Data Management: Unified patient records enhanced data-driven decision-making, enabling better patient care and easier compliance with healthcare regulations.
Enhanced Communication
- Reliable Patient Reminders: Decreased no-show rates through timely, automated reminders.
- Improved Referral Coordination: Strengthened relationships with other healthcare providers and ensured comprehensive patient care through efficient referral management.
Technical Highlights
- monday.com Customizations: Extensive use of custom fields, automation rules, and integrations tailored the workflow specifically to VSP’s needs.
- Integration Suite: Seamless integration with external tools like Calendly, email platforms, SMS gateways, and medical record software to centralize operations and communication.
Future Steps and Sustainability
- Ongoing Optimization: Continual refinement of the system based on user feedback and evolving needs.
- Expansion of Automation: Exploring further automation opportunities to enhance other areas of hospital operations.
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
- SOP documents
- Product manuals
- Order details
Inconsistent decisions for
- Returns
- Refunds
- Warranty claims
- Slow response times during peak volume
- Risk of policy mistakes due to human interpretation
- Outdated manuals leading to incorrect answers
Resulting Issues
- High manual workload for support agents
- Inconsistent, non-standard replies
- Longer resolution times
- Difficult onboarding for new agents
- Poor scalability as ticket volume increased
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
- Tickets are classified and understood automatically
- SOPs and product manuals are applied consistently
- Draft responses are generated instantly in the customer’s language
- Agents focus only on complex or exceptional cases
- Knowledge stays up-to-date automatically
Time & Effort Savings
Before
- 50–100 routine tickets/day
- ~2–4 hours/day spent reading manuals and drafting replies
After
- Fully automated
- Humantime required = 10–15 minutes
Monthly impact
- ~50–60 hours saved per team per month
- Equivalent to freeing 1–1.5 full-time support agents
Accuracy & Consistency Gains
- 100% rule-based SOP application
- Product-specific questions answered accurately
- Reduced human error and knowledge drift
3. The Solution: AI Customer Support Agent
This system acts as a virtual senior support agent:
- Reads tickets automatically
- Applies SOPs and business rules consistently
- Retrieves answers from product manuals or knowledge bases
- Drafts accurate, human-ready responses
- Keeps knowledge always up-to-date
- Escalates only complex or edge-case tickets
4. How the System Works
Phase 1: Ticket Intake & Understanding
New customer ticket arrives
AI
- Reads full conversation
- Understands customer intent
- Detects language automatically
- Identifies if ticket is valid or spam
- All tickets are logged temporarily to ensure nothing is lost
Phase 2: Smart Ticket Classification
Identifies
- Ticket type: Product usage, warranty, return, refund, missing/defective items, order status, payment issues
- Relevant details: Order ID, Product SKU, Purchase date, Urgency
- Determines which SOP or product manual should be applied
Phase 3: SOP-Driven Decision Making
Applies company SOPs exactly as written
- Warranty rules
- Return eligibility
- Refund conditions
- Price-based thresholds
- Decisions are consistent, never improvised
Phase 4: Product Manual Intelligence (RAG)
- Searches latest product manuals for product-specific questions
- Understands instructions, specifications, troubleshooting
- Provides accurate, up-to-date answers
Phase 5: Drafting the Response
For every ticket, AI generates
1️⃣ Customer Reply Draft
- Friendly tone, clear explanation
- Written in the customer’s language
- Ready to send
2️⃣ Internal Support Notes
- Reasoning behind the reply
- SOP/manual used
- Suggested next steps
Phase 6: Continuous Knowledge Updates
- Product manuals monitored and updated automatically
- SOPs synchronized
- Outdated information removed
- Knowledge always current without manual uploads
5. Business Value
- Massive Reduction in Manual Reading: Agents no longer scan long SOPs/manuals
- Consistent Policy Application: Every customer gets rule-based answers
- Faster First Responses: Drafts created instantly
- Multi-Language Support: Handles multiple languages automatically
- Zero Knowledge Drift: Manuals and SOPs stay current
- Agent Confidence: Clear internal reasoning supports decisions
6. Expected Impact
Time Savings
- Agents spend less time reading and researching
- Faster handling of routine tickets
Error Reduction
- No policy deviations
- No outdated manual references
Faster Resolution Times
- Accurate replies prepared instantly
- Less back-and-forth with customers
Knowledge Reuse
- SOPs and manuals applied to every ticket
- No unused documentation
Cost Efficiency
- AI costs ~$30–40/month per agent workflow
- Far cheaper than hiring additional support staff
- Enterprise-level intelligence at low cost
7. How to Replicate This System
- Built using AI + Workflow Automation (n8n, Zapier, etc.) + Knowledge Base (Sheets/PostgreSQL/Supabase)
- Open the JSON workflow
Copy the attached workflow JSON
Customer support Agent.json
Open Workflow Automation Tool
- Create a new workflow
- Import/paste JSON into editor
- Save workflow and rename it
Connect Credentials
- Ticket Platform API: Enable new ticket events → forward to webhook
- Knowledge Base: Google Sheets/PostgreSQL/Supabase for SOPs, manuals, and embeddings
- AI Models: OpenAI GPT models for classification, RAG reasoning, and embedding generation
Test the Workflow
Send test ticket
Verify
- Ticket ingestion works
- Classification & knowledge retrieval run correctly
- Draft responses appear
- Data logged correctly
- No errors or missing outputs
Enable the Workflow
Toggle Active
From now on
- Tickets are processed automatically
- SOPs/manuals applied consistently
- Draft responses ready for human review or auto-send
- Knowledge updates happen automatically
8. Final Outcome
With this AI Customer Support Agent
- Support teams work faster with less effort
- Customers receive accurate, consistent answers
- Policies and SOPs are applied correctly every time
- Knowledge stays fresh without manual work
- Support scales without adding headcount
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
| Technology | Purpose |
|---|
| TypeScript | Core application logic and type-safe data processing |
| Node.js | Runs the backend using a plain HTTP server without a web framework |
| HTML, CSS & Vanilla JavaScript | Provides the browser interface, interactive result tables, sorting, and CSV downloads |
| Google Sheets & CSV | Source of the Paid List and Rooming List data, uploaded as CSV files |
| Railway | Cloud 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:
- Manual Appointment Scheduling and Management: Reliance on phone and in-person scheduling led to bottlenecks and increased administrative overhead.
- Fragmented Patient Records Management: Patient histories and treatment records were dispersed across various platforms, complicating data retrieval and management.
- Inconsistent Follow-Up Communications: Manual processes for scheduling follow-ups and managing patient reminders were prone to human error and inefficiency.
Objectives
The primary goal was to automate critical aspects of VSP’s operations, including:
- Appointment Scheduling and Management: Automate the entire appointment lifecycle, from booking to cancellation.
- Patient Data Centralization: Create a unified system for managing patient histories and treatment records.
- Automated Communication: Streamline communication with patients regarding appointments and follow-ups.
Solutions Implemented
ClickUp Integration and Automation
Calendly to ClickUp Integration
- New Appointments: Automatically captures every new appointment booked via Calendly and adds it to ClickUp. Distinct lists for different appointment types are maintained for both Louisville and Evansville locations.
- Tags and Lists: Appointments are tagged with specific descriptors (e.g., new appointment, recheck appointment) and sorted into corresponding lists in ClickUp to ensure easy access and organization.
JotForm Integration
- Form Submission Tracking: Monitors patient compliance with required JotForm submissions post-appointment scheduling. If a form is not submitted, automated reminders are sent via email and SMS two days before the appointment to ensure completion.
- Medical Information Integration: Captures and integrates patient medical information from JotForm into ClickUp, linking it directly with the patient’s appointment record for streamlined access.
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
- Unified Appointment List: A master list called ‘Appointments’ captures and consolidates every appointment from both Louisville and Evansville, regardless of type. This list serves a referral department that requires visibility across all bookings.
- Cross-List Synchronization: Changes made in any appointment’s custom fields are dynamically updated across both location-specific and centralized appointment lists. This ensures consistency and accuracy in appointment details across the board.
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
- RingCentral Integration: Utilizes RingCentral to send automated SMS reminders about upcoming appointments, reducing no-show rates and ensuring patients are adequately prepared for their visits.
- Dropdown Functionality for Cancellations: Enables staff to cancel appointments directly in ClickUp via a dropdown field change, which then reflects in both ClickUp and Calendly, streamlining the process.
Outcomes and Results
Improved Operational Efficiency
- Streamlined Appointment Management: Reduced administrative burden and errors related to manual appointment handling.
- Centralized Data Management: Achieved a unified view of patient and lab data across all locations, enhancing data-driven decision-making.
Enhanced Communication
- Automated Patient Reminders: Improved patient preparation and reduced no-shows through timely automated reminders.
- Referral Hospital Coordination: Strengthened relationships and improved data sharing with referral hospitals.
Technical Highlights
- ClickUp Customizations: Leveraged custom fields, lists, and automation to create a tailored workflow management system.
- Integration Suite: Seamlessly integrated with Calendly, JotForm, Gmail, RingCentral, and Slack to centralize operations and communications.
Future Steps and Sustainability
- Continue refining the integration based on user feedback and system performance.
- Explore additional automation opportunities to further enhance efficiency and patient care.
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
- Client: regional 3PL, 11 dispatchers
- Stack: Python 3.12 · FastAPI · Celery + Redis · Postgres · Browserbase + Playwright · Airtable · Anthropic API (Claude Sonnet 4.6) · Slack
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:
- Polling. A 0–5 minute delay before anything started, and the cron had no idea what the previous run had done.
- Re-planning on every run. The agent asked an LLM to navigate the portal from scratch each time, so any UI jitter became a fresh failure mode, and every run paid full navigation token cost.
- No durable state. Nothing recorded which requests had been handled, so retries either duplicated replies or never happened.
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
| Before | After |
|---|
| Time to first reply (median) | 7 min 40 s | 48 s |
| Cost per request | $0.42 | $0.06 |
| Success rate (30-day) | 71% | 98.6% |
| Duplicate replies / week | 4–6 | 0 |
| Silent failures | routine | none, 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
| Before | After |
|---|
| Vendors quoted per RFQ | 5–6 | 22 |
| Time to full comparison | 3.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
| Item | Detail |
|---|
| Client | Palm Tree Crew |
| Industry | Live events and entertainment (music festivals) |
| Language | Python, written as custom code |
| Cloud | Google Cloud Run and Cloud Scheduler |
| Data warehouse | Google BigQuery |
| Integrations | Gmail API, Google Sheets API |
| Ticketing sources | Ticketmaster (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.
| Step | Process |
|---|
| 1. Scheduled start | Google Cloud Scheduler triggers the Python service on Cloud Run. |
| 2. Email ingestion | The Gmail API, with secure OAuth, picks up the daily audit emails from each ticketing vendor. |
| 3. Parsing | Vendor-specific parsers read the data: a PDF scraper for Ticketmaster, an HTML table parser for Front Gate Tickets. |
| 4. Business logic | Code applies the client’s rules: the 2-Day Rule, wrap rates and capacity detection. |
| 5. Warehouse load | Results are written to BigQuery in three tables, so every ticket sold keeps an audit trail. |
| 6. Dashboard render | The 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:
- Ticketmaster: a custom PDF scraper that bypasses AWS API Gateway redirects, reads complex tabular data and adjusts to unannounced layout changes by the vendor.
- Front Gate Tickets: an HTML parser that extracts inline tables directly from the email body.
Business logic
The code applies the client’s own rules instead of only moving data:
- The 2-Day Rule: splits a multi-day pass into the correct daily attendance buckets, for example one 2-Day Pass counts toward both Friday and Saturday.
- Wrap rates: computes 24-hour sales velocity.
- Dynamic capacities: detects and adjusts venue capacity limits from live vendor reports, so no hardcoded limit goes out of date.
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:
| Table | Purpose |
|---|
| raw_reports | The original report as received from each vendor. |
| report_lines | The individual lines parsed out of each report. |
| daily_snapshots | The 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.
| Area | Result |
|---|
| Manual data entry | None. The pipeline runs on Google Cloud Scheduler. |
| Data accuracy | Transcription errors and arithmetic mistakes removed. The dashboard is the single source of truth for executives. |
| Revenue view | Online ticket sales and offline VIP and sponsorship revenue in one top-line view. |
| Onboarding new shows | A standard New Show Onboarding Template lets the client add a festival or ticketing platform in minutes. |
| Decision support | Real-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
- End-to-end automation: email ingestion, parsing, calculation, storage and reporting run without human input.
- Custom code where vendors give no API: parsing PDFs and email tables made the data reachable.
- Built for scale: a decoupled design and an onboarding template let the client add shows and platforms quickly.
Future development
- Add parsers for further ticketing platforms as the client adds vendors.
- Add alerts when a vendor email is missing or a report layout changes.
- Extend the dashboard with ad-spend data to compare against sales velocity.
Page · Plain text
End of part 2 of 4. Continue with part 3.