amitdusane.com Adobe Analytics Learning

Shape the dataClassifications

Designing the Key

Open the classification interface in Adobe Analytics and go looking for the screen where you design the key.

There is not one. There never was. You can create a set, define a schema, upload a file, write a rule, and at no point does Adobe ask you what the key should be. By the time you arrive at that interface the key already exists, and has existed for months. Somebody chose it. Maybe a marketer inventing a campaign code convention. Maybe a developer deciding what to push into an eVar. Maybe nobody chose it at all, and the key is simply whatever the system happened to emit.

Which is a strange thing to sit with. The most important decision in this entire module gets made outside the tool that depends on it, long before anyone is thinking about classifications, and usually by people who have never heard the word.

The key is not a setting

The phrase "designing the key" invites the wrong mental picture, so it is worth clearing up straight away.

The key is not a field you fill in anywhere. The key is the raw dimension value itself. Classify a tracking code, and the key is whatever string arrived in that tracking code. Classify an eVar holding a User ID, and the key is that User ID, exactly as the login page pushed it. No translation layer, no configuration, nowhere to step in. Whatever was collected is the key, and the classification either finds it or it does not.

So designing the key is not an analytics task you perform in an analytics screen. It is a decision about what gets collected in the first place. It belongs in the same conversation as the rest of your variable planning, the one you have with marketing and with the developer, written down during variable planning long before a single classification exists.

Remember what Classifications Overview established. Classifications shape data at report time, not at collection time. That is what makes them retroactive and what makes them free of code. But it also means they have nothing of their own to hold on to. They grip the collected value, and only the collected value. The key is the one thing a classification can reach, which makes it the whole load-bearing structure.

Five things make a key good. Here they are before the detail, so you know the shape of the walk.

The ruleWhat it asks of the keyWhat it costs you when it is wrong
1. It has to be therePresent on the hits you actually want to report onEverything you wanted quietly lands in Unspecified
2. It has to mean one thing, foreverNever reused, never recycled, never reassignedYour history rewrites itself, and nothing warns you
3. It has to be readableStructure, and a delimiter a machine can gripEvery attribute typed by hand, by someone, forever
4. It has to survive the limitsLength, whitespace, zeros, duplicatesRows fail to load, and nothing tells you why
5. It has to be countableA sane number of unique valuesSlow, fragile, and eventually unusable

One: the key has to be there

Start with the rule that sounds too obvious to bother stating, then watch how often it gets broken.

A classification resolves a key on a hit. No key on the hit, nothing to resolve, and that dimension item goes into Unspecified. No error. No warning. Just a quiet line in the report absorbing everything the classification could not reach.

So the real question is never "will the key be collected." It is "on which hits will the key actually be present," and the answer depends entirely on where you put it.

Put the club's User ID in a prop and it lives only on the hits where the code explicitly set it. Realistically that means the login page and nothing else. Every classification hanging off it will describe the login page and go silent everywhere else. Run a report of Membership Tier against Hall Bookings and you get almost nothing, correctly, because the booking page never carried a User ID.

Put that same User ID in an eVar with a thirty-day expiration and it persists. The member's whole month of activity now carries the key, and the classifications travel with it everywhere they go. Same data, same file, completely different report.

You configured none of that in the classification screen. You configured it back when you decided which variable holds the key and how long it lives, which is a decision you made back in Variables, and it has just come due.

Two: the key has to mean one thing, forever

This is the rule that gets broken most expensively, and it turns the best property of classifications into the most dangerous one. Slow down here.

Retroactivity is not a one-time gift. It is a permanent, living relationship between the lookup table and every hit in your history. Change the table today and history changes today. Load a file with the same key in it twice, and the second row simply wins. There is no versioning. There is no effective date. One current value per key, and it applies to all of time.

Now picture what happens when a key gets reused.

Member M-10482 is a sixty-four year old Gold member who booked the community hall every month for two years. She leaves. Eighteen months later the membership system, which recycles IDs, hands M-10482 to a twenty-three year old new joiner. The CRM export runs on schedule that night. The file uploads cleanly. No error appears anywhere.

And two years of hall bookings by a senior Gold member have just become two years of hall bookings by a twenty-three year old.

A recycled key rewrites history silently

No validation catches this, because nothing failed. The upload succeeded. The report renders. The totals still reconcile, because no hits were added or removed. Only the labels moved, and they moved backward through every report anyone has ever run. If your key can be recycled, reassigned, or reused by the source system, it is not a key. It is a slot number, and slot numbers are not identities.

