{"id":603,"date":"2024-02-09T16:07:41","date_gmt":"2024-02-09T21:07:41","guid":{"rendered":"https:\/\/www.digitaldatatactics.com\/?p=603"},"modified":"2025-04-22T11:13:06","modified_gmt":"2025-04-22T15:13:06","slug":"the-adobe-launch-rule-sandwich","status":"publish","type":"post","link":"https:\/\/www.digitaldatatactics.com\/index.php\/2024\/02\/09\/the-adobe-launch-rule-sandwich\/","title":{"rendered":"The Adobe Launch &#8220;Rule Sandwich&#8221;"},"content":{"rendered":"\n<p><em>(Update- I have <a href=\"https:\/\/www.digitaldatatactics.com\/index.php\/2025\/04\/17\/the-rule-sandwich-now-for-the-websdk\/\">a version of this for the WebSDK<\/a> now)<\/em><\/p>\n\n\n\n<p>I&#8217;ve <a href=\"https:\/\/www.digitaldatatactics.com\/index.php\/2018\/01\/30\/dtm-launchs-rule-ordering-is-a-big-deal-for-single-page-apps\/\" data-type=\"URL\" data-id=\"https:\/\/www.digitaldatatactics.com\/index.php\/2018\/01\/30\/dtm-launchs-rule-ordering-is-a-big-deal-for-single-page-apps\/\">mentioned before<\/a> how much I love that Launch* can &#8220;stack&#8221; all sorts of rules- by which I mean multiple rules of varying scopes can combine together into a single analytics beacon. <\/p>\n\n\n\n<p>This means (using an example from that old post) I can have a global rule that sets my universal variables, a rule for search results, a rule for filters, a rule for null search results, and a rule that fires the beacon, all resulting in a single beacon where all the variables might be coming from a different rule. I call this a &#8220;Rule Sandwich&#8221;:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><a href=\"https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2024\/02\/image-5.png\"><img loading=\"lazy\" decoding=\"async\" width=\"536\" height=\"259\" src=\"https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2024\/02\/image-5.png\" alt=\"\" class=\"wp-image-992\" style=\"width:395px;height:auto\" srcset=\"https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2024\/02\/image-5.png 536w, https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2024\/02\/image-5-300x145.png 300w\" sizes=\"(max-width: 536px) 100vw, 536px\" \/><\/a><\/figure>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><a href=\"https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2024\/02\/image-6.png\"><img loading=\"lazy\" decoding=\"async\" width=\"530\" height=\"195\" src=\"https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2024\/02\/image-6.png\" alt=\"\" class=\"wp-image-993\" style=\"width:403px;height:auto\" srcset=\"https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2024\/02\/image-6.png 530w, https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2024\/02\/image-6-300x110.png 300w\" sizes=\"(max-width: 530px) 100vw, 530px\" \/><\/a><\/figure>\n\n\n\n<p>That particular example may be a bit overkill, but this ability to divide up your variables by scope can be key to a scaleable implementation. <\/p>\n\n\n\n<p>As a programmer, there are some <a href=\"https:\/\/workat.tech\/machine-coding\/tutorial\/software-design-principles-dry-yagni-eytrxfhz1fla\" data-type=\"link\" data-id=\"https:\/\/workat.tech\/machine-coding\/tutorial\/software-design-principles-dry-yagni-eytrxfhz1fla\">coding best practices<\/a> we should all try to follow:<\/p>\n\n\n\n<ul>\n<li>Don&#8217;t Repeat Yourself (DRY): If you can find a <strong>single<\/strong> place to set a variable, do it. Don&#8217;t set site section in every page that has a site section- set it in a global place that can dynamically set the right value from the data layer.<\/li>\n\n\n\n<li>Keep It Simple, Stupid (KISS): Daisy-chaining Direct Call Rules can quickly complicate an implementation and introduce multiple points of failure. Huge Switch statements in code can make it hard to find specific dimensions or events.<\/li>\n\n\n\n<li>Principal of Least Astonishment: People who encounter your setup shouldn&#8217;t have any surprises. If the next person who signs in to your Launch property says &#8220;oh, wow&#8221; or needs a &#8220;eureka&#8221; moment, you may have over-engineered things. <\/li>\n<\/ul>\n\n\n\n<p>Following those principals, here&#8217;s the &#8220;Sandwich&#8221; set up I most like to use:<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"globalVars\">The bottom slice: Global Variables<\/h2>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"alignleft size-full is-resized\"><a href=\"https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2024\/02\/image-8.png\"><img loading=\"lazy\" decoding=\"async\" width=\"440\" height=\"380\" src=\"https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2024\/02\/image-8.png\" alt=\"\" class=\"wp-image-995\" style=\"width:170px;height:auto\" srcset=\"https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2024\/02\/image-8.png 440w, https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2024\/02\/image-8-300x259.png 300w\" sizes=\"(max-width: 440px) 100vw, 440px\" \/><\/a><\/figure><\/div>\n\n\n<p>My first rule sets my universal variables- things like site section, campaign, login state, user ID, etc. Stuff where I can say &#8220;if it exists in the data layer, I want it in my beacon&#8221;. It is set up to fire on all triggers that might end up in an analytics beacon. If you&#8217;re using the Adobe Client Data Layer extension and all your rules are triggered by your ACDL data layer, then this can be pretty simple, thanks for &#8220;Listen to All Events&#8221;:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2023\/01\/image-1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"879\" height=\"262\" src=\"https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2023\/01\/image-1.png\" alt=\"\" class=\"wp-image-858\" srcset=\"https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2023\/01\/image-1.png 879w, https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2023\/01\/image-1-300x89.png 300w, https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2023\/01\/image-1-768x229.png 768w\" sizes=\"(max-width: 879px) 100vw, 879px\" \/><\/a><\/figure>\n\n\n\n<p>But I&#8217;ve also had setups like this:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2023\/01\/image.png\"><img loading=\"lazy\" decoding=\"async\" width=\"913\" height=\"118\" src=\"https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2024\/02\/image-edited.png\" alt=\"\" class=\"wp-image-1000\" srcset=\"https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2024\/02\/image-edited.png 913w, https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2024\/02\/image-edited-300x39.png 300w, https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2024\/02\/image-edited-768x99.png 768w\" sizes=\"(max-width: 913px) 100vw, 913px\" \/><\/a><\/figure>\n\n\n\n<p>I add &#8220;#1&#8221; to the trigger name and rule name to indicate that these are triggered with a rule order of 1:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2023\/01\/image-2.png\"><img loading=\"lazy\" decoding=\"async\" width=\"238\" height=\"189\" src=\"https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2023\/01\/image-2.png\" alt=\"\" class=\"wp-image-859\"\/><\/a><\/figure>\n\n\n\n<p>Which means for any given trigger**, this will be the first rule to fire. In this rule, I set any variables that can be applied globally- usually things like page name, site section, page type, language, etc.<\/p>\n\n\n\n<p id=\"sequencing\">*<em>*A note about sequencing: the order for rules only applies <strong>when rules share a common trigger<\/strong>. If you have a rule that fires on DOM Ready, and a rule that fires on a &#8220;page view&#8221; event in your data layer when DOM Ready occurs, even if they happen at the exact same time, Launch won&#8217;t compare their order to see which comes first. The rules would either both have to be triggered on DOM Ready, or both triggered on the &#8220;page view&#8221; event. <\/em><\/p>\n\n\n\n<p><em>The Analytics extension does a great job of keeping everything in sequence.  In other words, if I have a rule with an order of 1 that sets analytics variables I can be confident that a rule with the same trigger with an order of 50 will apply its analytics variables only after the first rule has finished.<\/em> (<em>However, Custom Code blocks will <strong>not<\/strong> wait for earlier-ordered custom code blocks from other rules to finish. If I have a rule with an order of 1 that runs some script in a custom code action, I can&#8217;t know for sure that script will have finished before code in a separate rule with an order of 50 happens.<\/em>)<\/p>\n\n\n\n<p>You might ask &#8220;<strong>Why don&#8217;t you use the Adobe Analytics Extension&#8217;s global variables?<\/strong>&#8221; <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2023\/01\/image-4.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"667\" src=\"https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2023\/01\/image-4-1024x667.png\" alt=\"\" class=\"wp-image-861\" srcset=\"https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2023\/01\/image-4-1024x667.png 1024w, https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2023\/01\/image-4-300x196.png 300w, https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2023\/01\/image-4-768x501.png 768w, https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2023\/01\/image-4.png 1249w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>The problem with these is they only evaluate once, when the extension first kicks in on page load (<a href=\"https:\/\/experienceleaguecommunities.adobe.com\/t5\/adobe-experience-platform-launch\/aae-have-adobe-analytics-global-variables-fire-on-all-aa-rules\/idc-p\/409734#M1044\" data-type=\"URL\" data-id=\"https:\/\/experienceleaguecommunities.adobe.com\/t5\/adobe-experience-platform-launch\/aae-have-adobe-analytics-global-variables-fire-on-all-aa-rules\/idc-p\/409734#M1044\" target=\"_blank\" rel=\"noreferrer noopener\">go upvote my idea if you, too, want it to behave differently<\/a>). So if you clear variables, they disappear and won&#8217;t come back until the next page load. And if you try to pass new values- maybe the language preference changed, or maybe you have a SPA and need to pass a new page name- the extension won&#8217;t pick those up. <\/p>\n\n\n\n<p>Many folks use the doPlugins function for this purpose, because it fires on every beacon. There&#8217;s a few reasons I avoid this when I can: <\/p>\n\n\n\n<ol>\n<li>I try to keep my variables out of code as much as possible- the more transparency in the interface, the better.<\/li>\n\n\n\n<li>I try to keep doPlugins light. With default settings, <a href=\"https:\/\/webanalyticsfordevelopers.com\/2016\/04\/05\/when-exactly-does-doplugins-run\/\" data-type=\"URL\" data-id=\"https:\/\/webanalyticsfordevelopers.com\/2016\/04\/05\/when-exactly-does-doplugins-run\/\">it runs on every click<\/a>, whether that click results in a beacon or not. <\/li>\n\n\n\n<li>doPlugins is the LAST thing to fire before a beacon is sent to Adobe, meaning any customization I&#8217;ve done in other rules might be overwritten. <\/li>\n<\/ol>\n\n\n\n<p>Which brings me back to my #1 rule that fires on all of my common triggers. I set my global variables, and that&#8217;s it- no sending a beacon (yet). <\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The middle of the sandwich- the &#8220;fillings&#8221;<\/h2>\n\n\n\n<figure class=\"wp-block-image size-large is-resized\"><a href=\"https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2024\/02\/image-9.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"495\" src=\"https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2024\/02\/image-9-1024x495.png\" alt=\"\" class=\"wp-image-996\" style=\"width:542px;height:auto\" srcset=\"https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2024\/02\/image-9-1024x495.png 1024w, https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2024\/02\/image-9-300x145.png 300w, https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2024\/02\/image-9-768x372.png 768w, https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2024\/02\/image-9.png 1488w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Next come all my sandwich fillings: the rules that set variables based on more specific scenarios. Any logic that needs to only fire under certain conditions go here. It&#8217;s where I set events, set any user-action-specific dimension, and hard code any values. <\/p>\n\n\n\n<p>These rules might be triggered by a page view under certain conditions (like &#8220;pageType of article&#8221;), or based on a specific event or element interaction. <\/p>\n\n\n\n<p>So I might have a rule that fires on page view if the page type is equal to &#8220;article&#8221;:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2024\/02\/image-14.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1004\" height=\"701\" src=\"https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2024\/02\/image-14.png\" alt=\"\" class=\"wp-image-1005\" srcset=\"https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2024\/02\/image-14.png 1004w, https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2024\/02\/image-14-300x209.png 300w, https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2024\/02\/image-14-768x536.png 768w\" sizes=\"(max-width: 1004px) 100vw, 1004px\" \/><\/a><\/figure>\n\n\n\n<p>(In theory, I could set something like content.title in my global variables rule, because it will only set if the data layer currently has a value, but I&#8217;d rather keep all my blog stuff together and not make my global rule evaluate data elements unless they&#8217;re needed.)<\/p>\n\n\n\n<p>I may also use these rules to customize\/fix anything that had been set in my global variables. In an ideal world, data layers would be perfect and we&#8217;d never have to &#8220;fix&#8221; anything in Launch. But this isn&#8217;t that ideal world. My global variables might set the page type as &#8220;search results&#8221;, then later I realize our other search results page has a page type of &#8220;search&#8221;. Obviously, I should go to the devs and ask them to make it consistent. But in the meantime, I can use an &#8220;filling&#8221; rule to overwrite what was set in my global variables rule.<\/p>\n\n\n\n<p>Not everything merits its own rule. If the scope only calls for a single extra event to be set, I could probably just do that in my global rule with a conditional JavaScript statement. But something like Purchase Confirmation, which has its own product string, purchaseID, etc&#8230; that makes sense as an &#8220;filling&#8221; rule. I try to find a balance between not having too many rules, and not having any single rule be super complicated. <\/p>\n\n\n\n<h2 class=\"wp-block-heading\" id=\"topSlice\">The top slice: Send Beacon and Clear Vars<\/h2>\n\n\n\n<p>For any situation where many rules might all contribute to the same beacon- for example, page views- you can have the top piece of the sandwich as a rule with an order of 100, which fires the beacon and clears the variables. <\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2023\/04\/image-1.png\"><img loading=\"lazy\" decoding=\"async\" width=\"672\" height=\"548\" src=\"https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2023\/04\/image-1.png\" alt=\"\" class=\"wp-image-922\" srcset=\"https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2023\/04\/image-1.png 672w, https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2023\/04\/image-1-300x245.png 300w\" sizes=\"(max-width: 672px) 100vw, 672px\" \/><\/a><\/figure>\n\n\n\n<p>If you have global <strong>page view<\/strong> variables- stuff you want on all page views but not necessarily all beacons- you could also put them here. <\/p>\n\n\n\n<p>Note, splitting the &#8220;set variables&#8221; (our fillings) and the &#8220;send beacon&#8221; (our top slice) like this makes the most sense in a situation where you&#8217;ll have many potential rules all needing a beacon. Page Views is the best use case. Having a single separate &#8220;Send Beacon&#8221; rule makes it so if you have a few dozen page-specific Page Load rules, you don&#8217;t have to add the beacon and the clear vars action to all of them. It&#8217;s a time-saver, and a way to guarantee whatever the combination of filling rules, a single beacon will fire.<\/p>\n\n\n\n<p>But in cases where there&#8217;s just one rule contributing to a beacon- something like a certain button click, for instance- then there isn&#8217;t much advantage to having a single &#8220;set variables&#8221; rule and a separate single &#8220;send beacon\/clear vars&#8221; rule.  You can combine your &#8220;fillings&#8221; and your &#8220;top slice&#8221; into a single rule, like this: <\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><a href=\"https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2024\/02\/image.png\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"437\" src=\"https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2024\/02\/image-1024x437.png\" alt=\"\" class=\"wp-image-986\" srcset=\"https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2024\/02\/image-1024x437.png 1024w, https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2024\/02\/image-300x128.png 300w, https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2024\/02\/image-768x328.png 768w, https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2024\/02\/image.png 1037w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><\/figure>\n\n\n\n<p>Clear Variables makes sure that variables (and particularly events) from earlier beacons won&#8217;t accidentally get attached to something they don&#8217;t belong to. Different folks handle &#8220;Clear Variables&#8221; differently. Some people set it at the beginning of rules (or sequences of rules). I find it easiest to always set it any time I fire a beacon, so I don&#8217;t have to worry about where in the sequence of things I&#8217;m clearing my variables.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Put It All Together (Examples)<\/h2>\n\n\n\n<p>Following this approach, my rules list might look like this:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><a href=\"https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2024\/02\/image-3.png\"><img loading=\"lazy\" decoding=\"async\" width=\"586\" height=\"498\" src=\"https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2024\/02\/image-3.png\" alt=\"\" class=\"wp-image-989\" style=\"width:521px;height:auto\" srcset=\"https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2024\/02\/image-3.png 586w, https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2024\/02\/image-3-300x255.png 300w\" sizes=\"(max-width: 586px) 100vw, 586px\" \/><\/a><\/figure>\n\n\n\n<p>(I tend to not put &#8220;#50&#8221; in the name of rules- it&#8217;s the defaultiest option; it can be assumed if no other order is specified. I also don&#8217;t specify &#8220;clear vars&#8221; in rule names anywhere- to me, it&#8217;s implied with any beacon being sent. See my post <a href=\"https:\/\/www.digitaldatatactics.com\/index.php\/2022\/06\/21\/tmsbp-naming-and-meta\/\" data-type=\"link\" data-id=\"https:\/\/www.digitaldatatactics.com\/index.php\/2022\/06\/21\/tmsbp-naming-and-meta\/\">about rule naming conventions<\/a>.) <\/p>\n\n\n\n<p>On my search results page (which fires on a &#8220;page view&#8221; ACDL event where page type=&#8221;search results&#8221;), these rules would fire, in this order:<\/p>\n\n\n\n<ul>\n<li>All Events | ACDL Any Event | Analytics: Set global vars #1<\/li>\n\n\n\n<li>Search Result Views | ACDL Page View | Analytics: Set vars (#50)<\/li>\n\n\n\n<li>All Page Views | ACDL Page View | Analytics: Send s.t, clear vars #100<\/li>\n<\/ul>\n\n\n\n<p>On a Search Filter click, the following would fire:<\/p>\n\n\n\n<ul>\n<li>All Events | ACDL Any Event | Analytics: Set global vars #1<\/li>\n\n\n\n<li>Search Filters | ACDL Search Filter | Analytics: Set vars, send s.tl beacon (#50)<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n\n\n\n<p>There are, of course, many &#8220;correct&#8221; ways to architect a TMS; this is just the one that has worked best for me across many organizations, particularly if they have a reliable event-driven data layer. I will say, it can get complicated if you&#8217;re using a wide variety of rule triggers, like page bottom, clicks on this but NOT clicks on that, form submission, element enters viewport, etc&#8230; the&#8221; &#8220;Top Slice&#8221;\/Global Vars Rule&#8217;s list of triggers can get very unwieldy. And sadly, if you have a very Direct-Call-Rule-based implementation, since there is no out-of-the-box &#8220;fire on all direct calls&#8221;, you may find resorting to doPlugins is the simplest, most scaleable route. Your mileage may vary.<\/p>\n\n\n\n<p>I&#8217;d love to hear what has worked for others!<\/p>\n\n\n\n<figure class=\"wp-block-image size-full is-resized\"><a href=\"https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2024\/02\/image-11.png\"><img loading=\"lazy\" decoding=\"async\" width=\"705\" height=\"590\" src=\"https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2024\/02\/image-11.png\" alt=\"\" class=\"wp-image-998\" style=\"width:428px;height:auto\" srcset=\"https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2024\/02\/image-11.png 705w, https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2024\/02\/image-11-300x251.png 300w\" sizes=\"(max-width: 705px) 100vw, 705px\" \/><\/a><\/figure>\n\n\n\n<p><em>No AI was used in this post. Images are good old-fashioned paid stock images.<\/em><\/p>\n\n\n\n<p><em>*I&#8217;m still not going to call it &#8220;Adobe Experience Platform Data Collection Tags&#8221;. <\/em><\/p>\n","protected":false},"excerpt":{"rendered":"<p>(Update- I have a version of this for the WebSDK now) I&#8217;ve mentioned before how much I love that Launch* can &#8220;stack&#8221; all sorts of rules- by which I mean multiple rules of varying scopes can combine together into a single analytics beacon. This means (using an example from that old post) I can have &#8230; <a title=\"The Adobe Launch &#8220;Rule Sandwich&#8221;\" class=\"read-more\" href=\"https:\/\/www.digitaldatatactics.com\/index.php\/2024\/02\/09\/the-adobe-launch-rule-sandwich\/\" aria-label=\"Read more about The Adobe Launch &#8220;Rule Sandwich&#8221;\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[23,44],"tags":[72,30,45,42],"_links":{"self":[{"href":"https:\/\/www.digitaldatatactics.com\/index.php\/wp-json\/wp\/v2\/posts\/603"}],"collection":[{"href":"https:\/\/www.digitaldatatactics.com\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.digitaldatatactics.com\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.digitaldatatactics.com\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.digitaldatatactics.com\/index.php\/wp-json\/wp\/v2\/comments?post=603"}],"version-history":[{"count":13,"href":"https:\/\/www.digitaldatatactics.com\/index.php\/wp-json\/wp\/v2\/posts\/603\/revisions"}],"predecessor-version":[{"id":1183,"href":"https:\/\/www.digitaldatatactics.com\/index.php\/wp-json\/wp\/v2\/posts\/603\/revisions\/1183"}],"wp:attachment":[{"href":"https:\/\/www.digitaldatatactics.com\/index.php\/wp-json\/wp\/v2\/media?parent=603"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.digitaldatatactics.com\/index.php\/wp-json\/wp\/v2\/categories?post=603"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.digitaldatatactics.com\/index.php\/wp-json\/wp\/v2\/tags?post=603"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}