Sometimes the best solutions come from the worst problems. In this case, that problem was watching a digital marketing agency’s SaaS costs spiral out of control because of one simple feature: client access.
Here’s how I turned a $300/month Airtable portal into a completely free, secure campaign management system using Google Sheets, some creative automation, and what I like to call “vibecoding” with Replit.
The Original Setup: AI Agents Creating Marketing Gold
Let me paint the picture first. This digital marketing company had a solid workflow – every month they’d create email and SMS campaigns, build a calendar showing everything to clients, and handle the whole approval dance. Pretty standard stuff.
But I helped them level it up with some AI automation. Built out three specialized agents in n8n:
- Campaign Ideas Agent: Brainstorming creative concepts
- Brief Creation Agent: Turning ideas into actionable briefs
- Copy Generation Agent: Writing the actual campaign content
The cool part? Each agent was connected to an MCP (Model Context Protocol) server node, essentially giving me an MCP server full of marketing agents. Clean tool usage, proper data flow, everything updating the campaign database as it moved through the pipeline.
All of this lived in Airtable initially. Made sense – easy sharing, good collaboration features, clients could see their campaigns and approve or request changes. Everything was working smoothly.
Until we looked at the bill.
The $300/Month Problem
Here’s where things got expensive fast. To create a proper client portal where customers could access their campaigns and provide feedback, Airtable wanted $15 per client.
With around 20 clients at launch, we were looking at $300+ per month just for client access. And that number would only grow as they added more clients. Not exactly the kind of scaling cost you want to explain to a growing agency.
Time for some creative problem-solving.
The Google Workspace Pivot
I knew the team was already deep in Google Workspace – Gmail, Drive, the whole suite. Why not leverage what they’re already paying for?
First step was the great migration. Extracted all the Airtable tables and moved everything over to Google Sheets. Not just a simple copy-paste job though – I had to rebuild all the relational logic that linked clients to campaigns, briefs to campaigns, all the connections that made the data actually useful.
This meant diving deep into Google Sheets formulas. VLOOKUP, INDEX/MATCH, array formulas – the whole nine yards. Had to recreate the same data relationships and views that made Airtable so user-friendly, but now in a platform they were already paying for.
Automation: Making Google Sheets Talk to n8n
Now came the tricky part – keeping the automation working. The n8n agents still needed to update the database, and the team needed notifications when clients made changes.
Enter Google Apps Script. Worked with Gemini to build out scripts that:
- Send data to n8n webhooks when specific conditions are met
- Update sheets automatically when campaigns move through different stages
- Handle all the background logic that keeps everything synchronized
The beauty of this approach? Google Sheets became both the database AND the interface, with Apps Script handling all the automation plumbing.
The Security Challenge: Vibecoding a Client Portal
Here’s where things got interesting. I needed to create secure, client-specific views that would only show relevant campaign information to each client. Can’t just share the whole sheet – that’s a privacy nightmare.
Time to “vibecode” with Replit.
Built out a web application that generates secure, row-level access links. Each client gets a unique share link that only displays their campaigns, their approval status, their feedback options. The security model ensures clients can’t see other clients’ data, can’t access administrative functions, just their specific slice of the campaign world.
The app handles:
- Authentication: Secure link generation with expiration
- Row-level security: Each client sees only their data
- Update functionality: Clients can approve/request changes
- Team notifications: Automatic alerts when clients take action
- Robust error handling: Because nothing ever goes perfectly in production

What I Learned (The Hard Way)
This migration taught me a ton of stuff I didn’t expect to learn:
Google Apps Script is surprisingly powerful – It’s basically JavaScript with direct access to all Google services. Way more capable than I initially gave it credit for.
Spreadsheet formulas are a programming language – Complex data relationships in Google Sheets require the same logical thinking as database design, just with different syntax.
Security in custom apps is no joke – Building row-level security from scratch means thinking through every possible edge case. What happens if someone tries to manipulate URLs? What about concurrent access? Error states?
Vibecoding works (sometimes) – Rapid prototyping with AI assistance can get you surprisingly far, but you still need to understand the fundamentals to make it production-ready.
The Cost Savings Reality Check
Let’s talk numbers:
- Before: $15 per client per month ($300+ for 20 clients)
- After: $0 additional cost (using existing Google Workspace)
- ROI: Immediate savings of $3,600+ annually
Plus, the system is more flexible now. Need to add new clients? No additional per-seat cost. Want to customize the interface? Full control over the codebase.
What’s Next: Moving Beyond Replit
For now, I’m keeping things simple with Replit deployment. It’s fast, reliable, and gets the job done. But the plan is to migrate this over to the client’s Terraform-managed infrastructure stack.
Why? Cost control and complete ownership. Replit is great for rapid development and testing, but for production client systems, having everything running on infrastructure you fully control just makes more sense long-term.
The Bigger Picture
This project wasn’t just about saving money – it was about building something that actually fits the client’s workflow instead of forcing them into a SaaS vendor’s vision of how things should work.
Sometimes the best solution isn’t the shiniest new tool. Sometimes it’s taking the tools you already have and making them work better together.
Building custom solutions isn’t always the answer, but when SaaS costs start dictating your business decisions instead of supporting them, it might be time to get creative with the tools you already own.
Leave a Reply