So before you accept any value as a key, go and ask the system that generates it one question. Can this value ever refer to something else later? Not "will it," but "can it." If the answer is yes, either fix it at the source and make the identifier permanent, or classify something else instead.

That question quietly indicts a whole family of tempting keys. A campaign code reused next year because it worked well last year. A product SKU retired and later reissued for something different. An order number that resets each fiscal year. Every one of them looks fine on the day you upload it. Every one of them is a slow rewrite of your own history.

Three: the key has to be readable by a machine

The first two rules are about correctness. This one is about leverage, and it separates a key that merely works from a key that pays for itself.

Classifications Overview introduced the rule builder, which reads the key you already have, matches it against a pattern, and fills classification columns without any file at all. Whether that is even possible has nothing to do with the rule builder. It was settled months earlier, by whoever wrote the campaign code convention.

Look at two tracking codes for the same email campaign.

Ten characters a human has to decode, or five parts a rule can read
Opaque emljul26wb ten characters, and nothing a rule can grip so every attribute is typed in by a human, forever one row in a file for every campaign you ever run Structured eml 2026 07 winback in channel year month campaign region one rule reads all five, for every campaign that follows the convention, with nobody uploading anything Whether a rule is even possible was settled months earlier, by whoever wrote the naming convention.

The second key is not just nicer to look at. It has a structure, and structure is the thing a regular expression can grip.

The anatomy of a designed key
One collected value eml _ 2026 _ 07 _ winback _ in Channel Email Year 2026 Month July Campaign Winback Country India Five reportable dimensions. One eVar spent. No file uploaded, and no developer involved. The delimiter is what makes this possible. Remove it and the whole thing collapses into a string.

Regular expressions work best on codes that use delimiters. Not codes of a fixed width, not codes you slice by character position, but codes with a separator between the parts. The reason is practical. Position-based parsing breaks the first time a campaign name runs one character long. Delimiter-based parsing does not care how long the parts are, only that something sits between them.

So the delimiter matters more than it looks. It has to be a character that can never appear inside any of the values it separates. An underscore is safe, because campaign names rarely contain one. A hyphen is riskier, because win-back is a perfectly natural thing for a marketer to type, and the moment they do, your rule quietly produces a Campaign of win and a Country of back.

The trap that kills rule-based classification outright

A URL-encoded tracking code will not be classified by the Rule Builder at all. This sounds like a bug, but it is a hard limit of the feature, and one worth knowing before you design a single rule. A beautifully delimited key that arrives as eml%5F2026%5F07%5Fwinback is simply unreadable to the rule builder, and no amount of regular expression skill will rescue it. The fix lives upstream, in how the campaign link is built and how the value is read into the variable. Which makes it a conversation with whoever owns the campaign URLs, not a configuration you can solve alone.

Four: the key has to survive the boring constraints

None of this is exciting. All of it breaks real uploads, and the failures tend to arrive weeks after the key convention was agreed, when changing it has become expensive.

ConstraintThe ruleWhat it means for your key
LengthA key cannot exceed 255 bytes, and neither can any classification valueGenerous, but not infinite. A key built by gluing several long free-text fields together can reach it.
Empty keysA key cannot be empty or made only of whitespaceThose rows are rejected. Make sure the source system cannot emit one.
ZeroA key or value of 0 throws an error, and so do 00 and 000The strangest limit in the feature. If your source can legitimately produce a zero, translate it at collection time into a text value such as Zero.
WhitespaceLeading and trailing blanks are truncated automatically, on hit data and classification data alikeA mercy, since a stray trailing space still matches. An internal stray space is a different key entirely, and will not.
Duplicate keysThe last occurrence in the file winsNo error, no warning. The same key twice in one file, and whichever row lands second is the one you get.
Special charactersCommas and quotes are allowed but awkward, and need correct escapingKeep them out of keys entirely. There is no upside, and a whole category of file-parsing failure waiting.

Read that zero row twice, because nobody believes it until it happens to them. A store with a product whose SKU is genuinely 0, or a campaign code that a system emits as 000 when it has nothing better to say, will fail to classify and will never tell you why.

Five: the key has to be countable

The last rule decides whether the whole approach is even viable, and it comes down to scale.

Performance rests almost entirely on one number: how many unique values the key will ever hold. Variables carrying enormous numbers of unique values deserve real caution, and the caution grows when several of them are combined into a single classification set.

