Expand my Community achievements bar.

SOLVED

Campaign Classifications

Avatar

Level 2

I have a sample URL with icmpid.  Capturing Query String Parameter icmpid in an evar through Adobe Launch data element. 

https://www.xyz.com/sample?icmpid=gs-ff-hf-us-id

How do, I classify the above data and report it in Adobe Analysis Workspace? Do I have to use a classification importer to import the data when they fill out below? Are there other ways to do it? 

For example gs=google services, ff=formfill, us= united states etc.. 

Our goal is to attribute/map the complete name in the reports instead of prefixes. 

1 Accepted Solution

Avatar

Correct answer by
Community Advisor

Ok, I'll break down the above to address each question:

 

if we have ys: yahoo services, we have to add a Rule like below to classify it. Is my understanding correct? 
([a-zA-Z0-0]*)_([a-zA-Z0-0]*)_(ys)-([a-zA-Z0-0]*)_([a-zA-Z0-0]*) 


Yes... though I think this regex has a typo... should be 0-9 not 0-0, but yeah, like that... the generic rule first to catch unexpected values, then the specific "gs", "ys", etc values after to "rewrite" values to something more readable (also feel free to experiment with that regex if you need to account for special characters... I assume there are none... you would know better

 

 

External Campaigns:
Once the Classifications are set up like the below for the Campaign variable (Tracking code v0) instead of the Internal campaign evar.  


Actually, you can do classifications on your v0 (which actually shows as "campaign" in the dropdown: 

Jennifer_Dungan_0-1680664081146.png

 

But there is also a special Marketing Channel Classifications section as well:

Jennifer_Dungan_1-1680664160015.png

Jennifer_Dungan_2-1680664254758.png

 

Your s.campaign (v0) and your Marketing Channels may be set to different expiry times, so it makes sense that you can classify these differently

The Marketing Channel Classifications also allow you to classify both First and Last Touch, and the Channel / Detail.

 

 Now, classifying different taxonomies

Email: cmpid = region_campaign_country_business_medium_source_content_parent_asset_term
Paid search: cmpid = region_campaign_medium__content_parent_term (more relevant to ads info)
display: network_region_campaign_date


This isn't as hard as it seems.. for your internal, I assumed the same pattern.. but you can actually set up different regex to match your rules (you might have to get creative, and play with the order of the rules to ensure that your samples come out correctly (when you run a test).

 

So if I am not mistaken, your email campaigns have 10 parts, your paid search has 7 parts (one of those areas is either optional or always blank), and your display has 4 parts...

 

So you should be able to create a regex for processing rules with 10 sections

something like

 

([a-zA-Z0-0]*)_([a-zA-Z0-0]*)_([a-zA-Z0-0]*)_([a-zA-Z0-0]*)_([a-zA-Z0-0]*)_([a-zA-Z0-0]*)_([a-zA-Z0-0]*)_([a-zA-Z0-0]*)_([a-zA-Z0-0]*)_([a-zA-Z0-0]*)

 

 

Process the items with 10 last, since I believe the ones with less may still match the beginning...

 

For your 7 sections:

 

([a-zA-Z0-0]*)_([a-zA-Z0-0]*)_([a-zA-Z0-0]*)_([a-zA-Z0-0]*)_([a-zA-Z0-0]*)_([a-zA-Z0-0]*)_([a-zA-Z0-0]*)

 

 

And for your 4 sections:

 

([a-zA-Z0-0]*)_([a-zA-Z0-0]*)_([a-zA-Z0-0]*)_([a-zA-Z0-0]*)

 

 

 

So let's put a sample together.. ignore the fact that I am dumping everything into 2 test classifications.. you can even create some generic classifications that look for "10 items taxonomy", apply "email" as a simple lookup, and "7 items" apply "paid search" (I will show that as a sample to give you ideas on what you can do, if you choose)

 

Note: Since I don't have start and end added to the regex (I could though), I will start with "4 item" rules (so that even when the rules match the longer strings, they will later be overwritten), then I will do the 7 part rules, then I will do the remaining 10 items rules (but you could easily add ^ to the start and $ to the end (^([a-zA-Z0-0]*)_([a-zA-Z0-0]*)_([a-zA-Z0-0]*)_([a-zA-Z0-0]*)$) to ensure that it's an exact match: 

 

Jennifer_Dungan_0-1680665984873.pngJennifer_Dungan_1-1680665990857.png

 

Jennifer_Dungan_2-1680665997348.png

 

^ Ignoring the fact that I dumped most of my rules into Test 1 instead of proper classifications (so I kept overwriting the values), you can see that my highlighted sample rows, populating Test 2 with "email" or "paid search" or "display" actually came out correctly based on looking for a specific number of parts, and having them process in the correct order...

 

Now, IF you have two different types of campaign taxonomies, and they have the same number of values being passed, hopefully one of the values can help you determine a difference between them, and you can build that check into the regex to separate them out from one another.

 

Testing your rules is very important, and I would suggest testing with both sample data, like I did.. and get some real collected data and add into the Rule Tester to make sure that everything processes as expected.

View solution in original post

11 Replies

Avatar

Community Advisor

Is icmpid your regular campaign? Or your internal campaign?

 

Having it start with "i" seems like it should be internal, but having the first value be "Google Services" is making me question that...

 

Anyway, your campaign codes should be using a set taxonomy structure, [part1]-[part2]-[part3]... etc and each of those parts should represent something specific... so part1 would be the "source", part2 would be the medium, part3 would be the region/location, etc....

 

On your eVar, you will need to set up all the classifications that you will want to process the data into (source, medium, location, etc)

 

 

Depending on how many unique values you are expecting, you can either use Classification Rule Builder, and set up regex rules to extract the values by position and value and actually map "gs" to "google services".

 

Possibly a regex like /(gs)-(\w+)-(\w+)-(\w+)-(\w+)/

This will look for "gs" in the first spot, then any values in the other slots (assuming there is always 5 parts)

 

Or if you want to extract the "ff" from position two and translate it

/(\w+)-(ff)-(\w+)-(\w+)-(\w+)/

 

In the first example, choose the "source" classification (if that is what you are calling it) and put the outcome as "google services", or in the second example, choose the "medium" classification and put in "formfill"

 

You will have to add variants for all the values in each position.

 

 

Likewise, if you want to map to specific values, but you have a lot of variations, you can use the classification importer to bulk upload and manage all your value mappings, you can still use the regex rules, but you can manage all the mappings via a CSV file and update the rules.

 

https://experienceleague.adobe.com/docs/analytics/components/classifications/c-classifications.html?...

 

 

If these are your main external campaigns, you might also want to set up Marketing Channel rules for your values.

 

https://experienceleague.adobe.com/docs/analytics/components/marketing-channels/c-getting-started-mc...

 

https://experienceleague.adobe.com/docs/analytics/admin/admin-tools/manage-report-suites/edit-report...

 

This is a very quick summary of what needs to be done, if you need more in-depth instruction, please let me know.

Avatar

Level 2

Thank you @Jennifer_Dungan.  Can you please explain in-depth instructions? We are migrating from GA to AA and I'm still catching up with Adobe.

We use cmpid for external campaigns & icmpid for internal campaigns. 
Internal structure:  icmpid = campaignpage-country-pagetype-speciality-campaignuniquecode
?cmpid = region_campaign_country_business_medium_source_content_parent_asset_term
Have to classify both campaigns, but I would like to start with icmpid as the data volume is significantly less compared to external campaigns.  (cmpid is captured in Tracking code)

Avatar

Community Advisor

Ahhh, welcome to Adobe Analytics!

 

I will try to explain some in-depth things, but I am also going to go and find some video resources for you... there's a lot of good content in the Analytics User Groups, you should definitely consider joining a few users groups, and the sessions are recorded if you can't make the live events:

 

https://analytics-augs.adobe.com/chapters/

 

^ I am a co-loader of NOAM East, and I know that there have been some great sessions around campaign tracking..  

 

Stand by.. I will try and do some collection of assets and get back to you shortly.

Avatar

Level 1

@Jennifer_Dungan  , Our team, is in the same boat & struggling with classifications, and CID usage. Appreciate all your support here.  We are migrating from UTM's (Adobe Analytics) to CID with 9-10 string values separated by underscore "_"

Avatar

Community Advisor

OK, here are some videos:

 

There was a three part series that was done between EMEA, NOAM East and NOAM Central)

 

Part 2: Campaign Tracking Multi-verse of Madness (NOAM East):
https://www.youtube.com/watch?v=N2w8KjeRkSQ


Part 3: Marketing Channel Setup (NOAM Central):

https://www.youtube.com/watch?v=u1AbkKFCXzc

 

(There was a first part about Mobile Apps Campaign Tracking, but let's try and stick with the basics for now - Mobile Apps are more complicated, and right now you both sound like you need to get the basics for the website down first)

 

 

Campaign Tracking and Classifications (NOAM East):

https://www.youtube.com/watch?v=PgGhJ1Q088k

 

 

Now, both of you, coming from Google, are used to Google just "doing its thing"... Adobe gives you a lot more control over what is happening.

 

There's a lot of info to cover... 

 

And of course, like any system that has been around for a while, there are pieces everywhere!

 

You will want to start by defining your paid search detection: 
https://experienceleague.adobe.com/docs/analytics/admin/admin-tools/manage-report-suites/edit-report... 

 

These rules will also be used in your Market Channel Paid and Organic Search rules.

 

https://experienceleague.adobe.com/docs/analytics/components/marketing-channels/c-getting-started-mc...

 

There is some automatic setup that is done the first time, but you can edit at any time.. you can even rename or configure new Marketing Channels to suit your needs... (for instance, we separate our our "marketing emails" from our "newsletter emails" since they represent very different content types and are controlled by different teams within our org)

 

  • You can manage the channels, and even define some of the override rules using Marketing Channel Manager
  • Marketing Channel Processing Rules are where you define the order that your channels are processed and what criteria will be used to add data - this might take some tweaking to get working just right
  • You can apply classifications onto your Marketing Channels (similar to the custom solution that you will do for Internal Campaigns) - Classifications can be used on any dimension as well... this is a really powerful part of Adobe
  • You can also define the Marketing Channel expiration (you can even force a full expiry if you need to do some major changes, and you want to see the results quicker without corruption from the previous rules)

 

I think this is a good start, then I can help with more specific questions as you get more familiar with the setup.

 

 

Avatar

Level 2

@Jennifer_Dungan  joined  NOAM East and went through the above resources, Super helpful. 

Below are the steps that I would like to follow for icmpid and queries. 

1) create/Add classifications (conversion) for internal campaign evar. 
2) Download the classification template and populate the values. 
3) Just to double-check the "key" is the icmpid prefix/shortened value captured from URL? 
4) Break the icmpid by "_" using Regex in the classification rule builder.  Test the rule sets & validate in workspace. 
How do teams handle empty values /optional values with a classification rule builder or classification importer? Will it break the regex if the value is empty?

 

