case study
Automating a 40-Hour Workflow to 4 Minutes
A local business was spending 40 hours a month on manual data entry. We replaced it with a pipeline that runs in under 4 minutes.
Problem Statement
A local home services company had a staff member spending 10 hours per week manually copying data between their CRM (GoHighLevel), their scheduling system, and a Google Sheets tracking document. Every new lead required entries in three places. Every status update required changes in three places. Errors were frequent and leads were falling through the cracks.
Context & Constraints
The business owner had tried Zapier but hit the 100-task limit on the free tier within days and the paid tier wasn't in the budget. They'd also tried Make.com but couldn't figure out the error handling for when the GHL API returned rate limit errors. Budget: under $500 for the entire build. Ongoing cost needed to be near zero.
Approach & Architecture
We built an n8n workflow (self-hosted on Railway at approximately $5/month) that listens for webhook events from GoHighLevel, transforms the data, and writes to both the scheduling system and Google Sheets simultaneously. Error handling with exponential backoff for rate limits. A daily reconciliation job that checks for any missed syncs.
Implementation
The core workflow has three branches triggered by a single GHL webhook: new lead creation, status update, and appointment booking. Each branch transforms the GHL payload into the target format and writes to the appropriate destination. Rate limit handling uses a retry node with exponential backoff (1s, 2s, 4s, max 3 retries). The reconciliation job runs at 6 AM daily, compares GHL records against Sheets, and flags any mismatches via email alert.
Results & Metrics
40 hours/month of manual work reduced to zero human intervention. The pipeline processes an average lead in 1.2 seconds. The monthly reconciliation job catches approximately 0.3% of records that need correction (usually due to manual edits in Sheets that conflict with the automation). Total ongoing cost: $5/month for Railway hosting.
What Broke
The GHL webhook occasionally sends duplicate events for the same lead. The first version created duplicate rows in Sheets. Google Sheets API has a 100-requests-per-100-seconds limit that we hit during a marketing campaign that generated 50 leads in an hour.
What We'd Do Differently
Deduplication should have been built in from the start using GHL contact IDs as unique keys. The Google Sheets write should batch records instead of writing one at a time, which would have avoided the rate limit entirely.
Key Takeaways
- Simple automations create disproportionate value for small businesses
- Self-hosted n8n on Railway is a near-zero-cost alternative to Zapier/Make for small operations
- Always build deduplication into webhook-triggered workflows
- A daily reconciliation job is cheap insurance against edge cases you haven't thought of yet