So the question to ask of any candidate key is not "can this be classified." It is "how many distinct values will this key ever carry." A tracking code convention producing a few thousand campaigns a year is comfortable. A product catalog of two hundred thousand SKUs is a normal, working classification. A User ID for a club with three thousand members is entirely fine. A User ID for a retailer with forty million customers is not, and pushing it there gives you something slow, fragile, and eventually unusable, without ever producing an error that says so.

That ceiling is not a reason to avoid classifications. It is a reason to find out, at design time, roughly how many unique values your key will carry. The source system can tell you in an afternoon, and almost nobody thinks to ask.

The fork this all leads to

Now the architectural decision Classifications Overview promised, and one you will make again and again for the rest of your career.

The campaign above needs five attributes reportable. There are two entirely legitimate ways to get them, and choosing well is exactly the kind of judgment that separates an architect from someone following a tutorial.

Five separate variablesOne structured key, classified
Variable budgetSpends five slots, permanentlySpends one
AvailabilityImmediate. The value is on the hit.Delayed. Classification data takes time to process.
In the data feedYes. Each variable gets its own column.No. Classifications do not travel in the feed.
Adding a sixth attribute laterNeeds a code change, and it only applies going forwardAdd a column, upload, and it applies to all of history
Fixing a mistakeImpossible. The wrong value is stored on the hit.Upload a correction and the whole history heals
Depends onThe developer implementing it correctly on every pageThe key being present, parseable, and never recycled

Neither column wins. They answer different questions.

If the attribute is needed in real time, or has to reach a downstream data lake through the raw feed, give it its own variable and pay the slot. If it is descriptive, likely to grow, and read by humans in reports rather than by machines in pipelines, build it into a structured key and classify it. Usually the retroactive row is what decides it, because being able to add a sixth attribute two years from now and have it apply to every hit you have ever collected is something separate variables cannot offer at any price.

Which means somebody has to write it down

Look back over those five rules and notice what they share. Not one of them can be fixed later.

A recycled key cannot be un-recycled. A key that was never collected cannot be collected retroactively. A tracking code convention without delimiters cannot be given delimiters after ten thousand campaigns have already used it. Classifications heal almost everything downstream of the key, and nothing at all upstream of it.

Which is why the key convention becomes a document, in exactly the way the channel list has in Marketing Channels, and for exactly the same reason. It encodes a decision nobody can take back.

Do this Agree a tracking code convention, and write it down
Format
channel _ year _ month _ campaign _ country
Example
eml_2026_07_winback_in
Delimiter
Underscore. Underscores are forbidden inside any segment value, and campaign names use no spaces and no hyphens.
Segments
Exactly five, always. Never four, never six. Unknown values use a literal token, never blank — an unknown country is xx, never an empty string.
Case
Lowercase, enforced by the campaign URL builder
Encoding
The value must arrive unencoded. URL-encoded codes cannot be classified by rules.
Owner
Marketing Operations
Approved by
Marketing, Analytics, Web Development
Reviewed
Annually, or before any new channel is added

Hand that to a marketer and it looks like bureaucracy. It is not. It is the only thing standing between a business and the discovery, two years and forty thousand campaigns later, that all of its campaign reporting has to be rebuilt by hand because nobody ever decided what the code should look like.

Who owns the key

Marketing owns the campaign codes. Web development owns what lands in the variable. The source system owns the User ID and the product SKU. You own none of them, and you depend on all of them. So the most valuable thing you can do at the start of a classification project is find out who generates each key, ask them whether it can ever be reused, and ask them how many unique values it will hold. Two questions, one afternoon, and between them they decide whether this module works for you or against you.

Where the key goes next

Every rule here pointed the same way. The key has to be present where it matters, mean one thing forever, carry structure a machine can read, survive a short list of unglamorous limits, and stay countable.

Get that right and the rest of this module is largely mechanical. The key is the hard part, and it is the part decided furthest from the classification screen.

With a key worth classifying, the next question is where the classifications will actually live. That is Classification Sets, the container that holds the schema, the subscriptions, and everything you are about to put into it.

Where to find it in Adobe Analytics

Nowhere, and that is the point of this section. The key is decided in your implementation, not in the classification interface. You will see it named as the key dimension when you build a subscription under Components > Classification Sets, but by then it is already whatever your implementation made it.

Need implementation steps?

This article focuses on the concepts, architecture, and practical guidance behind the topic. For the latest UI walkthroughs and step-by-step implementation instructions, use the links below. They leave this site and open Adobe's own documentation in a new tab.