AS Toolkit · Codex skill

Client Dashboard

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.
Skill v1.8 · 2026-09-28 · CHANGE LOG
Cadence14 days, 30 days, or custom
ViewsCadence · 30d · 60d · Lifetime
Delivered byWeb link + email
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.

Show the prompt
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.

Show the prompt
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.

Show the prompt
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.

Show the prompt
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.

Show the prompt
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.

Show the prompt
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.

Show the prompt
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.

⇩ Install once, ~3 minutes

⬇ client-dashboard-skill.zip

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

  1. 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.
  2. 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.
  3. 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.
  4. 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.
  5. Your contact card, first time only. Your name, email and phone are saved on your computer and shown on every dashboard you publish.
  6. 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.
  7. "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.
  8. 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.
  9. 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.
  10. 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.

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

Δ 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.
MCP connections guide·Change log·Questions? Slack Jeremy