A lightweight performance snapshot for each client. It's one web page they can open on their phone, and it
refreshes every 14 or 30 days. Two days before a refresh it checks in with you on Slack (or email) so you can update
"What we're working on" and add a personal note, then it emails the client the link with a few verified wins.
Type $client-dashboard in Codex~20 min first setupThen runs on its own
Top 3 improvements in this version
Slack check-in before each refresh: two days ahead, it posts in the client's Slack channel so you can reply with 1–3 "What we're working on" items. Email, both, or no reminder are also options.
A personal note on the dashboard: wrap a line in percent signs in your reply (%like this%) and it appears as "NOTE from [your first name]" under the date line. No note? A friendly default shows instead.
Clearer prompts and scheduling: plain-language setup questions, a primary client email or "Do not email client", four publish choices, and the reminder scheduled alongside the dashboard run.
Check-inSlack, email, both or none · 2 days before
For you
Reporting on a schedule without building a deck or wrangling Looker each time.
Numbers come straight from Meta and Google Ads, then get reconciled so charts and totals match.
It catches a new or replaced ad account and keeps history from both accounts, without double-counting.
A heads-up two days before each refresh, in the client's Slack channel or your inbox. Reply with what you're working on and an optional note, or ignore it and last cycle's cards stay.
It won't send the email if anything is off: a failed data pull, a failed build, or a duplicate send.
For the client
A clean dark-theme page that loads fast on a phone.
Wins first, then Meta and Google Ads sections with a trend chart and a breakdown.
A dropdown to switch between the latest period, 30 days, 60 days, and everything since Drive Social started.
"What we're working on" cards with the date they were last updated, plus your name, email and phone at the top.
A short "NOTE from [your first name]" under the date line: your personal note for this report, or a friendly default.
⚙ What it needs
For each ad platform it tries the direct connection first, then Marketing Milk, then the platform in a browser. It never fills a gap with zeros or an old snapshot.
Meta Ads MCPRequired for Meta clients
Meta's official connector. It pulls spend, clicks, reach and results, and finds new or replaced ad accounts. The dashboard only reads data and never changes anything in Ads Manager.
Help me connect Meta's official Ads MCP server to Codex. The server URL is https://mcp.facebook.com/ads. Add it as a remote MCP server named meta-ads, start the sign-in so I can log in with the Facebook account that has access to my client ad accounts, then confirm by listing the ad accounts you can see. This is a read-only check, so don't change anything in any ad account.
Google Ads MCPOnly for Google Ads clients
Google's official, read-only connector for Google Ads reporting. Google Cloud account setup is required (for OAuth 2.0, the API developer token and more).
Having Codex or Cowork walk you through it is fairly straightforward, depending on your comfort level. Ask for help if you get stuck.
Help me set up Google's official Google Ads MCP server (https://github.com/googleads/google-ads-mcp) in Codex on this computer. Walk me through what I need step by step (Google Ads API developer token, OAuth credentials, the manager account ID), keep all credentials outside any project folder, and confirm by listing the Google Ads accounts I can access. It should be read-only.
Marketing MilkBackup source + offline results
Used when a platform connection can't supply the data. It can also add uploaded offline results (CRM, shop bookings) when they're verified. Drive Social's connector, so ask Jeremy or #analytics-request for the server details.
Help me connect Drive Social's Marketing Milk MCP connector to Codex. I'll paste the server URL I got from my team. Add it as a remote MCP server named marketing-milk, complete the sign-in, and confirm by listing the businesses I can see. Read-only check only.
SlackOptional · for the Slack check-in
Finds the client's Slack channel during setup and posts the reminder two days before each refresh, then reads your reply for work items and your note. Skip it and you can still pick an email reminder or none.
Help me connect Slack to Codex so skills can find a client's Slack channel, post a message there, and read replies in that thread. Walk me through connecting it (ChatGPT Settings → Apps / Connectors → Slack), signed in to the Drive Social workspace, then confirm by listing three channels I'm a member of. Don't post anything.
NetlifyRequired to publish
Hosts each client's dashboard at its own link. Uses your Netlify account.
Help me connect Netlify to Codex so skills can deploy static sites to my Netlify account. Add Netlify's official MCP server (npx -y @netlify/mcp) to my Codex MCP configuration, sign me in (Netlify CLI login or a personal access token stored outside any project folder), then confirm by listing my Netlify team and sites. Don't create or deploy anything yet.
GmailRequired for the client email
Sends the update email from your account and checks your sent mail first so the same report is never sent twice. Also sends the email reminder if you choose one.
Help me connect my work Gmail so Codex can search my sent mail and send client report emails from my account. Walk me through connecting it (ChatGPT Settings → Apps / Connectors → Gmail) and confirm by showing the subject lines of my three most recent sent emails. Don't send anything.
Node.jsRequired
Builds the dashboard page (node scripts/build.mjs). Any current LTS version works on Mac or Windows.
Check whether Node.js (current LTS) is installed on this computer and on my PATH. If it isn't, tell me the simplest way to install it for my operating system and walk me through it.
Codex scheduled tasksBuilt into Codex
Runs the refresh and the check-in reminder on the schedule you pick. The skill sets both up for you. Find them under Scheduled in Codex, where you can pause, stop or edit them.
Version 1.8. Open a new Codex chat, attach the zip, and paste:
Attached is client-dashboard-skill.zip, which contains a Codex skill called client-dashboard (v1.8). Please:
1. Back up my current client-dashboard skill if I have one.
2. Install the attached version into my Codex skills folder (client-dashboard/ with its SKILL.md, agents/, assets/ and references/ exactly as in the zip).
3. Confirm it's installed and show me the name and description from its SKILL.md.
4. Check that Node.js is installed and tell me which of these connections I already have: Meta Ads, Google Ads, Marketing Milk, Netlify, Gmail, Slack.
Do not rewrite or summarize the skill files. Install them as-is.
Then type $ in a new chat and client-dashboard should be listed. Already set up clients on v1.0? The next run asks only the new questions (Slack channel, reminder and client email choice) once.
▶ How to run it
First setup for a client
Open a Codex chat, ideally inside the client's Codex project folder so everything for that client stays together, then type $client-dashboard and name the client.
Pick the cadence. It asks how often the client should get an update:
every 2 weeks (14-day view), every 30 days, or Other with a number of days and a first send date.
This is saved for the client, so it won't ask again.
Confirm the client's Slack channel. It searches Slack for the client's channel and asks
"Is this the correct dedicated client channel?" It never guesses. If Slack isn't connected or no channel turns up,
fix it and choose Retry, or choose Ignore Slack to move on.
Pick your check-in reminder."How would you like to be reminded two days before the client dashboard is updated and sent?"Setup Slack Only, Setup Email Only, Both or No reminders.
A Slack reminder lets you reply with work items and a personal note before the update goes out. An email reminder goes to you, not the client.
It stays off until the recurring schedule is approved.
Your contact card, first time only. Your name, email and phone are saved on your computer and
shown on every dashboard you publish.
Who gets the email."What primary client email address should receive the dashboard update?" Give one address, or choose
Do not email client if you only want the web page updated. Then add anyone else who should get it, or leave that blank.
You're copied by default.
"What we're working on." Tell it the current projects in your own words, like a video shoot,
a new offer or an audience refresh. It turns them into at least three short cards. No current projects? It uses
standard cards instead, such as "Continuing to monitor Meta campaign and ad performance for ongoing efficiency and account health."
You can also give it a personal note for the top of the page.
It pulls the data, builds a local draft, and asks you to check accuracy and presentation.
Nothing is published or emailed until you approve.
Finish your edits before you publish. Each push to Netlify uses deploy credits
and API calls, so make every change to the local draft first. Once it's final, tell Codex to publish it via Netlify.
Approve and choose what happens. It shows the link, the exact To and Cc addresses and the next delivery date, then asks:
Publish, send now, and schedule · Publish and send now only · Publish and schedule only · Keep as draft.
If you scheduled it, the check-in reminder is scheduled with it and you'll see both under Scheduled in Codex.
Slack test message. With a Slack reminder, it posts one setup message in the channel so you can see it works:
Client Dashboard setup - reporting on a 14-day cadence. A reminder will be sent here 2 days before data pull and client contact, so that you can add any updates or note to the client to be included.
Next scheduled dashboard update is on [date and time]. Check Codex 'Scheduled' to start, stop, or edit the schedule or content.
The check-in, two days before a refresh
For 30-day and custom cadences you get a check-in before every refresh. For 2-week clients it's every other refresh (every 28 days).
It posts once and doesn't chase you:
@you [Client] dashboard update is on [date and time]. Do you want to update "What we're working on"?
Reply in this thread with 1–3 short action items. If you don't reply, the previous update or placeholder information will remain.
To add a personal note for the client, put it between two percent signs, like this: %Hope you've been well, let me know if you have any questions.% Then send your reply.
Reply with 1–3 short items in the thread. They replace the "What we're working on" cards, dated that day.
Add a note with %...%. It shows on the dashboard as "NOTE from [your first name]" for this report only (up to 600 characters). You can send a note alone, items alone, or both.
No reply? Last cycle's cards and their date stay, and the note goes back to the default: "Hope you've been well, let me know if you have any questions."
Only replies from you (or the client's saved Account Strategist) count. Anything unclear, it asks you before changing the page.
Every refresh after that
The scheduled run reads your check-in reply, pulls fresh numbers, rebuilds, publishes, confirms the page is live, checks you haven't already sent
this report, and emails the client. The email opens with the dashboard link, lists the reporting period and a few source-backed highlights,
includes "What we're working on" only when you updated it, and ends with a short note that the update is automated.
If any step fails, it doesn't send, and it tells you which step failed so you can fix it.
i Good to know
Client-facing tone. Wins come first, and fixes get short, constructive wording. Measurement limits are stated plainly, for example when a client has no CRM.
Account went down? If an ad account is verified down with no replacement, the page shows a clear notice with your contact details. If a new account is already live, it shows a quiet note instead.
Periods are exact: 30 days means 30 complete days, not a calendar month.
Private stays private. Recipient lists, account IDs, Slack channel IDs and send history are kept outside the published page.
Your note stays on the page. The personal note shows on the dashboard, not in the client email, unless you ask for it there.
Not indexed. Each dashboard carries noindex tags, so search engines skip it. Anyone with the link can open it; Netlify password protection is available if a client needs it.
Δ Change log what changed and why
v1.8 "Check in before it sends" 2026-09-28
Why. Automated refreshes kept the numbers current, but "What we're working on" went stale and there was no easy way to add a
personal touch before a client saw the update. v1.8 checks in with you two days before each refresh, takes your reply straight from Slack,
and tightens the setup questions and scheduling so a teammate can run it without guessing.
Added
Slack channel discovery at setup. Finds the client's channel, asks you to confirm the exact one, and offers Retry or Ignore Slack. It never guesses a channel.
Check-in reminder, two days before a refresh. Setup Slack Only, Setup Email Only, Both, or No reminders. Every refresh for 30-day and custom clients; every other refresh (28 days) for 2-week clients. One post, no chasers, plus a one-time Slack test message once the schedule is live.
Reply intake. 1–3 items in the thread update "What we're working on"; text between %...% becomes that report's personal note.
"NOTE from [first name]" on the dashboard, under the date line, with a friendly default when there's no new note. A note is never reused on a later report.
Last-updated date on "What we're working on." It carries forward when the cards don't change, so clients see how current they are.
Scheduled email template with a fixed first line and link, highlights, and a small automation disclaimer at the bottom.
Changed
Client email question: one primary client address or "Do not email client", then optional extra recipients. You're copied by default.
Publish prompt: four clear choices (publish + send + schedule, publish + send, publish + schedule, keep as draft) with the To/Cc and next delivery date shown first.
Scheduling: the dashboard run and its reminder are set up together in Codex Scheduled, and it reads back the actual next dates.
Attribution context: a closing note explains that top-level platform numbers don't include Marketing Milk or offline CRM/VOIP/POS results, which are reviewed in meetings. It hides when verified offline results are included.
Your contact profile can live at a synced path (CLIENT_DASHBOARD_PROFILE) so it follows you across devices.
Starter template now ships a synthetic sample report (data/synthetic-example.json) with no real client data.
v1.0 First release 2026-09-24
Cadence views (14 / 30 / custom, 30d, 60d, lifetime), Meta + Google Ads with Marketing Milk and browser fallbacks, account-transition handling, local draft review, Netlify publish, and a duplicate-safe client email.