Avatar

Community Advisor

Before I answer the specific questions (since I will try to bolster with screenshots as well), how are you handling your optional values?

 

For something like 

x_y_z_w_q_t

 

You need to make sure that you have the same number of placeholders

 

 let's say "w" is optional....

 

If you are doing x_y_z_q_t 
Then this will completely break... because now all your rules will be trying to process "q" as "w" and "t" as "q" (basically you have shifted all the positions after your optional value)

 

If you are using x_y_z__q_t (double underscore), then we should be able to build into the regex optional values... so that it looks for "none or more values" in the 4th slot

 

If you are using x_y_z_na_q_t (replacing a value with "na" or not applicable) then we can set a rule to look specifically for that placeholder and ignore it)

 

The answer to this will help me with answering you other questions.

Avatar

Community Advisor

Follow-up:

 

1. Set Up Classifications on your Prop/eVar:


- Go to Admin > Report Suites
- Choose your Report Suite (note, if you have a Dev and Prod Suite, choose both so that you can do the setup at the same time and keep them in sync)
- Edit Settings > Conversion > Traffic Classifications / Conversion Classifications

- Choose your eVar from the drop down list

- Now click hover over the arrow, and select "Add Classification"

Jennifer_Dungan_1-1680576611090.png

- Create a classification for each part of your internal campaign taxonomy, giving them a name and description (I also like to make a note in the description about this being processed every 4-6 hours to remind people that they don't work well with "live" or "today" data)

Jennifer_Dungan_3-1680576792406.png(You can add additional constraints based on the dropdown list, but for a campaign that may be too limiting)

 

Once you have all these set up, you can move on to setting up your classification rules

 

2. Classification Rules Export / Importer... or Classification Rule Builder (and also points 3 and 4...)

 

I tend to stick with the Classification Rule Builder myself...  The Export/Import is really good when you need to handle large sets of data (like applying product classifications based on SKU numbers).... but I will let you decide what works for you.

 

- Go to Admin > Classification Importer / Classification Rule Builder

 

(Importer)

- Download the template for you suite and eVar (I assume if you are doing this for both Dev and Prod you will need to do this twice)

- Follow the template insructions, fill it in and upload

 

(Rule Builder)

- Add a new Rule Set

Jennifer_Dungan_4-1680577340581.png

- Give it a name... I like to use a naming convention that includes the purpose (like "Internal Campaign") and the prop/eVar etc that the rule belongs to...

 - Now, select the Report Suites and Variables

Jennifer_Dungan_5-1680577458958.png

Jennifer_Dungan_7-1680577629280.png

You can add all the suites that you set up before... for me, this includes my Dev and Prod suites

- Save once you have all the suites/eVars selected

- Add Rules (not rules process in the order shown, so if there are competing rules, the last one to process will take precedence)

Jennifer_Dungan_8-1680577694730.png

In this case, we are going to use Regex

(This is where my last question comes into play... how do we handle the "optional" parts of internal campaign

I personally like to test my regex rules using https://www.regextester.com/ (while Adobe does have a simple sample in their builder, this will allow me to see the results of multiple examples at once while I am building... I just turn on multi-line flag and fill in a sample per line). I can also however over and see how the values are extracted into groups

Jennifer_Dungan_9-1680578079429.png

So I used the following Regex:

([a-zA-Z0-0]*)_([a-zA-Z0-0]*)_([a-zA-Z0-0]*)_([a-zA-Z0-0]*)_([a-zA-Z0-0]*)_([a-zA-Z0-0]*)

This is a simple extraction of values, taking each part from the underscore delimiter (and assuming each is "optional" (I used the 0 or more check), you will also notice I do have a sample for "na" which I will get to next.

 

But for the moment, this looks ok, so I will take this regex back to Adobe

Jennifer_Dungan_10-1680578352875.png

 

I made this regex flexible enough to use for all parts of the Campaign:

 

You will notice that I choose a different group, and I set the "Set Classification" column to specific values for part 1 or 2, etc:

Jennifer_Dungan_14-1680579084566.png

 

Now.. let's assume you have the "na" as a placeholder... (and we'll use position 4, as our sample) (x_y_z_na_q_t)

 

After all 6 rules are created, I would then create a new rule to look specifically for "na" (and if you need to code short forms to expand to full values, you can do the same logic)

 

I will now use this regex:

([a-zA-Z0-0]*)_([a-zA-Z0-0]*)_([a-zA-Z0-0]*)_(na)_([a-zA-Z0-0]*)_([a-zA-Z0-0]*)

Notice that I have replaced that part of the rule with a specific "na" value....

 

This no longer matches the generic sample key I was using:

Jennifer_Dungan_12-1680578856695.png

But if I change the key:

Jennifer_Dungan_13-1680578952306.png

 

 

Now, IF you are using a placeholder, you still need to enter a value.. you can't have it totally blank...

Jennifer_Dungan_15-1680579186980.png

 

So probably just using "no value" sandwiched by underscores works better, but like I said, if you want to convert "gs" to "google services" this is how you would do it.. you can start with generic "catch alls", then add specific overrides to ensure that IF something unexpected is passed, you capture it... but you still have rules for the expected values:

 

Jennifer_Dungan_16-1680579345084.png

^ Instead of referencing a group extraction via regex, I overwrote value of "gs" is position 4 with literal "google services"

 

Once you have all the rules set up, you can test your rule set:

Jennifer_Dungan_17-1680579436935.pngJennifer_Dungan_18-1680579490174.png

 

You can add as many samples here as you like, and you can see how all your classifications are going to process per row.

 

Note: there is a caveat to Classification rules.. they cannot process or set a value of "0" (this is a long running complaint from most users).. if you need to set "0" then you have to use ".0" or "zero"... 

 

If you are leaving an empty placeholder for optional fields, you can see the result here:

Jennifer_Dungan_19-1680579783868.png

 

Nothing should break, because I looked for "none or more" in my regex, and Adobe took the nothing value as an extraction and didn't apply any value with no error.

 

 

Hopefully this helps.

Avatar

Level 2

@Jennifer_Dungan  Thank you so much for the detailed solution.  
I choose to use the Classification rule builder for internal campaign id classification: 
Whenever we have an internal Campaign with a new value like below instead of gs: google services if we have ys: yahoo services, we have to add a Rule like below to classify it. Is my understanding correct? 
([a-zA-Z0-0]*)_([a-zA-Z0-0]*)_(ys)-([a-zA-Z0-0]*)_([a-zA-Z0-0]*) 

External Campaigns:
Once the Classifications are set up like the below for the Campaign variable (Tracking code v0) instead of the Internal campaign evar.  
Jennifer_Dungan_1-1680576611090.png
If we have multiple campaign ID taxonomies for various marketing channels, How can I set up the classifications on Campaign Variable with different CID taxonomies? As we can only apply one Test rule set in the classification rule builder per variable , how to handle callasifications with this scenario? 

Email: cmpid = region_campaign_country_business_medium_source_content_parent_asset_term
Paid search: cmpid = region_campaign_medium__content_parent_term (more relevant to ads info)
display: network_region_campaign_date

Avatar

Correct answer by
Community Advisor

Ok, I'll break down the above to address each question:

 

if we have ys: yahoo services, we have to add a Rule like below to classify it. Is my understanding correct? 
([a-zA-Z0-0]*)_([a-zA-Z0-0]*)_(ys)-([a-zA-Z0-0]*)_([a-zA-Z0-0]*) 


Yes... though I think this regex has a typo... should be 0-9 not 0-0, but yeah, like that... the generic rule first to catch unexpected values, then the specific "gs", "ys", etc values after to "rewrite" values to something more readable (also feel free to experiment with that regex if you need to account for special characters... I assume there are none... you would know better

 

 

External Campaigns:
Once the Classifications are set up like the below for the Campaign variable (Tracking code v0) instead of the Internal campaign evar.  


Actually, you can do classifications on your v0 (which actually shows as "campaign" in the dropdown: 

Jennifer_Dungan_0-1680664081146.png

 

But there is also a special Marketing Channel Classifications section as well:

Jennifer_Dungan_1-1680664160015.png

Jennifer_Dungan_2-1680664254758.png

 

Your s.campaign (v0) and your Marketing Channels may be set to different expiry times, so it makes sense that you can classify these differently

The Marketing Channel Classifications also allow you to classify both First and Last Touch, and the Channel / Detail.

 

 Now, classifying different taxonomies

Email: cmpid = region_campaign_country_business_medium_source_content_parent_asset_term
Paid search: cmpid = region_campaign_medium__content_parent_term (more relevant to ads info)
display: network_region_campaign_date


This isn't as hard as it seems.. for your internal, I assumed the same pattern.. but you can actually set up different regex to match your rules (you might have to get creative, and play with the order of the rules to ensure that your samples come out correctly (when you run a test).

 

So if I am not mistaken, your email campaigns have 10 parts, your paid search has 7 parts (one of those areas is either optional or always blank), and your display has 4 parts...

 

So you should be able to create a regex for processing rules with 10 sections

something like

 

([a-zA-Z0-0]*)_([a-zA-Z0-0]*)_([a-zA-Z0-0]*)_([a-zA-Z0-0]*)_([a-zA-Z0-0]*)_([a-zA-Z0-0]*)_([a-zA-Z0-0]*)_([a-zA-Z0-0]*)_([a-zA-Z0-0]*)_([a-zA-Z0-0]*)

 

 

Process the items with 10 last, since I believe the ones with less may still match the beginning...

 

For your 7 sections:

 

([a-zA-Z0-0]*)_([a-zA-Z0-0]*)_([a-zA-Z0-0]*)_([a-zA-Z0-0]*)_([a-zA-Z0-0]*)_([a-zA-Z0-0]*)_([a-zA-Z0-0]*)

 

 

And for your 4 sections:

 

([a-zA-Z0-0]*)_([a-zA-Z0-0]*)_([a-zA-Z0-0]*)_([a-zA-Z0-0]*)

 

 

 

So let's put a sample together.. ignore the fact that I am dumping everything into 2 test classifications.. you can even create some generic classifications that look for "10 items taxonomy", apply "email" as a simple lookup, and "7 items" apply "paid search" (I will show that as a sample to give you ideas on what you can do, if you choose)

 

Note: Since I don't have start and end added to the regex (I could though), I will start with "4 item" rules (so that even when the rules match the longer strings, they will later be overwritten), then I will do the 7 part rules, then I will do the remaining 10 items rules (but you could easily add ^ to the start and $ to the end (^([a-zA-Z0-0]*)_([a-zA-Z0-0]*)_([a-zA-Z0-0]*)_([a-zA-Z0-0]*)$) to ensure that it's an exact match: 

 

Jennifer_Dungan_0-1680665984873.pngJennifer_Dungan_1-1680665990857.png

 

Jennifer_Dungan_2-1680665997348.png

 

^ Ignoring the fact that I dumped most of my rules into Test 1 instead of proper classifications (so I kept overwriting the values), you can see that my highlighted sample rows, populating Test 2 with "email" or "paid search" or "display" actually came out correctly based on looking for a specific number of parts, and having them process in the correct order...

 

Now, IF you have two different types of campaign taxonomies, and they have the same number of values being passed, hopefully one of the values can help you determine a difference between them, and you can build that check into the regex to separate them out from one another.

 

Testing your rules is very important, and I would suggest testing with both sample data, like I did.. and get some real collected data and add into the Rule Tester to make sure that everything processes as expected.

Avatar

Level 2

@Jennifer_Dungan  Thank you. 

I can successfully classify the internal campaigns using the classification rule builder. Some additional queries 
1) If we use a classification rule builder for classification on some campaigns & then decide to use  Classification importer, will that cause any problems or overriding issues? Which one will take precedence? 
2) If we purely use classification importer, then we use classification rule builder only to split the campaign parameters (highlighted two-sided arrow) & with no need to classify the data (line 5 red lined). Is my understanding correct? 
Jennifer_Dungan_0-1680665984873.png

3) In marketing channel processing rules, what additional information does "Set the channel value to" provide us in the reports? We are already identifying the channel as Email in this case.
Instead of using the "Query String parameter " (as shown below), we use Tracking Code contains "eml" etc... Will there be any difference in using QSP vs. Tracking code? 
Marketing channel processing rule.png