ad-copy
Skill20 starsChanged 2 months agoMITView on GitHub
Reference for what scripts/check-copy's Meta ad format contract actually flags and why: the three-field structure, Meta's hard character limits, the 125-character "See more" fold, button-label headlines, missing CTAs, and the unqualified claims that get ad accounts suspended. Read this to understand a `format/*` violation on `--format ad` before revising against it, and for the craft of writing toward the contract, not to hand-grade a draft in place of running the script.
10 other projects use a version of this, 2 of them edited.
Adopted by
Most recently taken up by
- aronhy/marketing-skill-hubtheir own version, first seen Nov 8, 2026
- brainbytes-dev/everything-claude-marketingtheir own version, first seen Nov 1, 2026
- m-binimran/marketing-packtheir own version, first seen Oct 15, 2026
- kazuki-0418/agent-skillstheir own version, first seen Sep 29, 2026
- sidchaudhary/gtm-skillstheir own version, first seen Aug 21, 2026
- lombarddaniel14-coder/claude-skillsedited, first seen Aug 16, 2026
Used with
Projects with it also use compliance-checker.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
errsteinSkillcompliance-checker
Check Cowork activity and local audit logs for compliance issues, policy violations, or anomalies. Use when the user asks for a compliance review, audit report, or risk assessment on recent Cowork sessions.
Also in 3 projects that use this
Other versions10 projects use a version of this.
Word for word · 0
None found.
Edited · 2
- robpalmer99/claude-code-copywriting-skills★ 2612% same
- lombarddaniel14-coder/claude-skills★ 012% same
Wrote their own version · 8
- aronhy/marketing-skill-hub★ 186same name
- brainbytes-dev/everything-claude-marketing★ 9same name
- kazuki-0418/agent-skills★ 2same name
- BlackBlazeXXX/claude-skills-marketing★ 1same name
- m-binimran/marketing-pack★ 1same name
- sidchaudhary/gtm-skills★ 1same name
- nawazxz/20-claude-skills-for-business★ 0same name
- xnomad-dev/claude-skills★ 0same name
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository6 other files it gives its agents.
- direct-response-copySkill
- hedgehog-copywriting-loopSkill
- landing-page-copySkill
- prose-qualitySkill
- tells-detectorSkill
- tweet-copySkill
The file
We split this skill into the rules it gives an agent
8 rules. 0 are common, 7 are distinctive, and 1 is very specific to this project.
0
Common
Most of the 10 edited versions we read keep these.
7
Distinctive
This author's own choices. Worth a look.
1
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 227
Keep the curiosity fragmented and open-ended.
- Distinctive: line 238
Open loops: create an information gap that only a click closes.
- Distinctive: line 301
Every claim in an ad needs support, and short-form forces that support to be compressed.
- Distinctive: line 309
Visual proof: Before and after, screenshots, a demo.
- Distinctive: line 385
Run the gate on each variation file.
- Distinctive: line 389
Test in order of impact: hooks first (the same ad body with five to ten different openings), then images and thumbnails, then caption …
- Very specific: line 408
Structural tells: Every sentence the same length, every bullet opening the same way, grammar so clean it reads as written rather than …
- Distinctive: line 417
Read the ad aloud before delivering it.
“Common” is measured: kept by at least 6 in 10 of the 10 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
Ad copy
Adapted from the
ad-copyskill by Rob Palmer (https://github.com/robpalmer99/claude-code-copywriting-skills), used under CC BY 4.0.
scripts/check-copy/rules/formats/ad.mjs is the actual gate for this
format, and this skill explains what it checks and why. Invoke it as:
node scripts/check-copy/index.mjs <file> --format adThe universal contracts (tells-detector's tells/* rules and
prose-quality's prose/* rules) always run underneath. The ad module
only ever adds to them. No copy type is licensed to sound more like an
LLM because of where it ships, so an ad still has to clear the same
banned-vocabulary and readability bar as an essay. Never substitute a
manual read of this list for actually running the script; the whole
point of this core is that the check is mechanical.
The input shape the gate expects
A draft names its fields as markdown sections:
## Primary text
...
## Headline
...
## Description
...The section lookup accepts aliases, so ## Body or ## Ad copy
resolves to primary text, ## Title to headline, and
## Link description to description. A draft with no sections at all
is read as primary text alone, which means a one-field hook brainstorm
still gets checked rather than passing silently. As soon as the draft
has any sections, though, one of them has to be primary text.
What the gate checks
format/missing-field(error). The draft has sections but none of them is primary text. Primary text carries the sell; a headline and description with nothing above the creative is not an ad.format/primary-text-length(error). Primary text over Meta's 2200-character maximum. The platform rejects past this, so it is a hard defect rather than a style opinion.format/weak-hook(warning). Primary text runs past the 125-character "See more" fold mid-thought. The rule only fires when the visible slice fails to end cleanly: it passes if the first 125 characters close on.,!,?, or:, or if a line break falls inside them. A hook cut off mid-sentence with no open loop shows the reader a truncated fragment, and the reader scrolls.format/missing-cta(error). No call to action in the primary text. The check looks for an imperative verb (click, tap, get, grab, start, try, book, claim, download, watch, see, join, order, shop, learn), or a friction-reducing offer word in the description (free, no credit card, instant). An ad with neither is a post.format/headline-lengthfires twice over. Past Meta's 40-character maximum it is an error, because the platform rejects the ad. Past 27 characters it is a warning, because mobile truncates around there and the tail goes unread. Display truncation is a tradeoff a writer can knowingly accept; platform rejection is not.format/weak-headline(error). The headline is a button label rather than a second hook. The list is exact: "learn more", "click here", "check this out", "find out more", "read more", "see more", "shop now", "sign up", "get started", "discover more", "act now". Meta already renders a CTA button; spending the headline slot repeating it throws away the ad's second-best piece of real estate.format/description-length(error). Description over Meta's 30-character maximum. Platform rejection again.format/unqualified-claim(error, one per match). Guaranteed outcomes ("guaranteed you'll", "guarantee to"), absolute risk-free promises ("100% risk-free", "completely guaranteed"), "zero risk", "results are typical", make-money-fast, get-rich-quick, "no effort required", cure claims ("cures your"), and specific weight-loss claims ("lose 30 lbs"). These are errors rather than warnings for a blunt commercial reason: ad networks suspend accounts over them. A rejected ad costs an afternoon. A suspended ad account costs the channel, and Meta's appeal process is slow and frequently unsuccessful. The fix is to qualify the claim (name the study, name the timeframe, name the person it happened to) or cut it. This check runs across the whole draft, including the headline and the description.format/missing-proof(warning). Primary text over 200 characters with no digit anywhere in it and no attribution verb (said, says, told, according to). A number, a named source, or a timeframe all satisfy it. Past 200 characters the ad has stopped being a hook and started making an argument, and an argument with no proof reads as an assertion.
The three fields and what each one does
Meta renders three text fields around the creative, and each has a different job.
Primary text sits above the creative, capped at 2200 characters, with roughly the first 125 visible before "See more". This is the main sell. Treat those first 125 characters as a headline in their own right.
Headline sits below the creative, capped at 40 characters, with mobile truncating around 27. Use it for a second hook carrying a specific benefit. Compare "Learn more" against "The 7-second morning fix", "Why diets fail after 40", or "23 lbs in 8 weeks". The last three each promise something particular and open a question.
Description sits below the headline, capped at 30 characters, and is often hidden entirely on mobile, so load-bearing information does not belong in it. Use it for friction reduction: "Free shipping", "No credit card needed", "2-minute read".
Placement changes what survives. In Feed the primary text shows with 125 visible and the headline shows. In Stories and Reels the primary text is truncated heavily and the headline may not appear at all. In the right column the primary text is hidden and only a truncated headline shows. Write so the ad still works when the fields you cannot count on disappear.
Structuring primary text for the fold
For most impressions the first 125 characters are the entire ad. What follows is read only by people who chose to expand, and that expansion click is itself a micro-conversion: anyone who taps "See more" is already engaged.
[Hook: first 125 characters. Land a complete thought or an open loop.]
<- the "See more" break
[Expand: agitate the problem, tease the mechanism, drop proof.]
[CTA: name the next step.]The gate's format/weak-hook warning encodes the failure mode. A
sentence sliced through its middle at character 125 gives the reader a
fragment with no reason to expand. Two ways to satisfy it: end a
sentence before the fold, or put a line break inside the first 125
characters so the visible portion reads as a deliberate unit. Line
breaks also buy white space in feed, which helps readability on a
phone. One or two emoji can break the visual pattern; more than that
reads as noise.
Schwartz's five levels of awareness
Eugene Schwartz's model decides the headline, the copy length, the angle, and where the click should land. The rule underneath is that the less the reader already knows, the longer and more indirect the copy has to be.
| Level | Lead with | Length | Send to |
| Unaware | Identity or emotion, not the problem | Long, educational | Advertorial |
| Problem-aware | Name the pain vividly, tease a mechanism | Medium-long | Long-form sales page or advertorial |
| Solution-aware | Differentiate your mechanism | Medium | Sales page or long product page |
| Product-aware | Handle objections, add proof | Short-medium | Product page |
| Most-aware | Lead with the deal | Short | Checkout or offer page |
An unaware reader has no idea a problem exists, so an ad that opens with the product is answering a question they have not asked. A most-aware reader already knows the product and is waiting on a reason to act now, so an ad that opens with education wastes their patience. Both failures look identical in the report (a clean pass) and different in the results, which is why the gate cannot catch them and you have to.
Funnel position and the sell-the-click decision
Funnel position is a separate axis from awareness. Cold traffic knows nothing about you, so lead with problem or curiosity and expect to educate. Warm traffic has seen you before, so go more direct and lean on the mechanism. Retargeting has already visited the page, so handle objections, bring social proof, and add urgency.
The larger strategic call is what the ad itself is for.
Sell the click. A short caption, a curiosity-driven image or video, minimal information revealed. The ad's only job is the click; the page it lands on does the selling. Best for unaware and problem-aware audiences, products that need explaining, and high-ticket offers.
Sell the solution. A longer video with education, visual demos, and proof. The ad does most of the selling and the page only has to close. Best for solution-aware audiences and up, simple or visual products, and lower price points.
One rule connects the two: showing the product in the ad makes the viewer product-aware. Sending a product-aware viewer to a page written for someone who has never heard of the product wastes the awareness you just created. Send them to a product or offer page instead. Large advertisers commonly run both strategies at once against different audiences.
Where the click lands is a separate contract with its own gate. See
landing-page-copy for short-form pages and direct-response-copy for
long-form sales pages.
Hooks
The hook is the biggest single lever in ad performance, which is why it is also the thing to test most.
| Type | Shape | Use when |
| Curiosity | "There's a reason your doctor won't mention this" | Cold, unaware |
| Contrarian | "Everything you've been told about X is wrong" | Problem-aware, skeptical |
| Social proof | "Over 47,000 women have tried this 30-second trick" | Solution-aware and up |
| Story | "Last March I was 40 lbs overweight and my doctor said" | Cold, emotional markets |
| Demographic callout | "Attention men over 50 who..." | Cold, tightly targeted |
| Result | "I lost 23 lbs in 8 weeks without giving up pizza" | Warm, retargeting |
| Pattern interrupt | "Stop scrolling. This actually matters." | Cold, saturated markets |
| Fascinating fact | "Your liver processes 500+ chemicals before breakfast" | Unaware, education-first |
Hook rules:
- The first line of text (or the first three seconds of video) has to arrest attention on its own.
- Keep the curiosity fragmented and open-ended. A complete fascination closes the loop and removes the reason to click.
- Be specific. "47,312 women" outperforms "thousands of women" because the odd number reads as counted rather than claimed.
- Hint at what the reader will discover without revealing it.
- Say what it is not to intensify what it is. Rule out a diet, then a pill, then exercise, and the reader leans in on what is left.
- A winning hook can run for months. Keep testing new ones against it.
The curiosity toolbox
Open loops create an information gap that only a click closes. "I tested 47 headlines. One pattern beat everything else by 3x." The reader now wants to know which pattern.
Tangible curiosity makes the gap concrete. "Discover the secret to weight loss" is vague enough to ignore. "Discover the 7-second morning trick that targets the fat cells your body forgot about" names a duration, a time of day, and a mechanism, so there is something specific to be curious about.
Bucket brigades are transitions that pull the reader forward: "But here's the thing...", "Here's what I discovered...", "This is where it gets interesting...", "Wait, it gets better...", "Now here's what nobody tells you...". Use two or three per ad. Ending every paragraph on a bridge gets tiresome fast.
Intrigue intensifiers
- Say what it is not. "It isn't a diet. It isn't a supplement. It isn't exercise. It isn't willpower."
- Say where it is not. "You won't find it in any store, any pharmacy, any website."
- Drop a specific hint. "It's 150 million years old." "It's smaller than a nickel." "It grows only above 12,000 feet in the Andes."
- Anchor to authority. A named institution, a named study, a named
publication. Vague attribution of the "some researchers reckon" kind
is banned outright by
tells/banned-phrase, so name the source or drop the claim.
The mechanism itself is what makes the solution different from everything the reader already tried. Strong mechanisms are credible (backed by the most authoritative source available), rare or hard to find, small and specific (a "7-second trick" beats a "20-minute routine"), and low-effort to apply.
The WHY / WHAT / HOW structure
A fill-in-the-blank spine for primary text, from Alen Sultanic.
WHY (the problem). Open with curiosity or a contrarian claim, name the problem, agitate it.
"Why does ____ matter more than ____ after ?" "Experts are calling it the ''. But that's not what it is." "It hits from all sides: ____ stress, ____ stress, ____ stress."
WHAT (the mechanism). Pivot to how the solution works, and tease it without giving it away.
"There's another way, one that focuses on ____ instead of ____." "Using this approach, 12,000 people have ____ in under ____."
HOW (the product and CTA). Reveal exactly enough to make the click the obvious next move.
"Tap below to see how ____ works for ____."
Note that the CTA is what satisfies format/missing-cta. Write it as
a benefit the reader gets by clicking, and use an imperative verb so
the gate can see it.
Proof, credibility, and the "So what?" chain
Every claim in an ad needs support, and short-form forces that support to be compressed. What counts:
- Specific numbers. "47,312 customers" over "thousands of customers".
- Named results. "Sarah lost 23 lbs" over "our customers love it".
- Timeframes. "in 8 weeks" over "fast results".
- Authority. A named publication, institution, or study.
- Visual proof. Before and after, screenshots, a demo.
- Social proof. User counts, review ratings, waitlist numbers.
format/missing-proof is a crude proxy for all of this: it only looks
for a digit or an attribution verb in primary text over 200 characters.
Passing that check is not the same as having proof. It is the floor.
The "So what?" chain converts a feature into the line the ad actually runs. Ask "so what?" until you hit something emotional or financial.
Feature: fast database. So what? Queries return in milliseconds. So what? Users stop bouncing and revenue stops leaking. So what? You stop waking up at 3am worrying about churn.
Three levels down is where the copy lives. Write "close your laptop at 5pm instead of 9pm" rather than "saves 4 hours a week".
UGC and video scripts
Two short-form video shapes belong in this format. Long-form video
sales letters are a different contract; see direct-response-copy.
Short talking head (15 to 60 seconds). The goal is to look and sound like a real person filmed it on a phone.
[HOOK 0-3s] Pattern interrupt, question, or bold claim.
VISUAL: talking to camera, casual setting.
[PROBLEM 3-10s] Name the pain specifically enough that they nod.
VISUAL: relatable scenario.
[MECHANISM 10-25s] Tease the discovery, explain just enough.
VISUAL: showing or demonstrating the product.
[RESULT 25-40s] A specific transformation with numbers.
VISUAL: the result, genuine reaction.
[CTA 40-60s] Natural close that sounds like a recommendation.
VISUAL: direct to camera.Story-style video (60 to 120 seconds). A personal narrative arc, strongest in emotional markets. Open in the middle of the struggle ("Six months ago I couldn't look at myself in the mirror"), move through failed attempts, then the turning point, then a transformation with real numbers and a real timeline, then close on a recommendation rather than a pitch.
Voice rules for both: first person and conversational, occasional
verbal filler ("honestly", "I mean") for authenticity, concrete details
over vague claims, and a CTA that sounds like advice to a friend. Mark
on-screen action with [VISUAL] notes.
The authenticity test before delivering any script: would a real person say this out loud, on camera, to their own phone? If it sounds like a copywriter wrote it, rewrite it. A UGC script should read slightly imperfect, because that is what makes it believable.
Testing and variation
Any ad request should produce three to five variations, each labelled with its angle, because the point of an ad is to find out which angle wins rather than to guess correctly the first time. The default set:
## Variation 1: curiosity hook
### Primary text
### Headline
### Description
## Variation 2: contrarian hook
...
## Variation 3: social proof hook
...Run the gate on each variation file. A variation that fails on a headline length or an unqualified claim is not a variation, it is a rejected ad.
Test in order of impact: hooks first (the same ad body with five to ten different openings), then images and thumbnails, then caption length (short click-sellers against long story-sellers), then video length, then the copy angle. The pattern that works: a control creative runs continuously while new hooks are tested against it, and a hook that wins becomes the new control.
Voice and anti-patterns
The universal contracts already ban the AI vocabulary, so read
tells-detector for that list. The ad-specific additions:
Ad clichés to cut. "Click the link in my bio", "you won't believe", "take your X to the next level", "are you ready to".
Hedging verbs. Clayton Makepeace's rule: can, could, should, might,
may, ought to. Say what the product will do. Stacking two of them fires
tells/hedge-stack as an error anyway.
Structural tells. Every sentence the same length, every bullet
opening the same way, grammar so clean it reads as written rather than
spoken, and too many headings for the length. prose/low-burstiness
catches the first of these mechanically.
Readability. Aim low. Short sentences, plain words. The universal contract's grade ceiling is 10; good ad copy usually lands well under it.
Read the ad aloud before delivering it. Makepeace's tingle factor: the chain from the first line to the click breaks wherever the reader gets bored, stops believing you, or loses the thread. Where the reading goes flat is where you rewrite.
Last pass before delivery, checking things the gate cannot see:
- Does the first line stop the scroll?
- Is every claim attached to a specific number or proof point?
- Does it sound like a person talking?
- Is there an open loop pulling toward the click?
- Is it about the reader's transformation or about your product?
- Does the rhythm alternate between punchy and breathing room?
- Is the CTA benefit-driven rather than a bare command?
When a violation looks wrong
The length rules and format/weak-headline are close to
unarguable, since they encode what the platform does. The judgment
calls sit elsewhere.
format/missing-cta matches on a verb list, so an ad whose call to
action is phrased without one of those verbs ("Your seat is waiting")
will fire it. That is usually the rule being right: an ad that never
names the next step in plain words is asking the reader to infer it.
format/unqualified-claim fires on a substantiated claim as readily as
on a made-up one, because the regex cannot see your evidence. A real
clinical result still gets flagged, and it still needs qualifying
before it ships, so the fix is to add the qualification rather than to
argue with the flag.
Where a flag genuinely does not fit the brief (a B2B ad in a register
that the general-audience reading-ease floor penalizes, or a regulated
category whose required disclaimer language trips a prose rule), that
is a signal the brief's register does not match this core's default
contract. Raise it to the user per hedgehog-copywriting-loop's rule
on extending the contract, rather than working around the flag
silently.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

