The platform report says ad 23851074920 outperformed everything else last month. Your team calls that ad "the nacre close-up, version B." Nothing anywhere connects those two facts.
So the monthly report gets assembled by hand, matching numbers to names from memory. It mostly works — and it is wrong in a slightly different way each month, with errors that compound rather than cancel. Six months in, all that survives is a sentence nobody can reproduce: "the material angle did well last year."
Two kinds of ID, and why one is not enough
Every creative you run carries two identifiers with opposite properties.
| Platform ad ID | Your creative code | |
|---|---|---|
| Who assigns it | Meta, Kakao, Naver, Google — automatically | You do, by a rule you chose |
| What it looks like | 23851074920 | W01-S01a-v2-KKO |
| Human-readable | No | Yes |
| Travels across platforms | No. Different number on each | Yes. Same idea keeps the same root |
| Good for | The only authoritative key on performance | The unit people talk and search in |
The platform ad ID is authoritative: impressions, clicks and conversions arrive attached to that number and nothing else. But you cannot read it, and it means nothing outside the platform that issued it — upload the same artwork to Meta and Kakao and you get two unrelated numbers.
Your creative code is meaningful. Read it and you know the product, appeal, variant and channel, and it survives a change of platform, agency or staff.
Picking one is the mistake. Store the platform ad ID against your creative record. That gives you a join key: the ID column in the platform's CSV lines up with a row in your table, and every readable attribute comes along for free.
A naming convention that survives contact with reality
A scheme is good not because it is elegant but because people still follow it six months later. This shape holds up:
product-appeal-variant-channel, with an optional -date or -sequencee.g.
W01-S01a-v2-KKO, W01-S02-v1-META-2608- Product (
W01) — first, so sorting groups by product and adding products never disturbs the rest of the rule. - Appeal code (
S01a) — the field doing the real work. The trailingamarks a derived appeal underS01. Without this position you can never roll six creatives up into one idea. - Variant (
v2) — which pass at the same appeal, image or copy changed. - Channel (
KKO) — fixed three letters:META,KKO,NVR,GGL. - Date or sequence — only when the same combination runs again later.
Five rules separate a convention from a mess.
- Fix the field order. If it drifts you can never split codes back into columns programmatically.
- Fix the separator. Hyphens throughout. The moment underscores creep in, half your searches quietly miss.
- No spaces. They break UTM parameters, and a trailing space in a spreadsheet is invisible until a join fails.
- No non-ASCII characters inside the code. Exports mangle encodings often enough that you will eventually open a CSV of question marks — a re-do, not a repair. Keep the local-language name in a description column beside the code.
- Never reuse a retired code. Killing a creative does not delete the history filed under it. Reuse it and two creatives sum into one row, permanently.
Platforms also truncate long ad names, and what gets cut is the tail — exactly the channel and variant fields you need to tell near-identical creatives apart. Keep codes short.
| Code | Product | Appeal | Variant | Channel |
|---|---|---|---|---|
W01-S01-v1-META | Watch, nacre line | S01 material · detail | 1st | Meta |
W01-S01a-v2-KKO | Watch, nacre line | S01a material proof (derived) | 2nd | Kakao |
W01-S02-v1-NVR | Watch, nacre line | S02 price · value | 1st | Naver |
B03-S01a-v1-META | Crossbody bag | S01a material proof (derived) | 1st | Meta |
How to number appeals is covered in building an appeal library; when to append a rather than open a new number, in derived appeals.
Where to put the ID so it actually survives
A code belongs in three places.
- The platform's ad name field — code first, description after, so the code survives truncation.
- The
utm_contentparameter —utm_content=W01-S01a-v2-KKO, which splits analytics sessions by creative rather than by campaign. - Your own creative record — code, readable name, appeal, copy, image, and the platform-assigned ad ID, on one row.
These three copies will drift apart. Someone duplicates an ad and the name changes. A landing page gets swapped in a hurry and the UTM is dropped. Someone leaves and the record stops. This is not a discipline problem; it is what happens to any value stored in three places.
So one has to be the source of truth, and it should be your own record. The platform name field is edited by the platform and by people in a hurry. The UTM is invisible to any report that is not analytics-based — the platform's own report, the billing export, the agency deck. Your record is the only copy you control, the only one that spans platforms, and the only one sitting on the same row as the appeal, copy and image. When copies disagree, your record wins and you fix the others.
Linking derived creatives
This is the part that pays for the whole exercise.
One appeal rarely ships as one creative. It becomes six: two versions across three channels. Those six need to be readable both as six things and as one thing.
The mechanism is simple. Every derived creative carries its own ID and the shared appeal code. That one property lets you ask two different questions of the same data:
- How did this exact creative do? Read one row. This is the unit of production and of a stop/keep/scale verdict.
- How did this idea do everywhere it ran? Sum every row carrying
S01a. This is the unit of planning and budget.
| Creative code | Channel | Impressions | Clicks | CTR |
|---|---|---|---|---|
W01-S01a-v1-META | Meta | 120,000 | 1,560 | 1.30% |
W01-S01a-v2-META | Meta | 98,000 | 1,470 | 1.50% |
W01-S01a-v1-KKO | Kakao | 210,000 | 1,890 | 0.90% |
W01-S01a-v2-KKO | Kakao | 175,000 | 1,400 | 0.80% |
W01-S01a-v1-NVR | Naver | 64,000 | 512 | 0.80% |
W01-S01a-v2-NVR | Naver | 52,000 | 468 | 0.90% |
| S01a total | 3 channels | 719,000 | 7,300 | 1.02% |
Row by row, the conclusion is "the second Meta creative is the winner." The rollup says something else: S01a held 1.02% across 719,000 impressions, with a hard channel split — 1.3–1.5% on Meta against 0.8–0.9% on Kakao. The first sentence tells you what to build next week. The second tells you how to split next quarter's budget, and it is invisible unless the six rows share a code.
Having only one view means making half your decisions blind. Matching conditions before comparing creatives is its own problem, covered in comparing creative performance.
Cumulative and per-period, from the same ID
Searching one ID should return two things: lifetime totals and the by-period series. Cumulative answers *was running this worth it?* Per-period answers *when did it start to decay?*
| Week | Impressions | Clicks | CTR |
|---|---|---|---|
| 1 | 22,000 | 462 | 2.10% |
| 2 | 26,000 | 442 | 1.70% |
| 3 | 25,000 | 325 | 1.30% |
| 4 | 25,000 | 241 | 0.96% |
| Cumulative | 98,000 | 1,470 | 1.50% |
That is W01-S01a-v2-META spread by week. On the cumulative line it is a strong creative, above account average. On the weekly line it fell from 2.10% to 0.96% — less than half — while the average quietly covered for it. It was spent around week three and kept spending money afterwards.
The decision is not "keep running it." It is build a fresh variant of the same appeal and swap it in, because the appeal did not die, the image wore out. Recording that judgment with a date is what the creative review workflow is for.
How this breaks in practice
- The platform truncates a long name, cutting the tail and leaving several creatives identical in the report. Front-load the code and keep it short.
- Someone duplicates an ad in the UI and the platform appends "copy" to the name. The string no longer matches, so that ad silently drops out of every join. Fix the name immediately.
- A retired code gets reused because the creative was deleted and the code looked free. History is still filed under it, so two creatives sum into one row with no way to separate them.
- Two people invent two schemes —
W01_S01_METAandw01-s01-meta. Neither is wrong; they just cannot be combined. Enforce one rule where creatives are created, not at review. - The ID lives only in the UTM. Analytics looks great, while the platform report, the billing export and the agency deck have no idea the code exists.
What this looks like in a tool
In copy hound each creative can carry an optional platform ad ID — a field, not a requirement. Fill it in where you know it, leave it blank elsewhere.
When it is filled in, derived creatives stay linked to their parent appeal, and searching by ID pulls up every creative sharing it with cumulative totals alongside the per-period series, rolled up to the appeal. The two tables above already exist instead of being rebuilt in a spreadsheet each month. That is the extent of it — leave the ID blank and appeals, copy and creatives work exactly as before.
FAQ
Can I just use one of the two IDs?
No. Performance numbers only ever arrive attached to the platform's ad ID, and a cross-platform grouping can only be built on a code you control. Use one and you permanently lose one of the two questions.
I already have hundreds of creatives with no convention. Do I backfill?
Don't. Apply the rule only to creatives made from today onward. If older work still gets referenced, hand-code the top ten or twenty and stop. Full backfills stall halfway, and a half-converted archive is more confusing than an unconverted one.
Should the code include campaign or audience?
No. Those change on the platform side, so baking them in means one creative ends up with several codes — which defeats the point. The code should identify the creative itself. Campaign and audience are already columns in the export and attach after the join.
The same creative runs again months later. New code or old one?
If the file is genuinely unchanged, keep the code and append the flight — W01-S01a-v2-KKO-2608 — so you can read both the lifetime total and this flight alone. If you touched the image or copy at all, it is a different creative: increment to v3 and keep the numbers separate.
Read next
How to compare ad creative performance fairly
Two creatives almost never run under the same conditions, so putting their numbers side by side usually produces a wrong answer. Here are the five conditions that have to match, why rates beat totals until the denominator gets small, and how to roll creative numbers up to the appeal.
A three-state creative review: stop, keep, scale
Creatives pile up because nobody ever formally kills one, and spend quietly drifts to whatever the algorithm likes. Here is a three-state review — stop, keep, scale — with when to judge, what to judge on, and how to keep the decision on record.
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