Most teams already have a list of ad angles somewhere — the bottom of a deck, a Slack thread from March, the head of whoever briefed the last shoot. This guide turns that list into a library: a table you can search, sort by result, and hand to a new hire.
A list is not a library
A list in someone's notes fails three tests, and all three matter six months later.
You can't search it. Somebody remembers testing "thin case, small wrist" and thinks it did well. Nobody can say which deck it was in, so the team re-invents it in a meeting, from memory.
You can't sort it by result. A list records ideas, not outcomes. Ask which angle performed and you get an anecdote, weighted toward whatever ran most recently.
It dies when the file dies. People leave, drives get tidied, folders get archived. An appeal outlives the campaign that made it — but not if it lives in the campaign folder.
For the definitions underneath this, start with what an ad appeal is.
The nine columns
Nine survives contact with real work. Fewer and you can't reconstruct a decision; more and nobody fills it in. Running example: a watch.
| Column | What goes in it | The mistake people make |
|---|---|---|
| Appeal ID | A permanent code, S01 or S01-1. The table's only key | The row number. Sort the sheet and every reference breaks |
| Root appeal | The angle as a noun phrase: "material · detail" | Writing the headline instead. That is copy, not a name |
| Primary type | How it's carried: copy, image, both | Marking everything "both." Pick the half that decides the test |
| Suggested image | What the image must show to land: "dial at 45°, light across the nacre" | Adjectives. If a photographer can't shoot it, it's empty |
| Test method | What you compare and how you call it: "close-up vs worn shot" | Leaving the win condition unwritten until the numbers land |
| Category | The axis: function / emotion / price / trust / occasion | Twelve of them. Twelve groups group nothing |
| What changed | For a derived row, its one difference from the parent | Leaving it blank. Nobody can later say what was tested |
| Note | Result, verdict, or why it's parked — always dated | Scratchpad use. Three quarters in one cell is unreadable |
| Parent appeal ID | The parent's code. Empty for roots | Writing the parent's name. Names get rewritten; codes don't |
The two that go missing first are Suggested image and What changed — the two that explain why something won. Without them a row is a name and a number.
The coding scheme
Codes look like bookkeeping. They're the only thing that survives an export.
- Roots get
S01,S02,S03. Two digits is plenty; no product yields ninety-nine appeals. - Derived appeals get
S01-1,S01-2— parent code, separator, sequence.S01aworks too; don't mix the two. - Codes are permanent and never reused. Retire an appeal and the number retires with it. Reissue
S03and last spring's report means something else than today's. - Never encode the campaign or the date.
S01-2508-METAfeels tidy for a week. Then the appeal runs on another channel, you mint a second code, and the two results never add up. Channel and date are columns, not identity.
Because the code carries the parent relationship inside the string, the tree survives a CSV round-trip: export, edit, re-import, and S01-2 still knows it belongs to S01. A hierarchy stored only as a link inside a tool evaporates on export.
| Appeal ID | Root appeal | Parent | What changed |
|---|---|---|---|
S01 | Material · detail | ||
S01-1 | Material proof | S01 | Adjectives replaced with sourcing facts |
S01-2 | Material comparison | S01 | Shot beside a standard dial, same frame |
S02 | Thin case | ||
S02-1 | Small-wrist proof | S02 | Re-shot on a 14cm wrist |
S03 | Price · value |
You can go to S01-1-1, but two levels is the practical ceiling: deeper, nobody can state the difference from the parent in one line, and traffic per row drops below readable. Derived appeals covers where to stop.
Filling it the first time
The usual failure is deciding to do this properly and so never starting. Budget 60–90 minutes.
- Mine reviews (20 min). Skim 100–200 reviews, weighted toward four-star ones, and tally the nouns that repeat. Half your candidates come from here.
- Pull search terms (15 min). Query reports and on-site search: the words buyers type are appeal names already written.
- Write 10–15 candidate rows (30 min). Fill four columns only — ID, root appeal, primary type, category. Leave the other five blank on purpose.
- Mark 3–5 active (10 min). Note them "2026-08 running." The rest get "parked — candidate."
- Detail only the active rows (15 min). Suggested image and test method, specific, because those are what you're shooting this month.
Importing from a spreadsheet
Moving a sheet into a tool, or pushing an edited export back, breaks in three places.
The header row has to match. Imports map by column name in row one. Rename "Parent appeal ID" to "Parent," or add an instruction row above it, and the mapping shifts silently.
The parent points at a code that doesn't exist yet. S05-1 claims S05, but no S05 row is in the file, so the row lands orphaned. Create roots first, or split the upload in two.
And the classic. Delete a few rows in Excel — with a filter applied, a mis-selected range, a stray merged cell — and only some columns shift up. The sheet looks normal, but the parent column is off by one, so S03 arrives as a child of an unrelated S01. Nothing errors: every value is still a valid code.
The defence is a rule: when a row's own ID is a root code — S03, no separator — ignore the parent column and treat the row as a root. The code already declares it, so trust it over a column that may have slid. In reverse: if the ID is S03-1 and the parent cell is empty, derive S03 from the code.
copy hound ships this sheet as a downloadable .xlsx template and previews the import before committing — how many roots, how many derived rows, how many parents it couldn't resolve. That catches all three cheaply.
Keeping it alive
A library is edited the day a test ends, not the day it's created.
| Point | What happens to the row |
|---|---|
| Before launch | S02 created, suggested image and test method written. Note: "2026-08 running" |
| After launch | One line of result: "2026-08 CTR 1.9%, 1.6× the worn shot" |
| It won | Spawn S02-1, recording in what changed what you altered |
| It lost | Note: "2026-08 parked — clicks fine, CVR 0.3%, suspect price mismatch" |
The rule that earns the most: never delete a loser. Delete it and next quarter someone new proposes the same angle as a fresh idea. One recorded line of reasoning ends that meeting in five minutes — the value of a library isn't the winners, it's the record that something was tried. Give parked rows an expiry, though: an appeal that failed a year ago deserves a second look if a competitor repriced.
Where a spreadsheet stops working
Start in a spreadsheet. It works, right up to three walls.
Per-channel copy variants. One appeal, three pieces of copy, each needing a Kakao Moment, Naver GFA and Meta version — nine rows for one appeal. As columns the sheet sprawls sideways; as rows you lose where the appeal ends. And someone counts characters by hand.
Per-period performance. August and September in one cell means overwriting; in separate columns, an ever-widening sheet. Most teams keep only "latest result" and lose the trend. Rolling numbers up to the appeal is covered in comparing creative performance.
Image attachments. Embed them and the file gets heavy. Link them and half are dead in six months.
copy hound is built around those joins — a root/derived appeal tree, per-channel copy specs with character-limit checking, performance by period rolled up to the appeal, an image gallery, a change history. But with no table yet you don't have a tool problem: build the nine columns in Excel today, migrate when a wall hurts. Keeping copy tied to its appeal is covered in managing ad copy.
FAQ
Do I really need all nine columns?
Four — ID, root appeal, primary type, category — is enough to call it a table. But fill suggested image before a test and note after one, without exception. Skip those and in six months nothing explains why anything won.
Can I change an appeal's code later?
Change the name freely; never the code. Codes have already spread into reports, file names and old meeting notes. If an appeal has drifted far enough that its code feels wrong, issue a new one and park the old row.
Should each product get its own library?
Split across categories — watches and bags don't share appeals. Keep models within one category in a single table and add a product column. Appeals repeat at category level, not SKU level.
How many levels of derived appeals should I keep?
Two: S01 → S01-1. A third level makes "what changed" impossible to state in one line and splits traffic below readable. To go further, add siblings at the same level.
Read next
What is an ad appeal? Definition, types and how to pick one
An ad appeal is the single reason your ad puts forward to persuade someone. Here is how an appeal differs from copy and from a creative, the four places real appeals come from, and how to keep them as an asset instead of throwing them away after one campaign.
Derived appeals: keeping an improvement trail on your creatives
When an ad appeal wins, the useful next move is neither running it to death nor starting over. Here is how derived appeals work, the one-variable rule that keeps them readable, and why the resulting tree is worth more than any single creative in it.
Somewhere to actually run this
copy hound builds your appeals up as assets, keeps an improvement trail through derived appeals, and rolls per-channel creative performance back up to the appeal. Runs in the browser — nothing to install.
Start free