The monthly report is not a writing problem. It is a filing problem, and a Skill fixes filing.
Every marketer I know loses the same two days a month. You export from GA4, you export from the ESP, you pull the ads numbers, you paste chunks into a chat, you ask for a summary, and you get back something that reads fine and is subtly wrong. A number got rounded. A date range got mismatched. Claude filled a gap with a plausible figure because you gave it a half-populated table and asked it to be helpful. Then you spend the afternoon checking the thing that was supposed to save you the afternoon.
The usual advice is "write a better prompt." That is wrong, or at least it stops working by month three. A prompt is a one-off instruction with no memory of your metric definitions, no fixed report structure, and no rule about what to do when data is missing. A Skill is a folder on disk that carries all three, every time, without you re-explaining. The upgrade is not better wording. It is moving the report from something you ask for to something you file inputs into.
A Claude Skill is a directory with a SKILL.md at the root. The frontmatter has a name and a description. The description is the part that matters most, because it is what Claude reads to decide whether to load the Skill at all. Everything else in the folder is context Claude pulls in when it needs it.
That is genuinely the whole thing. No build step, no platform, no subscription to a workflow tool.
| Saved prompt | Skill | Agent | |
|---|---|---|---|
| Carries your metric definitions | No | Yes | Yes |
| Same structure every month | Only if you paste it | Yes | Yes |
| Handles missing data consistently | No | Yes, if you write the rule | Yes |
| Runs without you present | No | No | Yes |
| Setup cost | Two minutes | An hour, once | A day plus maintenance |
The Skill is the right altitude for a monthly report. Reports are monthly, you want a human eye on them, and the value is consistency rather than autonomy. Do not reach for an agent here. You would be building a scheduler for a thing that happens twelve times a year.
This is the whole artifact. Build it once.
performance-readout/
├── SKILL.md
├── references/
│ ├── report-structure.md # the fixed section order
│ └── metric-definitions.md # what "session" means at YOUR company
└── data/
├── context.md # goals, targets, known events
└── exports/ # you drop this month's CSVs here
Drop it in ~/.claude/skills/ for Claude Code, or zip it and upload it as a Skill in Claude. Either way the folder is yours, it lives in version control if you want, and it does not belong to a vendor.
data/exports/ is the whole workflow. Once a month you put files in a folder. That is the ritual you are replacing "two days of pasting" with.
Copy this. Change the bits in square brackets.
---
name: performance-readout
description: Writes the monthly marketing performance readout from exported
channel data. Use when the user asks for a monthly report, a performance
readout, a channel summary, or drops analytics, ESP, ads, or social exports
into data/exports/. Never estimates a metric that is not in the source files.
---
# Performance Readout
You write the monthly marketing performance readout for [COMPANY].
You are a marketing analyst, not a copywriter. Plain sentences, no adjectives
doing work that numbers should do.
## Before you write anything
1. List every file in `data/exports/`. State the filename, the source, and the
exact date range each file covers.
2. If two files cover different date ranges, STOP and say so. Do not reconcile
them yourself.
3. Read `references/metric-definitions.md`. Use those definitions only. If a
column in an export does not map cleanly to a defined metric, say which
column and ask.
4. Read `data/context.md` for this period's targets and known events.
## The refusal rule
If a number is not present in the source files, write exactly:
[MISSING: REAL NUMBER , <what you need and which export it comes from>]
Do not estimate. Do not interpolate. Do not carry a prior month forward.
Do not compute a derived metric if any input to it is missing. A readout with
four honest gaps is useful. A readout with four invented numbers is a liability.
## The causality rule
You may state what changed. You may not state why it changed unless
`data/context.md` records a cause. Write "organic sessions fell 18%" not
"organic sessions fell 18% due to the algorithm update." If you have a
hypothesis, put it under "Questions for the team" phrased as a question.
## Structure
Follow `references/report-structure.md` exactly. Same section order every
month, so month-over-month diffs are readable.
## Tone
Written for [CMO / founder / the client] who has eight minutes. Lead with
what moved. Bury the flat channels. No preamble, no "in this report we will."
metric-definitions.md is the one people skip, and it is the one that matters. Claude does not know that your team counts a "lead" at form fill and not at MQL, or that you exclude internal traffic by IP and the export already has it stripped. Write it down once.
# Metric definitions
- Session: GA4 default. Do not use "engaged session" unless named explicitly.
- Lead: form fill on /demo or /contact. Newsletter signups are NOT leads.
- Open rate: [ESP] reported figure. Flag it as unreliable post-MPP but report
the raw number, do not adjust it.
- Attribution window: [30-day click, last non-direct]. Any channel comparison
inherits this window. Say so in a footnote.
- "Flat": within 5% month over month. Below that threshold, do not narrate it.
report-structure.md is shorter. A fixed section order, and a note on what belongs in each. Headline movement, channel by channel, what we shipped, what we are watching, questions for the team. The point of freezing it is that you can lay two months side by side and read the difference in ten seconds.
The monthly invocation is boring, which is correct:
Write the [MONTH] performance readout. Exports are in data/exports/.
Before drafting, give me the file inventory and date ranges, and stop
if anything is missing.
Here is where most people leave value on the table. Do not accept the first draft and edit it silently. The gaps Claude flags are the highest-signal output of the whole run. Work the list:
Take every [MISSING: REAL NUMBER] you flagged. For each one, tell me
which system it lives in and the exact export or view I need to pull.
Rank them by how much the readout suffers without them.
Ten minutes of that, and by month three your exports folder is right the first time and the readout comes back clean. The Skill is not really automating the report. It is auditing your reporting inputs, monthly, for free.
I would rather you hit these knowingly than discover them in front of a client.
It will happily merge mismatched date ranges if you let it. The STOP instruction in step 2 is load-bearing. Delete it and you get a beautiful readout comparing 28 days of email against 31 days of paid. Test that rule deliberately: feed it two exports with different ranges and confirm it stops.
It cannot tell you why. The causality rule is there because the failure is so tempting. A model that has read the entire internet will generate a confident reason for any movement, and the reason will sound like something a senior strategist would say. It is a guess with good grammar. Keep causes in context.md, written by a human who was there.
Long CSVs get skimmed. If an export runs to thousands of rows, ask for aggregation before narrative, or pre-aggregate in the source tool. Do not assume every row was read because the summary sounds comprehensive.
Definitions rot. When your team changes what counts as a lead, metric-definitions.md is now lying to you with authority. Put a review of that file in the same recurring calendar slot as the report.
We ship a Performance Readout Skill as one of the four free Claude Skills at /skills/. No email gate, no signup, no drip. Download it, open the SKILL.md, and either use it as is or gut it for parts.
I would still build your own first, honestly. The hour you spend writing metric-definitions.md is the hour where you find out that two people on your team define "lead" differently, and that discovery is worth more than the Skill. But if you just need the monthly report to stop eating two days, take ours and go. It is there for that.
The four free prompts at /free/ cover the adjacent job, turning a finished readout into something a stakeholder actually reads.
If the free Performance Readout Skill covers your situation, use the free Skill and do not buy anything. One channel, one report, one stakeholder, you are done. That is not a downsell, it is the honest answer for most solo marketers.
The paid Full Suite ($349/yr) is for when the report is one node in a system. It carries the Reporting Kit, dashboard specs and the report prompts that feed off the same context vault your other Skills read from, so your metric definitions live in one place instead of five folders that quietly disagree. That matters at three to twenty-five people, where the failure mode is not "the report takes too long" but "our numbers do not match each other." If that is not your problem yet, it is not worth $349 to you yet. Come back when it is.
What we exclude: no done-for-you reporting, no dashboards we build for you, no calls. It is a library you run yourself.
Voice Extractor, Competitive Teardown, SERP-Informed Brief, Performance Readout. Installable Skills, ready to drag into Claude Desktop or Claude Code. No email gate.
Open the Skills page