The Client Portal That Makes My Agency Look Like a SaaS
A branded client portal with Google sign-in, live campaign data, and 30-minute syncs, bolted onto an existing site.
What you'll build
A branded client portal bolted onto your existing agency website. Clients hit "Sign in with Google" and land on their own dashboard - live campaign data, billing, filters - synced every 30 minutes. Admins see every client; each client sees only their own data. I built this for AI Waterside in a couple of hours with Claude Code, and it replaced the messy stream of Google Docs, Sheets, screenshots, and meeting notes we used to send. It's the difference between looking like a freelancer and looking like a real software company - and it's the portal I now show on every sales call.
What you'll need
- Claude Code
- Supabase - auth + database, free tier
- Netlify - hosting + serverless functions (where your site probably already lives)
- A React site to build on top of (AI Waterside was already built with Claude, so adding the portal was just one extra step)
- API access to wherever your client data lives - for us that's Instantly, the cold email platform we run outreach on
Step 1: Add the portal and auth to your existing site
Start with the foundation: a new "Client Portal" section on your site with Google sign-in through Supabase auth. Two roles matter - admins (you and your team) land in an admin console where you can see all clients and onboard new ones; clients get routed to their own branded dashboard. From the admin console, hit edit on a client, click invite user, pick the role (team member or client), add their email, and they have authentication rights to enter.
Step 2: Wire your data sources into Supabase
Supabase is where everything lands. For Synaptic Recall (a medical-student education platform we run influencer outreach for), the two sources were:
- Instantly API - all the campaign data. I could already query Claude things like this, I just had no place to see it clearly:
Hey, how many emails did we send out today? Which emails are positive?
- The expenses Google Sheet - fine for tracking, ugly for showing a client. Connected it to Claude so it flows into the dashboard too.
Instantly's UI is nice, but it gets messy fast once you have multiple campaigns running. This fixes that.
Step 3: Sync it every 30 minutes
Netlify serverless functions push fresh data from Instantly and the Sheet through Supabase into the dashboard every 30 minutes. Clients log in and the numbers are live - no more "let me send you an update" messages.
Step 4: Build the client-facing tabs by iterating with Claude
The entire dashboard is built by Claude. All I'm doing is taking what I think would be useful, putting it into words, and reiterating. The Synaptic Recall portal ended up with three tabs:
- Influencers - emails sent toward influencers (~900 sent, ~48 positive replies), who we closed, filterable by micro/mid tier, which campaigns are live right now, response rates per campaign (which tells you which email copy is actually working), who's still in progress (11 threads being wrapped up - these run 5-20 emails deep before a contract is signed), and clickable Instagram handles so anyone can verify the influencer or check the post.
- Billing - money in from the client, spend, remaining budget, influencer payouts - broken down in a pie chart with a full ledger at the bottom.
- Overview - platform-level results (still syncing; waiting on the client's signup metrics so we can see which lever - influencers, ads, campaigns - actually drives users).
The filter buttons, the logo touches, the colorways, the live-campaign indicator - those were all just reiterations I gave Claude and it enacted them.
Step 5: Lock each client to their own data
Row-level security in Supabase means a client literally cannot see another client's data. Pair that with multi-tenant branding - every client gets their own colors and logo the moment they log in - and each client's portal feels like it was built just for them.
Step 6: Onboard the next client in 30 seconds
It's multi-client by design. New client: type the name, pick a brand color, drop a logo. Then whatever they care about, you just ask:
Build out a tab for this, and streamline this information through whatever - a Google Doc, a Google Sheet, even screenshots.
If it's a clinic you built a voice agent for, give them a tab for calls answered, cost, and what's flowing through the agent. Whatever data they want to see, create an automation that flows it into their dashboard.
That's it. One click for the client, live data on sign-in, and both sides stop drowning in update messages. Good luck and happy building.
Resources
- Supabase - https://supabase.com (auth + database, free tier)
- Netlify - https://netlify.com (hosting + serverless functions)
- Instantly - https://instantly.ai (the cold email platform feeding the dashboard)
- Wispr Flow - the voice-to-text I use to talk to Claude, 1 month free: https://wisprflow.ai/r?AUSTIN16480
Some links in this guide are affiliate links. They cost you nothing and support the free guides.