copy hound Guides Free tools
KOEN
Open the app · free
copy houndGuides

Tracking ad performance by creative ID

The platform's ad ID and the name your team says out loud never meet, so the monthly report gets rebuilt from memory. Here is a naming convention that survives contact with reality, where to store the ID, and how to link derived creatives so one idea reads as one thing.

Updated 2026-08-25 · 8 min read · ad creative id · creative naming convention · track ad creatives · creative id tracking

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 IDYour creative code
Who assigns itMeta, Kakao, Naver, Google — automaticallyYou do, by a rule you chose
What it looks like23851074920W01-S01a-v2-KKO
Human-readableNoYes
Travels across platformsNo. Different number on eachYes. Same idea keeps the same root
Good forThe only authoritative key on performanceThe 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 -sequence
e.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 trailing a marks a derived appeal under S01. 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.

  1. Fix the field order. If it drifts you can never split codes back into columns programmatically.
  2. Fix the separator. Hyphens throughout. The moment underscores creep in, half your searches quietly miss.
  3. No spaces. They break UTM parameters, and a trailing space in a spreadsheet is invisible until a join fails.
  4. 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.
  5. 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.

CodeProductAppealVariantChannel
W01-S01-v1-METAWatch, nacre lineS01 material · detail1stMeta
W01-S01a-v2-KKOWatch, nacre lineS01a material proof (derived)2ndKakao
W01-S02-v1-NVRWatch, nacre lineS02 price · value1stNaver
B03-S01a-v1-METACrossbody bagS01a material proof (derived)1stMeta

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.

  1. The platform's ad name field — code first, description after, so the code survives truncation.
  2. The utm_content parameterutm_content=W01-S01a-v2-KKO, which splits analytics sessions by creative rather than by campaign.
  3. 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 codeChannelImpressionsClicksCTR
W01-S01a-v1-METAMeta120,0001,5601.30%
W01-S01a-v2-METAMeta98,0001,4701.50%
W01-S01a-v1-KKOKakao210,0001,8900.90%
W01-S01a-v2-KKOKakao175,0001,4000.80%
W01-S01a-v1-NVRNaver64,0005120.80%
W01-S01a-v2-NVRNaver52,0004680.90%
S01a total3 channels719,0007,3001.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?*

WeekImpressionsClicksCTR
122,0004622.10%
226,0004421.70%
325,0003251.30%
425,0002410.96%
Cumulative98,0001,4701.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 schemesW01_S01_META and w01-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.

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