{"id":294,"date":"2017-11-20T15:48:05","date_gmt":"2017-11-20T15:48:05","guid":{"rendered":"https:\/\/www.digitaldatatactics.com\/?p=294"},"modified":"2018-03-01T19:52:43","modified_gmt":"2018-03-01T19:52:43","slug":"adobe-dtm-launch-improvements-for-single-page-apps","status":"publish","type":"post","link":"https:\/\/www.digitaldatatactics.com\/index.php\/2017\/11\/20\/adobe-dtm-launch-improvements-for-single-page-apps\/","title":{"rendered":"Adobe DTM Launch: Improvements for Single Page Apps"},"content":{"rendered":"<p>For those following the new release of Adobe&#8217;s DTM, known as Launch, I have a new blog post up at <a href=\"\/\/blog.cognetik.com\/2017\/11\/15\/adobe-dtm-launch-improvements-for-single-page-apps\/?utm_source=JenBlog\">the Cognetik blog<\/a>, cross-posted below:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-1845\" src=\"\/\/blog.cognetik.com\/wp-content\/uploads\/2017\/11\/Screen-Shot-2017-11-13-at-17.39.51.png\" sizes=\"(max-width: 1868px) 100vw, 1868px\" srcset=\"\/\/blog.cognetik.com\/wp-content\/uploads\/2017\/11\/Screen-Shot-2017-11-13-at-17.39.51.png 1868w, \/\/blog.cognetik.com\/wp-content\/uploads\/2017\/11\/Screen-Shot-2017-11-13-at-17.39.51-300x155.png 300w, \/\/blog.cognetik.com\/wp-content\/uploads\/2017\/11\/Screen-Shot-2017-11-13-at-17.39.51-768x398.png 768w, \/\/blog.cognetik.com\/wp-content\/uploads\/2017\/11\/Screen-Shot-2017-11-13-at-17.39.51-1024x531.png 1024w\" alt=\"\" width=\"1868\" height=\"968\" \/>It\u2019s finally here! Adobe released the newest version of DTM, known as \u201cLaunch\u201d. <span class=\"c21\"><a class=\"c12\" href=\"\/\/www.google.com\/url?q=\/\/blogs.adobe.com\/digitalmarketing\/customer-experience\/adobe-cloud-platform-launch-is-here\/&amp;sa=D&amp;ust=1510362387816000&amp;usg=AFQjCNFMHmCYRYSZWDSDcEDtij-ZHHQHsQ\" target=\"_blank\" rel=\"noopener\">There are already some great resources<\/a><\/span><span class=\"c0\"> out there going over some of the new features (presumably including plenty of \u201cLaunchey Launch\u201d puns), which includes:<\/span><\/p>\n<ul class=\"c17 lst-kix_so9jzjn8zxq4-0 start\">\n<li class=\"c3 c2\"><span class=\"c0\">Extensions\/Integrations<\/span><\/li>\n<li class=\"c3 c2\"><span class=\"c0\">Better Environment Controls\/Publishing Flow<\/span><\/li>\n<li class=\"c3 c2\"><span class=\"c0\">New, Streamlined Interface<\/span><\/li>\n<\/ul>\n<p class=\"c2 c10\">But there is one thing I\u2019ve been far more excited about than any other: Single Page App compatibility. I\u2019ve mentioned on <span class=\"c21\"><a class=\"c12\" href=\"\/\/www.google.com\/url?q=\/\/www.digitaldatatactics.com\/index.php\/2016\/04\/20\/how-do-i-use-dtm-for-a-single-page-app\/&amp;sa=D&amp;ust=1510362387819000&amp;usg=AFQjCNHvc656A3zy-uLz6gVTplYqSJ6lQw\" target=\"_blank\" rel=\"noopener\">my personal blog<\/a><\/span><span class=\"c0\"> some of the problems the old DTM has had with Single Page Apps:<\/span><\/p>\n<ul class=\"c17 lst-kix_po9ni022g802-0 start\">\n<li class=\"c2 c3\"><span class=\"c0\">Page Load Rules (PLRs) can\u2019t fire later than DOMready<\/span><\/li>\n<li class=\"c3 c2\"><span class=\"c0\">Event-Based Rules (EBRs) and Direct Call Rules (DCRs) can\u2019t \u201cstack\u201d (unlike PLRs, there\u2019s a 1:1 ratio between rules and analytics beacons, so you can\u2019t have one rule set your global variables, and another set section-specific variable, and another set page-specific variables, and have them all wrap into a single beacon)<\/span><\/li>\n<li class=\"c3 c2\"><span class=\"c0\">It can be difficult to fire s.clearVars at the right place (and impossible without some interesting workarounds)<\/span><\/li>\n<li class=\"c3 c2\"><span class=\"c0\">Firing a \u201cVirtual Page Load\u201d EBR at the right time (after your data layer has updated, for instance) can be tricky.<\/span><\/li>\n<\/ul>\n<p class=\"c2 c10\"><span class=\"c0\">So much of this is solved with the release of DTM Launch.<\/span><\/p>\n<ul class=\"c17 lst-kix_2flmbb18o47u-0 start\">\n<li class=\"c3 c2\"><span class=\"c0\">You can have one rule that fires EITHER on domReady OR on a trigger (Event-based or Direct Call).<\/span><\/li>\n<li class=\"c3 c2\"><span class=\"c0\">You have a way to fire clearVars.<\/span><\/li>\n<li class=\"c3 c2\"><span class=\"c0\">You can add conditions\/exclusions to Direct Call rules<\/span><\/li>\n<\/ul>\n<p class=\"c2 c10\"><span class=\"c0\">There are other changes coming that will improve things even further, but for now, these changes are pretty significant for Single Page apps.<\/span><\/p>\n<h2 id=\"h.olod07vwi0nz\" class=\"c18\"><span class=\"c19\">Multiple Triggers on a Single Rule<\/span><\/h2>\n<p class=\"c2 c10\">If I have a Single Page App, I\u2019ll want to track when the user first views a page, the same as for a \u201ctraditional\u201d non-App page. So if I\u2019m setting EBRs or DCRs for my \u201cVirtual Page Views\u201d, I\u2019d need to account for this \u201cTraditional Page Load\u201d page view for the user\u2019s initial entry to my app.<br \/>\nIn the past, I\u2019d either have a Page Load Rule do this (if I could be sure my Event-Based Rules wouldn\u2019t also run when the page first loaded), or I could do all my tracking with Event-Based Rules, and I\u2019d have to <span class=\"c21\"><a class=\"c12\" href=\"\/\/www.google.com\/url?q=\/\/www.digitaldatatactics.com\/examples\/DCRsuppress.html&amp;sa=D&amp;ust=1510362387825000&amp;usg=AFQjCNGclYIoNMKUK2BqHHw2VxAi4wfnYA\" target=\"_blank\" rel=\"noopener\">suppress that initial page view beacon<\/a><\/span><span class=\"c0\">. I may end up with an identical set of rules- one for when my page truly loads, and one for \u201cVirtual Page Views\u201d.<\/span><\/p>\n<p class=\"c2 c10\">Now, I can do this in a single rule:<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"size-medium wp-image-1811 aligncenter\" src=\"\/\/digitaldatatactics.com\/images\/fireworks.gif\" alt=\"\" width=\"300\" height=\"205\" \/><\/p>\n<p>Where my \u201cCore- Page Bottom\u201d event fires when the page first loads (like an old Page Load Rule):<\/p>\n<p><a href=\"\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2017\/11\/1-Core-Page-Bottom.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-409\" src=\"\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2017\/11\/1-Core-Page-Bottom.png\" alt=\"\" width=\"768\" height=\"377\" srcset=\"https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2017\/11\/1-Core-Page-Bottom.png 768w, https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2017\/11\/1-Core-Page-Bottom-300x147.png 300w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/><\/a><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-1807 aligncenter\" src=\"\/\/blog.cognetik.com\/wp-content\/uploads\/2017\/11\/image7.png\" sizes=\"(max-width: 575px) 100vw, 575px\" srcset=\"\/\/blog.cognetik.com\/wp-content\/uploads\/2017\/11\/image7.png 872w, \/\/blog.cognetik.com\/wp-content\/uploads\/2017\/11\/image7-300x147.png 300w, \/\/blog.cognetik.com\/wp-content\/uploads\/2017\/11\/image7-768x377.png 768w\" alt=\"\" width=\"575\" height=\"282\" \/><\/p>\n<p>\u2026and another \u201cPage Name Changed\u201d event that fires when my \u201cpage name\u201d Data Element changes (like an old Event-Based Rule):<\/p>\n<p><a href=\"\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2017\/11\/2-Page-Name-Changed.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-410\" src=\"\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2017\/11\/2-Page-Name-Changed.png\" alt=\"\" width=\"768\" height=\"377\" srcset=\"https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2017\/11\/2-Page-Name-Changed.png 768w, https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2017\/11\/2-Page-Name-Changed-300x147.png 300w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/><\/a><\/p>\n<p>No more need to keep separate sets of rules for Page Load Rules and Virtual page views!<\/p>\n<h2 id=\"h.ukx9awj675t8\" class=\"c18\"><span class=\"c19\">Clearing variables with s.clearVars()<\/span><\/h2>\n<p class=\"c2 c10\"><span class=\"c0\">Anyone who has worked on a Single Page App, or on any Adobe Analytics implementation with multiple s.t() beacons on a single DOM, has felt the pain of variables carrying over from beacon to beacon. Once an \u201cs\u201d variable (like s.prop1) exists on the page, it will hang around and be picked up by any subsequent page view beacon on that page.<br \/>\n<\/span><\/p>\n<table class=\"c11\">\n<tbody>\n<tr class=\"c15\">\n<td class=\"c7\" colspan=\"1\" rowspan=\"1\" width=\"25%\"><\/td>\n<td class=\"c27\" colspan=\"1\" rowspan=\"1\" width=\"18.75%\">\n<p class=\"c2\"><span class=\"c4\" style=\"font-size: 80%;\">Page 1<\/span><\/p>\n<\/td>\n<td class=\"c5\" colspan=\"1\" rowspan=\"1\" width=\"18.75%\">\n<p class=\"c2\"><span class=\"c13\" style=\"font-size: 80%;\">Page 2<\/span><\/p>\n<\/td>\n<td class=\"c23\" colspan=\"1\" rowspan=\"1\" width=\"18.75%\">\n<p class=\"c2\"><span class=\"c4\" style=\"font-size: 80%;\">Page 3<\/span><\/p>\n<\/td>\n<td class=\"c14\" colspan=\"1\" rowspan=\"1\" width=\"18.75%\">\n<p class=\"c2\"><span class=\"c4\" style=\"font-size: 80%;\">Page 4<\/span><\/p>\n<\/td>\n<\/tr>\n<tr class=\"c15\">\n<td class=\"c7\" colspan=\"1\" rowspan=\"1\">\n<p class=\"c2\"><strong style=\"font-size: 80%;\">s.pageName<\/strong><\/p>\n<\/td>\n<td class=\"c27\" colspan=\"1\" rowspan=\"1\">\n<p class=\"c2\"><span class=\"c4\" style=\"font-size: 80%; color: #008000;\">Landing<\/span><\/p>\n<\/td>\n<td class=\"c5\" colspan=\"1\" rowspan=\"1\">\n<p class=\"c2\"><span class=\"c13\" style=\"font-size: 80%; color: #008000;\">Search Results <\/span><\/p>\n<\/td>\n<td class=\"c23\" colspan=\"1\" rowspan=\"1\">\n<p class=\"c2\"><span class=\"c4\" style=\"font-size: 80%; color: #008000;\">PDP &gt; Red Wug <\/span><\/p>\n<\/td>\n<td class=\"c14\" colspan=\"1\" rowspan=\"1\">\n<p class=\"c2\"><span class=\"c4\" style=\"font-size: 80%; color: #008000;\">Product List <\/span><\/p>\n<\/td>\n<\/tr>\n<tr class=\"c15\">\n<td class=\"c7\" colspan=\"1\" rowspan=\"1\">\n<p class=\"c2\"><strong><span class=\"c16\" style=\"font-size: 80%;\">s.events<\/span><\/strong><\/p>\n<\/td>\n<td class=\"c29\" colspan=\"1\" rowspan=\"1\">\n<p class=\"c2\"><span class=\"c4\" style=\"font-size: 80%; color: #008000;\">(blank) <\/span><\/p>\n<\/td>\n<td class=\"c1\" colspan=\"1\" rowspan=\"1\">\n<p class=\"c2\"><span class=\"c13\" style=\"font-size: 80%; color: #008000;\">event14<\/span><\/p>\n<\/td>\n<td class=\"c26\" colspan=\"1\" rowspan=\"1\">\n<p class=\"c2\"><span class=\"c4\" style=\"font-size: 80%; color: #008000;\">prodView<\/span><\/p>\n<\/td>\n<td class=\"c25\" colspan=\"1\" rowspan=\"1\">\n<p class=\"c2\"><span class=\"c9\" style=\"font-size: 80%; color: #ff0000;\">prodView<\/span><\/p>\n<\/td>\n<\/tr>\n<tr class=\"c15\">\n<td class=\"c7\" colspan=\"1\" rowspan=\"1\">\n<p class=\"c2\"><strong><span class=\"c16\" style=\"font-size: 80%;\">s.eVar1 (search term)<\/span><\/strong><\/p>\n<\/td>\n<td class=\"c6\" colspan=\"1\" rowspan=\"1\">\n<p class=\"c2\"><span class=\"c4\" style=\"font-size: 80%; color: #008000;\">(blank)<\/span><\/p>\n<\/td>\n<td class=\"c22\" colspan=\"1\" rowspan=\"1\">\n<p class=\"c2\"><span class=\"c13\" style=\"font-size: 80%; color: #008000;\">Red Wug<\/span><\/p>\n<\/td>\n<td class=\"c20\" colspan=\"1\" rowspan=\"1\">\n<p class=\"c2\"><span class=\"c9\" style=\"font-size: 80%; color: #ff0000;\">Red Wug<\/span><\/p>\n<\/td>\n<td class=\"c28\" colspan=\"1\" rowspan=\"1\">\n<p class=\"c2\"><span class=\"c9\" style=\"font-size: 80%; color: #ff0000;\">Red Wug<\/span><\/p>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p class=\"c2 c10\"><span class=\"c0\">My pageName variable is fine because I\u2019m overwriting it on each page, but my Search Term eVar value is hanging around past my Search Results page! And on pages where I don\u2019t write a new events string, the most recent event hangs around!<\/span><\/p>\n<p class=\"c2 c10\">In the old DTM, I had a few options for solving this. I could do <span class=\"c21\"><a class=\"c12\" href=\"\/\/www.google.com\/url?q=\/\/www.digitaldatatactics.com\/examples\/DCR.html&amp;sa=D&amp;ust=1510362387846000&amp;usg=AFQjCNFc2x-3VqLFxDE752T_8bVH_MsGLw\">some bizarre things<\/a><\/span> to daisy-chain DCRs to make sure I could get the right order of setting variables, firing beacons, then clearing variables. Or, I could <span class=\"c21\"><a class=\"c12\" href=\"\/\/www.google.com\/url?q=\/\/www.digitaldatatactics.com\/index.php\/2016\/04\/20\/setting-up-an-event-based-rule-that-be-fired-directly-like-a-direct-call-rule\/%23clearVars&amp;sa=D&amp;ust=1510362387848000&amp;usg=AFQjCNHlHgLzIYmaGqCFDPF3nlo8REaJeQ\">use a hack in the \u201cCustom Code\u201d conditions of an Event-Based Rule<\/a><\/span>, to ensure s.clearVars would run before I started setting beacons. Or, more recently, I could use <span class=\"c21\"><a class=\"c12\" href=\"\/\/www.google.com\/url?q=\/\/webanalyticsfordevelopers.com\/2017\/10\/17\/using-the-new-callbacks-for-tracking\/&amp;sa=D&amp;ust=1510362387849000&amp;usg=AFQjCNEX88woLbmWXlyzZcPQOUP0C1uVog\">s.registerPostTrackCallback to run the s.clearVars function<\/a><\/span><span class=\"c0\"> after the s_code detected an s.t function was called.<\/span><\/p>\n<p class=\"c2 c10\">Now, it\u2019s as simple as specifying that my rule should set my variables, then send the beacon, then clear my variables:<\/p>\n<p><a href=\"\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2017\/11\/3-actions.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-411\" src=\"\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2017\/11\/3-actions.png\" alt=\"\" width=\"768\" height=\"152\" srcset=\"https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2017\/11\/3-actions.png 768w, https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2017\/11\/3-actions-300x59.png 300w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/><\/a><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-1802 aligncenter\" src=\"\/\/blog.cognetik.com\/wp-content\/uploads\/2017\/11\/image2.png\" sizes=\"(max-width: 641px) 100vw, 641px\" srcset=\"\/\/blog.cognetik.com\/wp-content\/uploads\/2017\/11\/image2.png 858w, \/\/blog.cognetik.com\/wp-content\/uploads\/2017\/11\/image2-300x59.png 300w, \/\/blog.cognetik.com\/wp-content\/uploads\/2017\/11\/image2-768x152.png 768w\" alt=\"\" width=\"641\" height=\"127\" \/><\/p>\n<p class=\"c2 c10\"><span class=\"c0\">Directly in the rule- no extra rules, no custom code, no workarounds!<\/span><\/p>\n<h2 id=\"h.pjyn69lm7n24\" class=\"c18\"><span class=\"c19\">Rule Conditions on ALL Rule Types (including Direct Call)<\/span><\/h2>\n<p class=\"c2 c10\">If I were using Direct Call Rules for my SPA, in the past, I\u2019d have to account for Direct Call Rules having a 1:1 relationship with their trigger. If I had some logic I needed to fire on Search Results pages, and other logic to fire on Purchase Confirmation pages, I could have my developers fire a different \u201c_satellite.track\u201d function on every page:<\/p>\n<p><a href=\"\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2017\/11\/4-DCRs.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-412\" src=\"\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2017\/11\/4-DCRs.png\" alt=\"\" width=\"300\" height=\"263\" \/><\/a><\/p>\n<p class=\"c2 c10\">Then in each of those rules, I\u2019d maintain all my global variables as well as any logic specific to that beacon. This could be difficult to maintain and introduces extra work and many possible points of failure for developers.<\/p>\n<p class=\"c2 c10\"><span class=\"c0\">Or, I could have my developers fire a global <em>_satellite.track(\u201cpage view\u201d) <\/em>on every page, and in that one rule, maintain a ridiculous amount of custom code like this:<\/span><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-1801 aligncenter\" src=\"\/\/blog.cognetik.com\/wp-content\/uploads\/2017\/11\/image1.png\" sizes=\"(max-width: 535px) 100vw, 535px\" srcset=\"\/\/blog.cognetik.com\/wp-content\/uploads\/2017\/11\/image1.png 801w, \/\/blog.cognetik.com\/wp-content\/uploads\/2017\/11\/image1-300x166.png 300w, \/\/blog.cognetik.com\/wp-content\/uploads\/2017\/11\/image1-768x424.png 768w\" alt=\"\" width=\"535\" height=\"295\" \/><\/p>\n<p><a href=\"\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2017\/11\/5-DCR-custom-code.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-413\" src=\"\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2017\/11\/5-DCR-custom-code.png\" alt=\"\" width=\"768\" height=\"424\" srcset=\"https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2017\/11\/5-DCR-custom-code.png 768w, https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2017\/11\/5-DCR-custom-code-300x166.png 300w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/><\/a><\/p>\n<p class=\"c2 c10\"><span class=\"c0\">This would take me entirely out of the DTM interface, and make some very code-heavy rules (not ideal for end-user page performance, or for DTM user experience \u2014 here\u2019s hoping your developer leaves nice script comments!)<\/span><\/p>\n<p class=\"c2 c10\"><span class=\"c0\">Now, I can still have my developers set a single <em>_satellite.track(\u201cpage view\u201d)<\/em> (or similar), and s<\/span><span class=\"c0\">et a myriad of rules in Launch, each using that same \u201cpage view\u201d trigger, but each with a condition so you can set different variables in different rules directly in the interface when your developers fire <em>_satellite.track(\u201cpage view\u201d)<\/em> on your Search Results versus when they fire<em> _satellite.track(\u201cpage view\u201d)<\/em> on your Purchase Confirmation page:<\/span><\/p>\n<p><a href=\"\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2017\/11\/6-Purchase-Confirmation.png\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone size-full wp-image-414\" src=\"\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2017\/11\/6-Purchase-Confirmation.png\" alt=\"\" width=\"768\" height=\"317\" srcset=\"https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2017\/11\/6-Purchase-Confirmation.png 768w, https:\/\/www.digitaldatatactics.com\/wp\/wp-content\/uploads\/2017\/11\/6-Purchase-Confirmation-300x124.png 300w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/><\/a><\/p>\n<p><img loading=\"lazy\" decoding=\"async\" class=\"wp-image-1804 aligncenter\" src=\"\/\/blog.cognetik.com\/wp-content\/uploads\/2017\/11\/image4.png\" sizes=\"(max-width: 539px) 100vw, 539px\" srcset=\"\/\/blog.cognetik.com\/wp-content\/uploads\/2017\/11\/image4.png 1016w, \/\/blog.cognetik.com\/wp-content\/uploads\/2017\/11\/image4-300x124.png 300w, \/\/blog.cognetik.com\/wp-content\/uploads\/2017\/11\/image4-768x317.png 768w\" alt=\"\" width=\"539\" height=\"223\" \/><\/p>\n<p>I\u2019d love to say all my SPA woes were solved with this release, but to show I haven\u2019t entirely drunk the Kool-aid, I will admit some of my most wished-for features (and extensions) aren\u2019t in this first release of Launch. I know they\u2019re coming, though- future releases of Launch will add additional features that will make implementing on a Single Page App even simpler, but for now, it still feels like Christmas came early this year.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>For those following the new release of Adobe&#8217;s DTM, known as Launch, I have a new blog post up at the Cognetik blog, cross-posted below: It\u2019s finally here! Adobe released the newest version of DTM, known as \u201cLaunch\u201d. There are already some great resources out there going over some of the new features (presumably including &#8230; <a title=\"Adobe DTM Launch: Improvements for Single Page Apps\" class=\"read-more\" href=\"https:\/\/www.digitaldatatactics.com\/index.php\/2017\/11\/20\/adobe-dtm-launch-improvements-for-single-page-apps\/\" aria-label=\"Read more about Adobe DTM Launch: Improvements for Single Page Apps\">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":[7,23,47],"tags":[41,8,42],"_links":{"self":[{"href":"https:\/\/www.digitaldatatactics.com\/index.php\/wp-json\/wp\/v2\/posts\/294"}],"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=294"}],"version-history":[{"count":4,"href":"https:\/\/www.digitaldatatactics.com\/index.php\/wp-json\/wp\/v2\/posts\/294\/revisions"}],"predecessor-version":[{"id":440,"href":"https:\/\/www.digitaldatatactics.com\/index.php\/wp-json\/wp\/v2\/posts\/294\/revisions\/440"}],"wp:attachment":[{"href":"https:\/\/www.digitaldatatactics.com\/index.php\/wp-json\/wp\/v2\/media?parent=294"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.digitaldatatactics.com\/index.php\/wp-json\/wp\/v2\/categories?post=294"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.digitaldatatactics.com\/index.php\/wp-json\/wp\/v2\/tags?post=294"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}