Skip navigation
All Places > Products > Blog
1 2 3 Previous Next

Products

393 posts

As you already know (right?) Marketo-hosted Landing Pages can be accessed with or without a trailing .html in the path part of the URL.[1]

 

So these URLs are aliases for the same content:

 

https://pages.example.com/myoffer?utm_medium=email
https://pages.example.com/myoffer.html?utm_medium=email

 

From a Marketo perspective, then, it’s merely a cosmetic choice.  (Personalized URLs are an exception, which I’ll explain in the notes.[2])

 

However, when you add 3rd-party trackers like the ubiquitous Google Analytics, those packages can’t know out-of-the-box that the URLs are equivalent. As far as GA knows, your webserver may well treat them differently: they are, after all, different URLs.

 

(/myoffer.html, /myoffer.rss, /myoffer.json etc. could deliver very different content. Some web apps use resources differentiated only by their “extension” to switch content types.[3] The extension-less /myoffer would probably be an alias for one of the types, but GA couldn’t know which one.)

 

With Marketo knowledge in hand, you’ll want to bridge the gap in GA so hits are combined. Otherwise, you see reports like this:

 

 

Since this was a Marketo LP, you know there were only 3 unique pieces of content at maximum loaded, but GA recorded 5 different URLs because it couldn’t know better.

 

Note: I’m not talking about query parameter removal. That’s another, well-covered matter, and GA has a built-in feature for it. For today, treat ?foo=bar and ?foo=baz as if they displayed substantively different content to the end user (perhaps via runtime segmentation). When that doesn’t apply to your LPs, you should also use Exclude URL Query Parameters. But today is about Marketo showing the same content with or without .html at the end of the path.


Valiant, and not so valiant, efforts

Many people have written so-called HOWTOs for this task. As far as I can see, zero of them are correct.[4] Distressingly, include Google’s own docs in the “incorrect” category.

 

All the authors knew to use a Search and Replace filter in the Analytics console. (With some, their knowledge stopped there.)

 

Most attempts are almost-right, but show the telltale sign that the author doesn’t actually know what constitutes a valid URL.

 

That’s the thing: even if you’re a regular expression expert, like truly world-class (which I do not claim to be), that doesn’t help if you’re wrong about what you need to match! Unless a regex is pathologically inefficient, a clunky-but-correct one is fine… a slick-short-but-wrong one is never OK.

 

Anyway, here’s a take I’ve suggested myself, to my shame:

 

 

If you can’t read the screenshot, that’s:

 

Search String:  \.html(\?|$)
Replace String: \1

 

In English-ish:

 

Search for the character sequence “.html” when it’s immediately followed either by the question mark symbol “?” or by the end of the string.


Replace whatever you found with just the question mark (if you originally found a “?”) or with the end-of-string anchor (if there was no “?”).[5]

 

Sounds right, eh? A question mark starts the query string. So the expression finds .html right before the query string, i.e. at the end of the path. When there is no query string, it finds .html at the very end of the URL. Then it chops what it found out of the string, without changing anything else.

 

Apply that filter and you indeed get a cleaner report like this, which will strip the .html in the path and group pageviews accordingly:

 

But something ain’t quite right.


What’s missing

Look closer at the above screenshot. Page 3, after filtering, is:

 

/ga-page-01?referringpage=offsite

 

Problem is, the page the user actually viewed was

 

https://pages.example.com/ga-page-01.html?referringpage=offsite.html

 

Oops. You stripped the .html from the path, yes. But you also mistakenly stripped the .html from the query string.

 

“A filename in the query string?” you ask. Sure, why not? It’s completely valid, and might contain valuable information about lead attribution. By inadvertently affecting the query string, you could change the meaning of the person’s journey.

 

“OK,” you say, “but that only happened because it was at the very end of the query string. It couldn’t happen in the middle of the query string, because the query can’t have a question mark inside it.”

 

Oh yeah? Check out this (completely valid) URL:

 

https://pages.example.com/ga-page-01.html?referringpage=offsite.html?linkedin&referringplacement=89607

 

“Wha? Two question marks?”

 

Absolutely. The URL standard (RFC 3986) says the ? character delimits (separates) the path or hostname part from the query part, but only when the ? appears in a particular position. And after that position, it’s possible to have a literal (unescaped) ?. So you can have another ? in the query string itself.

 

You can also have, to name a couple of other surprises, a : in the query string (not just in the protocol) and slashes in the query string (not just in the path). https://www.example.com/?:a/?:b/?:c/?:d is a valid URL – one almost guaranteed to confuse, but valid.


Forget Expand what you know about delimiters

The key is that delimiter characters in a URL don’t work the same as delimiters in, say, a CSV. The CSV delimiter , keeps its special meaning across multiple occurrences:

 

First Name,Last Name,Company,Email Address,City,State,Postal Code

 

In contrast, the delimiters in a URL lose their special meaning based on whether they’ve already been used once and/or if they’re in a non-special position. The rules are too complex to be reviewed here, but you should read the RFC.

 

Such details are why writing your own URL parser is by no means easy. Many little pieces of code out there are broken, because they naïvely split on delimiters without looking at the order of delimiters.


Getting it right(er)

Now we know to not only anchor the .html just before a ?, but also to make sure it’s the first ? in the URL.

 

Like so:

 

 

Plain text:

 

Search String:  ^([^?]+)\.html(\?|$)
Replace String: \1\2

 

English-esque:

 

Search for the sequence “.html” when it (a) follows a block of text, *starting from the beginning of the string,* that’s at least 1 character long and has no “?” symbols and (b) is immediately followed by a “?” symbol or by the end of the string.

 

Replace what you found with the text before the “.html” (whatever it was) concatenated with the text after the “.html” (if any).

 

Now we properly strip only the .html that was at the end of the path:

 



I still left out the #hash (URL fragment)

By default, GA won’t track the #hash part of your URLs at all. And if you are using the #hash meaningfully (say, in an older-school Single-Page Application) your web developers will have already worried about it and figured out the right custom GA hits + filters.

 

But… in the interest of completeness, it’s also possible for the string .html to appear in the URL fragment:

 

https://pages.example.com/mypage.html#ref:pageonsomeothersite.html

 

The “right(er)” regex above will erroneously truncate pageonsomeothersite.html to pageonsomeothersite in the hash – like how the initial regex mistakenly trimmed .html in the query string. For full coverage, change your regex to:

 

^([^?#]+)?\.html(\?|#|$)

 

If you followed the regex breakdown above, this should make sense.

 

 


Notes

[1] Yes, I’m being super-precise – the URI standard has no concept of a “filename,” just the /slash/separated/part known as the path. The path might have one or more segments that happen to look like files in a filesystem. One of those might correspond to a physical file on the server, but doesn’t have to.

 

[2] When you use pURLs, you can’t use the .html extension and the Marketo Unique Code/Marketo Unique Name at the same time. You have to use the extension-less form, https://pages.example.com/offer/XYXPDQ.

 

[3] Admittedly, those are usually service or API URLs and not the main URL in the Location bar. But you never know, and the safest bet is to assume URLs are different for a reason. Note response type switching is more RESTfully done using the Accept: header, but that only works where it can be customized.

 

[4] To be fair, most of the authors are SEO mavens by trade, so they cross-publish – and some suggestions are outright stolen – so there really isn’t much original content.

 

[5] Re-replacing the end-of-string $ doesn’t actually do anything, as it’s just a position.

To newbie developers (and to non-developers) there are 2 ways to sort text: “alphabetically ascending” or “alphabetically descending.” That’s it.

 

By “alphabetically,” those folks mean case-insensitive sort order, where uppercase/lowercase pairs (in the local language) are treated as the same letter.

 

But if they simply say “sort alphabetically” to a more technical person, without any additional flavor, they’re likely to get results in another order – by far the more computationally efficient order[1]case-sensitive, purely lexicographic sort order.

 

This is a great example of the simple-but-huge communication gaps between techies and non-techies (and, I must say, a good reason for project managers to exist to clarify stuff).

 

Both sides are acting in good faith. The inexperienced/non-techie person is using what, to them, is the only meaning (not just the informal meaning) of “alphabetically.” The techie isn’t being pretentious, as programming tools and practices favor their interpretation. But this gap can cause “broken” code (in one party’s eyes) and much finger-pointing.

 

What side is Velocity on?

To see which definition Velocity uses, let’s make a short list of names, then sort it (ascending order is the default with SortTool), then output it:

 

#set( $names = ["alex", "CHARLIE", "bob", "Dora"] )
#set( $sortedNames = $sorter.sort( $names ) )
Names: $display.list( $sortedNames, "," )

 

The output:

 

Names: CHARLIE,Dora,alpha,bob

 

OK.

 

The fact that C and D come before a and b is not a bug. That’s the hallmark of case-sensitive comparison, which only cares about the position in the Unicode table. The uppercase letters A-Z, codepoints 65-90, all come before letters a-z, codepoints 97-122.

 

This result seems to prove that $sorter.sort uses the higher-speed, case-sensitive lexicographic order.[2]

 

Not so fast.

 

Let’s try sorting a list of objects on a String property of each object. That property, name, will have exactly the same values as above.

 

#set( $objects = [
{ "name" : "alex" },
{ "name" : "CHARLIE" },
{ "name" : "bob" },
{ "name" : "Dora" }
])
#set( $objectsSortedByName = $sorter.sort( $objects, "name" ) )
Objects: $display.list( $objectsSortedByName, "," )

 

The output:

 

Objects: {name=alex},{name=bob},{name=CHARLIE},{name=Dora}

 

Whoa, whoa... that is in case-insensitive order by name, and we didn’t do anything special!

 

What’s happening?

It’s like this.

 

  • When Velocity sorts a List of Strings, it uses the native String.compareTo function, which is case-sensitive (or again, case-ignorant).
  • When Velocity sorts a List of other Objects (i.e. Maps) on a common property of each it checks first to see if the property has the String type[3] and if so, uses String.compareToIgnoreCase, whose name is self-explanatory.

 

So the answer to the question Does Velocity sort case-sensitively or case-insensitively? is: Yes. (Sorry for the YouTube-comment-style humor.)

 

There’s no built-in way to change the first behavior into the second, nor vice versa. They’re just different code paths based on the type of the List. The arbitrary (and undocumented) difference is debatably a bug (as you’ll see more of if you work on the challenge below) but that’s the way it is.


What we’d like to do, but can’t

If we had a full-fledged Java environment we could write a custom Comparator or an overridden compareTo function to ensure that we knew exactly what type of sorting would happen when. In some underinformed Velocity guides around the web, there’s an underlying assumption that you can “just” have your Java developer export new helper functions and extended classes into the Velocity context and “just” use those.

 

But in Marketo’s Velocity environment, as well as any environment where coders are confined to just what’s in Velocity now, you have to use what you’re given. (Even more so since Marketo’s June 2019 changes.)

 

So our workarounds all have to be written in VTL.


Making a List of Strings sort like a List of Objects

If you want to sort Strings like non-String Objects, you have to

 

  • wrap them in Objects
  • sort the Objects by the String property
  • use the String property of each Object going forward

 

Easy to write, though unavoidably clunky:

 

#set( $names = ["alex", "CHARLIE", "bob", "Dora"] )
#set( $namesWrappedInObjects = [] )
#foreach( $word in $names )
#set( $void = $namesWrappedInObjects.add({ "name" : $word }) )
#end
#set( $objectsSortedByName = $sorter.sort( $namesWrappedInObjects, "name" ) )
$display.list( $objectsSortedByName, ",", ",", "name" )

 

The output:

 

Names: alex,bob,CHARLIE,Dora

 

To review:

 

  • create a new empty List (ArrayList, [] in Velocity) $namesWrappedInObjects
  • for each String in the original List, create a new Map (LinkedHashMap, {}) and set its property name to the original String’s value
  • add each Map to the new List
  • sort the new List on name

 

I also printed the new List using the advanced form of $display.list that grabs just a single property. This was just for consistency with the original example, your business reqs may not involve direct output.

 

It works, but at the expense of allocating a new List + new Maps and more lines of code.


Making a List of Objects sort like a List of Strings

The reverse is more complex. Imagine you wanted to sort a List of Objects by a property, but in the more machine-y, less human-y lexicographic order. (Granted, in a marketing email it’s hard to imagine this requirement, but Velocity can be used for more than emails.)

 

Luckily, we know a List of just Strings will be lexicographically sorted. So we’re going to:

 

  • create a new empty List
  • for each Object in the original List, get the value of the interesting String property (name in in today’s examples)
  • add the String value to the new List
  • sort the new List (a List of Strings, hence lex’ly sorted)
  • go back over the original List
  • for each Object in the original List, set a new Integer property that corresponds to the String property’s position in the separately lex’ly-sorted List; here that property name will be lexOrder
  • sort the original List on the new lexOrder property (as this is a numeric property, it’s an ascending numeric sort)

 

Clunkier even than the above, but it works:

 

#set( $objects = [
{ "name" : "alex" },
{ "name" : "CHARLIE" },
{ "name" : "bob" },
{ "name" : "Dora" }
])
#set( $comparableValuesOnly = [] )
#foreach( $object in $objects )
#set( $void = $comparableValuesOnly.add($object.name) )
#end
#set( $lexoSortedComparables = $sorter.sort($comparableValuesOnly) )
#foreach( $object in $objects )
#set( $void = $object.put("lexOrder", $lexoSortedComparables.indexOf($object.name) ) )
#end
#set( $objectsSortedLex = $sorter.sort( $objects, "lexOrder" ) )
Objects: $display.list( $objectsSortedLex, "," )

 

The output:

 

Objects: {name=CHARLIE, lexOrder=0},{name=Dora, lexOrder=1},{name=alex, lexOrder=2},{name=bob, lexOrder=3}

 

 

When working with the now-sorted list, you can ignore the lexOrder property, as it no longer has any significance. (If the name lexOrder were already in use, you could use any other property name, it just has to be one you know.)


Conclusion: Again, Velocity aint easy

This isn’t the only place in which Velocity is wildly, even impressively inconsistent! You can’t simply guess how it works, you must take time to learn. It’s not at all simple to write correctly functioning, resilient VTL... and those who deny its complexity, upcoming smiley notwithstanding, shouldn’t be in your instance.


Parting challenge

Above, I showed how to sort a list of objects by a String property in ascending lexicographic order, using the separately computed lexOrder property.

 

Now: How might you sort a list of objects by that same property in descending lexicographic order? Let me know in the comments.

 

 


Notes

[1] It’s dramatically easier on CPU resources to do a case-sensitive sort: for large blocks of text, you save millions of operations. It just makes sense as the default. More on this in another post.

 

[2] More precise than “case-sensitive” might be “case-ignorant,” as there’s no applied knowledge of case pairs. But that gets confused with “ignoring” in the sense of “treating uppercase/lowercase pairs as the same character.” Ugh, language.

 

[3] Assuming all the names are Strings. There are other ramifications, most of them them fatal, if you mix types. Again, more later.

*Posted on behalf of Zack Blois - Senior Manager, Platforms and Automation at Jellyvision*

 

Tip #1: Utilize a combination of Bizible’s touchpoint objects and your first-party data in your CRM to get demographic data on who is interacting with marketing activities along, and what they are interacting with least and most. 

 

By adding custom formula fields that stamp your first-party data from other CRM objects onto Bizible Touchpoint (BT) and Bizible Attribution Touchpoint (BAT) data points, you can begin to leverage demographic, firmographic, etc. data within your existing Bizible reports, dashboards, etc. 

 

To do this, identify field values within your CRM that would be helpful to report on in reference to your Bizible Touchpoint data. Then create formula fields that reference the related object’s value to stamp those values on the Bizible object. From a reporting standpoint, this allows you to bring in granular pieces of data from the contact, account, and opportunity (or any other Object) level. 

 

This is extremely valuable because it provides demographic data on who is interacting with marketing touchpoints. Apply this to all the rich data that Bizible serves up: 

  • Different types of touchpoints 
  • When different demographics interact with the Sales Cycle 
  • What those demographics are interacting with the most and least 

 

 

Note: The example above requires creating a custom report and custom field.

 

Tip #2: Use Touchpoint Suppression to set time constraints in regard to whether or not a touchpoint receives credit. 

 

As your Bizible instance matures, your first touch data can become extremely dated. Depending on how long your customer journey can take, there are times you don’t want to give attribution for a touchpoint that occurred 3 or 4 years ago. 

 

With the Touchpoint Suppression capability within Bizible, you can determine the types of touchpoints you want to look at, and set windows for when you want to set attribution and give credit. For example, by using an integer field operator, you can see how many days a touchpoint occurred prior to the opportunity creation. 

 

Set the suppression limit to whatever works for your business (i,e, 1 year). This allows you to really customize your attribution window instead of being beholden to a very long tailed view where first touch occurred multiple years ago. 

 

 Note: The example above requires creating custom segmentation

 

Tip #3 - Use the activity object in SFDC and the CRM Activity Settings in Bizible to bring Sales activities into the larger attribution picture. 

 

In SFDC, create and define Bizible Touchpoints via tasks. Use the task object in SFDC and operators in Bizible to catalogue BDR, SDR, or AE emails that come out of Outreach (or any other sales automation tool that  creates activities as touchpoints).

 

With Bizible operators at the task level, you can identify different elements of the task. For example, if you see a task that has a subject line of “email” that means that the email came from Outreach, and you would then want a touchpoint created to show that sales activity.

 

 

By using this activity functionality that is within Bizible to create touchpoints, Sales becomes a part of the larger attribution picture. 

 

Hello Marketing Nation,

 

Thanks for tuning into the third edition of our limited Sneak Preview series, where we preview all the exciting changes coming to Community in January 2020. Today, we’ll be discussing how gamification will work on your new Community – check out the details below!

 

Level and Points Mapping: Perhaps the gamification aspects our customers care about the most are levels and points. You’re probably wondering - what’s going to happen to them?! Worry not, levels will mostly remain the same, with there being a total of 10 levels. We have worked closely with our integration teams to ensure that the level you were at in the old community remains the same on the new platform. That being said, some of you may see that you are 1 level higher or lower than usual. As always, if you notice a significant change in your level (i.e. if you were originally level 5 and are now level 3), please feel free to message me and we’ll work something out!

With the move over to a new platform, points will no longer be visible to our customers. Though there will still be a points system to track user level progression, it is a backend system that is not public facing by default. We understand how important points are to you, so we are hard at work building a custom solution to make your points visible to you in the future!

 

Migrating Badges: On our current community, there are a plethora of badges that Marketo awards for completion of specific activities. Some of these badges also have multiple tiers, with the threshold to complete each tier increasing at every level. In order to maintain a similar gamification environment, most of these achievements will remain the same. However, some badges rely on the completion of actions that will no longer be trackable – such as voting in polls. As a result, a some Community badges will be migrated over as “legacy” badges, meaning that these badges will be visible on your profile, but will no longer be attainable on the new platform.  

 

The following badges on our current Community will be migrated over as “legacy” badges:

 

Groupie – Join a group of interest to you.

Sociable – Post a status update.

Bookworm – Bookmark 3 pieces of content.

Opinionated – Rate 3 pieces of content.

Likely Voter – Vote in 3 polls.

You’re It – Tag 3 pieces of content.

Onboarding - Add an avatar to your profile, add 2 or more skills to your profile, follow another member, and like our Community Guidelines.

Get Comfortable – Vote on an idea, create a discussion or question, and reply to a discussion or question.

Influencer – Get followed by other members.

Ideator – Receive votes on your ideas.

Helpful – Have your reply marked helpful.

Appreciative – Mark replies to your question as helpful.

Seal of Approval – Mark responses as correct.

 

Champion and Champion Alumni Badges: Champion and Champion Alumni badges are important badges that we give out to members and former members of the Marketo Champion Program. These badges help distinguish our Champion and Alumni members as validated experts when they post or respond to content on Community. We understand how important these badges are to our community members, so all existing Champions and Champion Alumni will maintain their badges moving forward. Please note that once 2020 Marketo Champions have been announced, badge statuses will be updated accordingly.

 

Specialization Badges: Expertise badges are given out to partners for specialization in a specific aspect of the Marketo product. These badges, such as Account Based Marketing Expertise or Mobile Expertise, will be migrated and attainable on the new Community. Please note that Specialization Badges are only given to partners and internal associates. The only way to get Specialization Badges is to present to a MCSA board, showcasing project work in the specialized areas. More information on how to acquire this certification can be found here.

 

Improved Gamification Model: In this first phase of our migration, our main focus has been to map over as much of the existing gamification model onto the new platform. Moving forward, we are looking to significantly up-level the gamification experience by adding more badges, profile customizations, community privileges, themes, and more! If you’d like to influence the future of our gamification platform, or even if you’ve seen great examples of other gamified communities, please comment below or reach out to me directly!

 

 

That wraps up our third Sneak Preview! I hope you are as excited as I am about these changes – coming soon to the Marketing Nation! If you have any questions or concerns, let me know in the comments below or reach out to me at jonchen@adobe.com. Stay tuned for our last Sneak Preview next month, where we’ll be covering our new Support page. Hope you all have a wonderful holiday season! 

*Posted on behalf of internal Bizible expert Pierre Cirac*

 

Summarizing your Opportunities’s Bizible Attribution Touchpoint data by the field ‘Marketing Channel’ is the highest level view that represents what channels/tactics are influencing new Opportunities into creation. Structuring this report around a ‘Date Type’ = “Opportunity Created Date” ensures that we’re also summarizing the report based on when the Opportunity was actually created in your CRM. The touchpoints may have been from sometime prior, but they will still relate to the Opportunities that have been created within the defined Date Range and thus receive attribution credit as they are recognized as influencing the Opportunity. 

 

Question

What marketing channels are influencing Opportunities into creation?

Report Type

Bizible Attribution Touchpoints with Opportunities (CRM)

Metric: Opportunities (Bizible Discover)

Filters

  • Opportunity Stage (only Open Opportunities should be in the report) OR
  • Opportunity Closed = False
  • Opportunity Type (its common to filter in on certain Opportunities i.e. ‘New Business’ as opposed to all Opportunities)

* A Segment filter for ‘Opportunity Type’ should be leveraged in Bizible Discover

Date Field / Date Type

Opportunity Created Date (CRM) / Created Date (Discover)

Date Range

select desired date range

Group / Dimension

Marketing Channel

Optimal Models

W-Shaped

*SUM the ‘W-Shaped’ fields in your CRM reports (Count - W-Shaped, Revenue - W-Shaped)

 

Pro Tip #1: For any ‘Bizible Attribution Touchpoints with Opportunities’ report type, start by customizing the pre-built report titled ‘Bizible 101 | Opportunities by Channel’. This report is available out-of-the box and is a great sandbox pre-built as described in the table above and can be quickly customized for more specific reporting needs (report uses a Full Path model out-of-the-box so be sure to customize the report to include any other attribution model, in this case, the W-Shaped model).

 

Pro Tip #2: The report outlined above would also be used when looking to understand how much currency should also be attributed. When reporting at the Opportunity level using BATs, there are two key metrics that be summarized: currency (the amount of the Opportunity) and the Opportunity record itself. In the example above, we’re more specifically measuring open Opportunities and new pipeline revenue. 

 

Pro Tip #3: Get even more granular insight by summarizing the report with other available fields from the Bizible Attribution Touchpoint object. This is done in the same way it was at the Lead level with Bizible Touchpoints. Do this by adding additional groupings (CRM) or dimensions (Discover). Depending on the channel (which may be representative of your role), there may be additional details beyond the campaign level in which you’re looking to gain more insight. Let’s drill into ‘Paid Search’ for example:

 

Question

Which keywords from my Paid Search ads are generating the most pipeline revenue?

Report Type

Bizible Attribution Touchpoints with Opportunities (CRM)

Metric: Pipeline Revenue (Bizible Discover)

Filters

  • Marketing Channel = Paid Search
  • Opportunity Stage (only Open Opportunities should be in report) OR, 
  • Opportunity Closed = False 
  • Opportunity Type (its common to filter in on certain Opportunities i.e. ‘New Business’ as opposed to all Opportunities)

* A Segment filter for ‘Opportunity Type’ should be leveraged in Bizible Discover

Date Field / Date Type

Opportunity Created Date

Date Range

select desired date range

Group / Dimension

Keyword Text (CRM)

Keyword (Discover)

Optimal Models

W-Shaped

*SUM the ‘W-Shaped’ fields in your CRM reports (Count - W-Shaped, Revenue - W-Shaped)

 

Related Resources:

Reporting on Bizible Attribution Touchpoints: Deals by Marketing Channel

Reporting on Bizible Attribution Touchpoints: ROI

Reporting on Bizible Touchpoints: Leads with Bizible Touchpoints

Reporting on Bizible Touchpoints: Marketing Qualified Leads with Bizible Touchpoints

Reporting on Bizible Touchpoints: Bizible Persons with Bizible Touchpoints

Champion Tips & Tricks: Bizible Edition with Justin Norris

Bizible - The ABCs of Marketing Attribution

*Posted on behalf of internal Bizible expert Pierre Cirac*

 

Deals by Marketing Channel

This report would essentially be the same as the New Opportunities by Marketing Channel example except the metric has now changed from open Opportunities to closed won Deals. The metric should always be what informs which attribution model to use. Considering we’re now looking at closed won Deals and their related BATs, we should use a model that represents the entire buyer’s journey (Deal). This ensures any marketing touch track during the buyer’s journey receives attribution credit:

 

Question

What marketing channels are influencing Deals to close?

Report Type

Bizible Attribution Touchpoints with Opportunities (CRM)

Metric: Deals (Bizible Discover)

Filters

  • Opportunity Stage (only Closed Won Opportunities should be in report) OR,
  • Opportunity Won = True
  • Opportunity Type (its common to filter in on certain Opportunities i.e. ‘New Business’ as opposed to all Opportunities)

Date Field / Date Type

Opportunity Closed Date

Date Range

select desired date range

Group / Dimension

Marketing Channel

Optimal Models

Full Path

*SUM the ‘Full Path’ fields in your CRM reports (Count - Full Path, Revenue - Full Path)

 

REMINDER: It’s crucial to remember to filter for the specific Opportunities you want to include in BAT based reporting, especially when it comes ‘Open Opportunities and Pipeline Revenue’ vs. ‘Deals and Closed Won Revenue’. This is typically done via an ‘Opportunity Stage’ filter (the ‘Opportunity Won’ = true/false filter can also be very helpful here). 

 

Related Resources: 

Reporting on Bizible Attribution Touchpoints: New Opportunities by Marketing Channel

Reporting on Bizible Attribution Touchpoints: ROI

Reporting on Bizible Touchpoints: Leads with Bizible Touchpoints

Reporting on Bizible Touchpoints: Marketing Qualified Leads with Bizible Touchpoints

Reporting on Bizible Touchpoints: Bizible Persons with Bizible Touchpoints

Champion Tips & Tricks: Bizible Edition with Justin Norris

Bizible - The ABCs of Marketing Attribution

Bizible Discover is used to understand at a high level which of your efforts are making the greatest impact on Leads, Opps, Deals and how much revenue should be attributed to them. Once we have the attributed revenue calculated via the various attribution models (Full Path is recommended for attributing closed won revenue/bookings), we can then measure it against how much was spent in the same dimension (Marketing Channel, Sub Channel, or Campaign). This then gives us the ROI.

 

Pro Tip: One of the The most important things to remember when reporting in Discover is which Data Type you’re using to filter. Data Type will dictatewhich data set Bizible is using in the various tiles. 

Touchpoint Date: Displays the related data that had a touchpoint date in the timeframe specified

Created Date: Displays the related data that had a created date in the timeframe specified

Closed Date: Displays the related data that had a closed date in the timeframe specified

 

The filters highlighted below are crucial to an ROI focused report in Bizible (most likely, you’ll be setting these filters in the ‘Overview’, ‘CMO’, or ‘ROI’ boards):

 

ROI in the ‘Overview’ Board

 

 

The ‘Date’ range not only determines the set of touchpoints (by Touchpoint Date) that are receiving attribution, but also it defines the range in which the ‘Spend’ tile or columns represent. Bizible simply looks at the ‘Date’ range to determine how much was spent either in total, or at the Marketing Channel, Sub Channel, or Campaign levels (see below):

 

 

The screenshot above shows the Marketing Spend data over the past 3 complete months. In this example, $12,970 was spent across all channels. This number is comprised of the Marketing Spend data Bizible has from integrations with any of your ads accounts (Google AdWords, Bing Ads, Facebook Ads, LinkedIn, DoubleClick) as long as they’re connected to your Bizible account, and any additional Marketing Spend that has been uploaded within your account, or pulled automatically from a Campaign records in your CRM. The example also shows how much closed won ‘Revenue’ can also be attributed to touchpoints that happened during the same date range (green boxes). This is how ROI is calculated: revenue attributed to touchpoints that were sourced from investment in the same date range:

 

 

REMINDER: Bizible defines ‘Revenue’ as closed won Revenue or Bookings and defines ‘Pipeline Revenue’ as open/potential revenue from open Opportunities. 

 

Another important takeaway from the ROI report above is the ‘Pipeline Revenue’ represented within the red box. This means that from the $12,970 USD invested over the past 3 complete months, we’re currently attributing $705,199 of closed won ‘Revenue’, but we’re also attributing $6,905,532 of open/potential revenue (‘Pipeline Revenue) to touchpoints created from the same investment! What we would expect to see is a portion of the ‘Pipeline Revenue’ close over time, feeding the ‘Revenue’ number, and thus, the ROI number would increase over time. The ‘Spend’ number is fixed because we can’t go back in time to spend more in the last 3 complete months. This is the importance of using a ‘Date Type’ of “Touchpoint Date” within any ROI reporting: It defines the amount (I)nvested, and ensures the amount of (R)evenue attributed is attributed back to the same touchpoints that were sourced from the investment (for every dollar spent, how much was made?). 

 

Pro TipFilter in on Marketing Channels, Sub Channels, and/or Campaigns in which you know the Marketing Spend data is complete and accurate. The example above is for all Marketing Channels, but if some Channels don’t have the related Marketing Spend data uploaded, the ROI reporting could be in accurate. See the example below, this time in the ‘ROI’ board that is focused on the Campaigns within the Marketing Channel of “Paid Search”, a Channel with very granular Marketing Spend data via the integrations:

 

 

Related Resources 

Reporting on Bizible Attribution Touchpoints: Deals by Marketing Channel

Reporting on Bizible Attribution Touchpoints: Opportunities by Marketing Channel

Reporting on Bizible Touchpoints: Leads with Bizible Touchpoints

Reporting on Bizible Touchpoints: Marketing Qualified Leads with Bizible Touchpoints

Reporting on Bizible Touchpoints: Bizible Persons with Bizible Touchpoints

Champion Tips & Tricks: Bizible Edition with Justin Norris

Bizible - The ABCs of Marketing Attribution

*Posted on behalf of internal Bizible expert, Elizabeth Lundberg*

 

When reporting with Bizible data the most important first step is to meet with key stakeholders across your organization to define your goals and specify key terms so that everyone is on the same page. Clearly define your organizations answers to questions like: What is a lead? What is an opportunity? How do you track renewals? What stages are important to your funnel? How do you define those stages? This will help ensure that you are putting accurate and consistent data into Bizible that will be understood across your organization. The data that you get out of Bizible is only as good as the data you put in.  

 

Once you have this alignment across your key stakeholders, you are ready to begin reporting with Bizible data! Bizible surfaces its data to two places, Bizible Discover UI and your Salesforce instance. Each platform provides unique benefits that will help you accomplish you reporting goals.  

 

Benefits of Reporting in SalesForce CRM (SFDC) 

  1. The strongest benefit of reporting in SFDC is that you are reporting in your native environment. The result of that is the ability to do a lot of filtering, and slicing and dicing of the data with Bizible fields and native filters to your SFDC instance. Since it is a native environment, this also serves as a great entry point to become more familiar with Bizible’s data because you can see how that data is being populated in SFDC. 
  2. Salesforce reporting allows you to look at your Bizible data from a variety of very granular levels. You can view every person’s individual journey and the related touchpoints, every opportunities journey and the related touchpoints, and every account and the related touchpoints. From each of these levels you can also drill into touchpoint details which can provide you granular data on that interaction.

 

 

3. Historically Salesforce reporting has been very siloed when it comes to Leads and Contact. With Bizible’s leads and contacts reporting, you can see individual touchpoints whether they were a lead or contact - those are the Bizible Person Reports. 

 

Advanced Tip: While Bizible 101 reports offer you the capability to incorporate you Salesforce fields, there may be a limitation to what fields you have access to. If you experience this limitation you can create new Bizible Custom Report types which allow you to select which of your Salesforce fields you would like to be amiable in you Bizible reports. 

 

Benefits of Reporting in Bizible Discover 

The Bizible Discover dashboards provide a high-level view of your Marketing Performance using Bizible attribution data. These aggregated dashboards provide key marketing spend and ROI data which is not available in your CRM reporting. This pre-built environment allows you to view your marketing performance in alignment with your ROI data allowing you to make actionable decisions in regards to your marketing.

 

  1. A key benefit of reporting in Discover is the ability to analyze Spend, Cost, or ROI. Bizible’s API connections pull spend from your Ads accounts to align with Marketing Spend that is uploaded for your other Marketing efforts to give you a holistic view of your spend at the Channel, Subchannel, Campaign, Creative, and Keyword level.
  2. Another key benefit when using Discover is the ability to see how your channels are performing at a high level using your Overview Board. This gives you the ability to see your marketing performance for a variety of metrics including revenue, spend, deals, pipeline revenue, opportunities, contacts, and leads. 

3. The discover boards provide you pre-built dashboards that surfaces all your Bizible data in a way that require minimal filtering and no manual creation.

 

Using SFDC and Discover Together 

Reporting Question: How are my channels performing relative to closed/won revenue? 

 

SFDC

In SFDC, you would open your pre-built Bizible Report titled Bizible 101: Opportunities by Channel and filter the report by Closed/Won Opportunities. Once you run this report, you will see the amount of Closed Won or Closed Lost Revenue associated with each channel.

 

 

Discover 

In Discover, there are multiple ways to see how your channels are performing. One way is to use the Overview Board and use the following logic: Metric is Revenue, Date Type is Close Date, and Dimension is Channel. This gives you a look at channel breakout by month. 

 

 

This is a case where it is beneficial to use SFDC and Discover together to answer the same reporting question. In SFDC, you are able to dive into all the touchpoint details, and look at the contributions of the opportunities under the channels. In Discover, the value is much more high level. You can see the same numbers being attributed to channels, but you see them side by side with high level metrics such as revenue, deals, spend, pipeline, and deal size.

*Posted on behalf of internal Marketo Marketing Operations Manager, James Leedom* 

 

One of the most important features of Bizible is its ability to have multi-level views for all members of your team, which better enables your team and drives efficiency. To show you this, I’m going to share some of my go-to Bizible Discover Dashboards. 

(Note: The images you see below are from a demo instance)

 

1. The first Discover dashboard that I utilize almost daily is the Account Based Marketing dashboard. This dashboard provides the ability to track efforts towards target accounts and the level of engagement from marketing efforts. 

 

My first go-to filter on this dashboard is the channel filter to see how certain channels such as Email or Event are performing. My other go-to filter is one of our custom segments, the “region” filter. 

 

Pro Tip: It’s helpful to have your segmentations set up and running in the same way that the business units that your company divides your database into. This enables teams around the country or around the world to look at their effect on Marketing. 

 

This will show you how many accounts you’ve been engaging with in a certain region (or constraint of your choosing). You can see the amount of Touchpoints on the account, and gain insight into why you are or aren’t engaging with them. Do you have a lack of contacts on the account? Maybe invest in building your audience on certain account types. 

 

 

2. My second Discover dashboard is the Marketing Ops role-based view. Here you can see which accounts have open opportunities and good levels of engagement. You can search just one account via the Account Name field, or you can just look at “Opportunity Name = New Business Product 1” and see all accounts, contacts, leads, and campaigns that are contributing to those opportunities. This can be great collateral for presentations and state of business type conversations. 

3. The third and probably my most-used dashboard in Discover is the Web Traffic board. I like to use this to look at which pieces of content are driving the most revenue as well as see where that traffic came from. If you group the dashboard by subchannel and then add in a filter to say “URL Contains /resources/“ (or something similar based on your content hosting page), you can see revenue per visit, how many forms were filled out, and a month over month analysis of which channels contribute most to content downloads.

 

Bizible dashboards within Discover can be used for most reporting use cases, and to save one all you’ll have to do is bookmark the link. Any changes you make will change the link, so the old one will still be valid! To learn more about additional Discover Dashboards, check out our product documentation. 

*Posted on behalf of internal Bizible expert Pierre Cirac*

 

In this post, we are focusing on reporting on Bizible Touchpoints (BTs). BTs are used for understanding all marketing interactions related to people, as they contain the complete touchpoint history for each person. As a reminder, these touchpoints are created in CRM for the anonymous First Touch, the Lead Creation Touch, and any subsequent form submission or touchpoint that you choose to sync from an offline campaign or activity. Below, we are going to dive deeper into how Bizible Touchpoints relate to the Bizible Person (Custom Object in CRM). 

 

BIZIBLE PERSONS with BIZIBLE TOUCHPOINTS

 

There’s a third custom Bizible object in Salesforce that can be very useful when reporting on people related metrics: the Bizible Person (BP). The BP solves the age-old problem of how to represent both Leads and Contacts information in the same report. It unites all BTs related to a “person” (a Bizible Person’s ID is their email address). Whether they exist as a Lead or a Contact, the BP acts as a bridge object, to help reports span across Lead and Contact, and is very useful in producing more sophisticated reports on people.

 

The Bizible Person relates to only one of the touchpoint objects, the Bizible Touchpoint (BT). This means that it can’t be leveraged for an Opportunity or revenue related metrics. A ‘Bizible Person and Bizible Touchpoints’ report type is great for understanding total engagement as it surfaces all BTs whether the BT relates to a Lead or Contact more specifically. For example - if you have a Salesforce Campaign being used to track an Event, you may have campaign members within the CRM Campaign that exist either as Leads OR Contacts. Bizible will create touchpoints for the campaign members regardless, but without the Bizible Person, standard Salesforce reporting would require two separate reports to understand how many total touchpoints you have from the Event: one that’s ‘Leads with Bizible Touchpoints’ and one that’s ‘Contacts with Bizible Touchpoints’. A few other Bizible Person based reporting use cases are listed below:

 

1. Bizible Persons who have Downloaded ‘ebooks’ or ‘whitepapers’ (total downloads)

 This report would be the same as a ‘Content’ based report at the Lead level. However, rather than looking to measure the number of attributable Leads to each piece of content, using a Bizible Persons report will be helpful in understanding the total number of downloads if the asset is gated (the total number of touchpoints would represent the total number of downloads/form submissions).

 

Question

How many people have downloaded a particular asset?

Report Type

Bizible Persons and Bizible Touchpoints (CRM)

Filters

Form URL’ CONTAINS (for example)

  • /ebook
  • /whitepaper

* The filter values above are examples only. The actual value will be based on each organizations’ URL structure.

Date Field / Date Type

Touchpoint Date (when was the asset downloaded)

Date Range

select desired date range 

Group / Dimension

Form URL

Optimal Models

* This report is less about measuring where the Leads or Contacts are coming from with an attribution model, but more about the total number of touchpoints (amount of engagement), inclusive of those after the Lead Creation Touch. With this report we’re looking to understand the amount of total engagement. The total record count of touchpoints would reflect which assets have been downloaded the most.

 

Pro Tip #1: For any ‘Leads with Bizible Persons’ report type, start by customizing the pre-built report titled ‘Bizible 101 | Leads/Contacts by Channel’. This report is available out-of-the box and is a great Bizible Persons based sandbox. It is pre-built and can be quickly customized for more specific reporting needs.

 

Pro Tip #2: You can use this report to gain insight into the total engagement of any marketing dimension from the Bizible Touchpoint object, not only content downloads as presented in the example. The report could instead be grouped or filtered on dimensions like ‘Marketing Channel’ or ‘Ad Campaign Name’ to best understand the total engagement from both Leads and Contacts in your database. Simply change the filters or groupings within the report to zero in on other dimensions represented by other fields from the touchpoint object. 

 

2. Bizible Persons who have Registered for an Event (CRM only)

 This report is only applicable if registration forms are hosted on your website(s) that Bizible is able to track digitally.

 

Question

What Marketing Channels are driving my event registrations?

Report Type

Bizible Persons and Bizible Touchpoints (CRM)

Filters

Form URL’ CONTAINS (for example)

  • /event

* The filter value above is an example only. The actual value will be based on each organizations’ URL structure.

Date Field / Date Type

Touchpoint Date (when the registration form was submitted)

Date Range

select desired date range 

Group / Dimension

Form URL

Marketing Channel

Optimal Models

* This report is less about measuring where the Leads or Contacts are coming from with an attribution model, but more about the total number of touchpoints (number of registrations), inclusive of those after the Lead Creation Touch. With this report we’re looking to gain insight into what’s driving event registrations. The total record count of touchpoints per ‘Marketing Channel’ would reflect which channels drove the most registrations.

 

The key takeaway from this report is that the Bizible Touchpoint data will also provide Marketing Channel data. While you may already have insight around the number of people who have registered for your events, this report will also provide insight into what digital Marketing Channels, Sources, and/or Campaigns are bringing people to your website to then register for the event. 

 

Pro Tip: This same approach can be taken when looking to gain insight into webinar registrations or perhaps on-demand webinar downloads (if they are a gated asset). The only difference would be the filter value in the ‘Form URL’ if those forms are hosted on unique pages of your website. The goal is the same however. It answers the questions, “which of my Marketing Channels are driving the most registrations/on-demand webinar downloads. 

 

3. Bizible Persons with Bizible Touchpoints (Touchpoint Validation)

 

Considering the Bizible Person allows us to report on all touchpoints in a single report, it is the ideal report type to use when looking to validate your data. We want to ensure we’re not overlooking any touchpoints that may reveal where, for example, there is an issue in the configuration of your ‘Marketing Channels’ (see the support articles linked below for more information about configuring your ‘Marketing Channels’).

 

Essentially, the touchpoint data will reflect what’s been tracked by Bizible and can be audited to ensure your configuration matches inputs based on things like: UTM parameter values, Referring Pages, or Campaign Types. If the touchpoint data doesn’t match your configuration, something most likely needs to be adjusted. Beyond the ‘Marketing Channel’ setup, you can look at touchpoint data to determine what touchpoints may need to be suppressed or segmented. It is recommended to audit your touchpoint data within a ‘Bizible Persons and Bizible Touchpoints’ report at the end of each month or quarter if possible. This will ensure your attribution is as accurate as possible. The ‘Bizible 101 | Leads/Contacts by Channel’ report available out-of-the-box is a great place to start. Include the following fields if they’re not already included to review some of the most crucial pieces of configuration:

 

  • Marketing Channel - Path = Marketing Channel.Sub Channel (values set in Bizible)
  • Touchpoint Source = utm_source
  • Medium = utm_medium (online touchpoints) OR CRM Campaign Type (offline touchpoints)
  • Referrer Page (used the ‘Online Channels’ configuration)
  • Landing Page - Raw (used the ‘Online Channels’ configuration) also a common input for touchpoint suppression in the ‘Touchpoint Settings’ tab of your Settings)
  • Form URL (a common input for touchpoint suppression in the ‘Touchpoint Settings’ tab of your Settings)

 

Related Resources:

Champion Tips & Tricks: Bizible Edition with Justin Norris

Bizible - The ABCs of Marketing Attribution

Reporting on Bizible Touchpoints: Leads with Bizible Touchpoints

Reporting on Bizible Touchpoints: Marketing Qualified Leads with Bizible Touchpoints

*Posted on behalf of internal Bizible expert Pierre Cirac*

 

In this post, we are focusing on reporting on Bizible Touchpoints (BTs). BTs are used for understanding all marketing interactions related to people, as they contain the complete touchpoint history for each person. As a reminder, these touchpoints are created in CRM for the anonymous First Touch, the Lead Creation Touch, and any subsequent form submission or touchpoint that you choose to sync from an offline campaign or activity. Below, we are going to dive deeper into how Bizible Touchpoints can measure MQLs. 

 

MARKETING QUALIFIED LEADS with BIZIBLE TOUCHPOINTS

One of the most common reports is focused not just on new Leads or Lead level engagement, but more specifically ‘marketing qualified leads’ (MQLs). There are a couple of different approaches when it comes to reporting on MQLs depending on what Bizible features and functionality you have access to. 

 

1. Marketing Qualified Leads by Channel (multi-touch)

 

This approach for measuring marketing’s impact on influencing MQLs is essentially a continuation of the ‘New Leads by Marketing Channel’ report, but with the additional criteria that the Leads being measured are more specifically MQLs. The U-Shaped attribution model is still recommended here to identify what marketing channels and content are generating Leads that are then likely to become an MQL:

 

Question

Which marketing channels are best at generating new Leads that become MQLs?

Report Type

Leads and Bizible Touchpoints (CRM)

Metric: Leads (Bizible Discover)

Filters

Lead Status = MQL*

*MQLs may be defined differently per organization. Ensure the Bizible report is filtered for MQLs using the same field(s) as other MQL based reports. A Segment filter would need to be created in the same way for reporting on MQLs in Bizible Discover.

Date Field / Date Type

MQL Date (or equivalent) / Created Date (Bizible Discover)

* Lead Created Date could also be used in CRM reporting if ‘MQL Date’ isn’t an option in your CRM. It’s important to keep in mind what Date Field you’re using at it defines the cohorted data set. 

Date Range

select desired date range

Group / Dimension

Marketing Channel

Optimal Models

First Touch, Lead Creation, U-Shaped

*SUM the ‘Count’ fields in your CRM reports (Count - First Touch, Count - Lead Creation, Count - U-Shaped)

 

2. Marketing Qualified Leads by Channel (single touch, CRM only)

 

This approach for measuring marketing’s impact on influencing MQLs is focused more on identifying which single touchpoint was the last touch before the Lead reached MQL. 

 

* In order to run this report, a ‘Lead Status’ value of ‘MQL’ is required to define the MQL stage for tracking purposes. If MQLs aren’t tracked via the ‘Lead Status’ field, the Custom Attribution Model with Custom Stages feature is necessary to build a custom ‘MQL’ Stage in the Bizible Account Settings *

 

Question

Which marketing channels are strongest at pushing Leads to reach the MQL status?

Report Type

Leads and Bizible Touchpoints (CRM)

*this report is only possible within CRM reporting. It is not possible to filter on certain ‘Touchpoint Position’ values in Bizible Discover*

Filters

Touchpoint Position CONTAINS “MQL”

Date Field / Date Type

MQL Date (or equivalent)

Date Range

select desired date range

Group / Dimension

Marketing Channel

Optimal Models

Because this report is filtered on a single touchpoint, the Lead level attribution models aren’t as relevant. Like the ‘Lead Engagement Report’ (1.4), the number of touchpoint records would be leveraged here to understand which channels are the strongest (each Lead would only have one MQL touchpoint).

 

Pro Tip: Explore other groupings or dimensions to gain additional insight into MQLs. As mentioned in the other ‘Leads with Bizible Touchpoints’ reports, the Bizible Touchpoint offers much more granularity than just Marketing Channel. A ‘Content’ based report could also be combined with either of the MQL reports above to better understand what content is best influencing MQLs. 

 

Related Resources: 

Champion Tips & Tricks: Bizible Edition with Justin Norris

Bizible - The ABCs of Marketing Attribution

Reporting on Bizible Touchpoints: Leads with Bizible Touchpoints

Reporting on Bizible Touchpoints: Bizible Persons with Bizible Touchpoints

*Posted on behalf of internal Bizible expert Pierre Cirac*

 

In this post, we are focusing on reporting on Bizible Touchpoints (BTs). BTs are used for understanding all marketing interactions related to people, as they contain the complete touchpoint history for each person. As a reminder, these touchpoints are created in CRM for the anonymous First Touch, the Lead Creation Touch, and any subsequent form submission or touchpoint that you choose to sync from an offline campaign or activity. Below, we are going to dive deeper into how Bizible Touchpoints relate to leads.

 

LEADS with BIZIBLE TOUCHPOINTS 

 

1. New Leads By Marketing Channel

 

Summarizing your Lead’s Bizible Touchpoint data by the field ‘Marketing Channel’ is the highest level view that represents what channels/tactics are influencing new Leads into creation. Structuring this report around a ‘Date Type’ = “Created Date” ensures a cohort of ‘net new Leads’ (when the Lead was created in your CRM) is established in the report. 

 

Question

What marketing channels are influencing Leads into creation?

Report Type

Leads and Bizible Touchpoints (CRM)

Metric: Leads (Bizible Discover)

Date Field / Date Type

Lead Created Date (CRM) / Created Date (Discover)

Date Range

select desired date range

Group / Dimension

Marketing Channel

Optimal Models

First Touch, Lead Creation, U-Shaped

*SUM the ‘Count’ fields in your CRM reports (Count - First Touch, Count - Lead Creation, Count - U-Shaped)

 

Pro Tip: For any ‘Leads with Bizible Touchpoints’ report type, start by customizing the pre-built report titled ‘Bizible 101 | Leads by Channel’. This report is available out-of-the box and is a great sandbox pre-built as described in the table above and can quickly be customized for more specific reporting needs.



2. New Leads by Campaign (or more granular insights)

 

For more granular insight into the data summarized in the ‘New Leads by Marketing Channel’ report, add an additional summary at the campaign level. This will allow you to not only understand what ‘Marketing Channels’ are driving new Leads into creation, but more specifically, what campaigns within those channels are performing the best:

 

Question

What campaigns are influencing Leads into creation?

Report Type

Leads and Bizible Touchpoints (CRM)

Metric: Leads (Bizible Discover)

Date Field / Date Type

Lead Created Date / Created Date (Discover)

Date Range

select desired date range

Group / Dimension

Ad Campaign Name (CRM) / Campaign (Discover)

Optimal Models

First Touch, Lead Creation, U-Shaped

*SUM the ‘Count’ fields in your CRM reports (Count - First Touch, Count - Lead Creation, Count - U-Shaped)

 

Pro Tip: Get even more granular insight by summarizing the report with other available fields from the Bizible Touchpoint object. Do this by setting additional groupings (CRM) or dimensions (Discover). Depending on the channel (which may be representative of your role), there may be additional details beyond the campaign level in which you’re looking to gain insight. Let’s drill into ‘Paid Search’ for example:

 

Question

Which keywords from my Paid Search ads are influencing Leads into creation?

Report Type

Leads and Bizible Touchpoints (CRM)

Metric: Leads (Bizible Discover)

Filters

Marketing Channel = Paid Search

Date Field / Date Type

Lead Created Date (CRM) / Created Date (Discover)

Date Range

select desired date range

Group / Dimension

Keyword Text (CRM) / Keyword (Discover)

Optimal Models

First Touch, Lead Creation, U-Shaped

*SUM the ‘Count’ fields in your CRM reports (Count - First Touch, Count - Lead Creation, Count - U-Shaped)

 

The level of granularity may vary by channel. The recommended approach would be to ask yourself, “what about ‘channel X’ am I looking to understand in more detail?”. Paid Search Managers may also be interested in additional dimensions such as:

  • Ad Campaign Name
  • Ad Content 
  • Ad Group

 

Events Managers however may be more interested in which specific Events or which types of Events influenced the most Leads into creation:

  • Ad Campaign Name / Salesforce Campaign = specific Event
  • Medium = Campaign ‘Type’

 

REMINDER: additional filters may need to be added to any of the report variations outlined above or below. These filters would be specific to your organization and would be something that your Marketing Ops or Sales Ops teams could help advise. It’s not uncommon for an organization to run the same filters across all reports to ensure the report is as clean and accurate as possible. Common examples could be:

 

  • Filtering out any internal records from tests, usually by email address
  • Filtering based on certain ‘Record Types’ that may be specific to your business unit

 

3. New Leads by Content (CRM only)

 

Question

What content is influencing my Leads into creation?

Report Type

Leads and Bizible Touchpoints (CRM)

Date Field

Lead Created Date

Date Range

select desired date range

Group / Dimension

Landing Page

Form URL

Optimal Models

First Touch, Lead Creation, U-Shaped



REMINDER: The two primary fields for reporting on digital content/assets are ‘Landing Page’ and ‘Form URL’. These two values may be the same if the Lead converts (submits a form) on the same page in which they “landed” (Landing Page), however, sometimes these values are different. For example, the Lead may click a link on Facebook that takes them to a page of your website (this would be the ‘Landing Page’ value). The Lead may then navigate away from that page, continue their session on the site, and end up submitting a form on another page (Form URL). This would be summarized in a single touchpoint that represents where the Lead came from (Marketing Channel), what content brought them to the site (Landing Page), and what content they ended up downloading (Form URL). ‘Form URL’ is also the go-to field for reporting on other forms not associated with downloadable content such as ‘Contact Us’ or ‘Demo Request’ forms. 

 

Pro Tip #1: get insight into specific ‘content’ with additional filters

 

  • Filter by: ‘Landing Page’ CONTAINS (for example):
  • /blog
  • /ebook
  • /webinar

 

  • OR: ‘Form URL’ CONTAINS (for example)
  • /contact
  • /demo

 

‘Content’ based reports provide great value when reporting on any part of the funnel, however they are most commonly used at the top of the funnel to provide additional insight into a Leads initial engagement. Considering “Organic Search” tends to be the strongest channel at driving initial engagement (FT), there isn’t as much ‘Campaign’ level data. ‘Content’ based reports are great for gaining insight into what’s driving Leads more specifically within the higher level Marketing Channel. 

 

4. Total Lead Engagement in a given Date Range

 

Question

What marketing channels have had the most total Lead engagement in the past (week/month/quarter)?

Report Type

Leads and Bizible Touchpoints (CRM)

Metric: Leads (Bizible Discover)

Date Field / Date Type

Touchpoint Date

Date Range

select desired date range

Group / Dimension

Marketing Channel (or more granular)

Optimal Models *

* This report is less about measuring where Leads are coming from with an attribution model but more about the total number of Touchpoints (amount of engagement), inclusive of those after the Lead Creation Touch. The total record count of Touchpoints would reflect which channels have seen the most Lead engagement. 

 

REMINDER: Basing your reports around ‘Touchpoint Date’ is the most reflective way of understanding marketing performance during a certain date range. ‘Touchpoint Date’ structures the report in a way where the attribution isn’t only related to the channel, campaign, or content, but also shows when the touchpoint occurred. This is the most effective way at understanding what marketing engagement was happening at a certain point in time and also the recommended way of measuring marketing’s impact as it compares to marketing spend invested during the same time. It is recommended when doing any marketing spend or ROI analysis. 

 

Related Resources: 

Champion Tips & Tricks: Bizible Edition with Justin Norris

Bizible - The ABCs of Marketing Attribution

Reporting on Bizible Touchpoints: Marketing Qualified Leads with Bizible Touchpoints

Reporting on Bizible Touchpoints: Bizible Persons with Bizible Touchpoints

Update: The voting deadline has been extended to Wednesday, December 11th at 11:59 p.m. EST! 


Hey Marketing Nation!

Last week the Marketo Customer Marketing team applied to win Advocate Marketing Program of the Year at Influitive's 2019 BAMMIE Awards. This award globally recognizes outstanding Customer Advocacy teams and the work they've done this year. Today, it was announced that we were selected as a finalist!

 

We stood out amongst other applicants in this category not just because of our work in Influitive, but because of our full suite of advocacy programs. From Purple Select, to our global Marketo User Groups, all the way up to the Champion Program and more, we're honored to be in a position to empower our advocates at every step of their professional career and customer journey. 

 

The winner will be chosen by popular vote. All voting will take place within our Influitive hub, Purple Select. It would mean the world to us if you could join Purple Select and vote for us daily, or as often as you can. Advocates can vote once per day between December 3rd -11th.

 

What is Purple Select?

Purple Select is one of Marketo's Customer Advocacy programs designed to facilitate engagement, networking opportunities, and best practice sharing, all in one virtual hub. All Marketo customers can sign up for Purple Select. Once inside, you gain access to a series of challenges that range from highlighting top-performing posts here on Community to exclusive speaking and interview opportunities. Completing challenges nets you points that can be redeemed on a wide array of rewards, making Purple Select the premier destination for earning amazing Marketo swag and apparel!

 

How to join: If you already have a Purple Select account, just log in and the voting challenge will be the first available challenge. If you or your peers don't have an account, sign up using the following link: https://marketo.influitive.com/join/BAMMIEs.

 

When: Tuesday, Dec 3 - Wednesday, Dec 11

 

Direct link to the challenge: If you're already logged in, the following link will take you directly to the voting challenge:

https://marketo.influitive.com/challenges/2208 

 

The winner will be announced on Thursday, December 12th at the Influitive Virtual Award Ceremony. Again, none of this is possible without the outstanding support we've received from our customers and advocates year over year, especially here on the Marketing Nation Community. Thank you for your consideration, and if you have any questions about Purple Select, the signup process, or program benefits and rewards, feel free to let me know in the comments below or reach me directly at wharmon@adobe.com

When an HTML document requests additional HTML content over Ajax (XMLHttpRequest), the browser doesn’t run the code inside <script> tags in the response.[1]

 

This is so even when the response is an otherwise-living HTML document.[2] The innards of <script> tags are still downloaded, of course, but they’re neutralized as raw text (e.g. source code) and not executed.

 

Why this matters for SPAs

Some classic multi-page apps can be (relatively) easily upgraded to (theoretically) faster single-page apps (SPAs) just by changing how links work.

 

Instead of reloading a whole new page on link click, the initial page stays put, while the next page’s URL is fetched via a background Ajax call. Then part of the main page is replaced by part of the HTML response. It’s far easier on the network, ideally easier on CPU, and faster for the end user.

 

But this change comes at a price. Previously working JS that set up form behaviors, dynamic styles, etc. won’t run when a page serves merely as a passive source of HTML markup.

 

If an Ajax framework so chooses, it might find all the scripts in the response, copy out the inner text of each, and reinject it inside new <script> elements.[3] Then and only then will the code be executed.

 

But the strictest web frameworks don’t allow you to “resuscitate” scripts in this way (even when you control both the outer page and the inner Ajax-fetched page, so there’s no security risk). Squarespace’s proprietary CMS framework is one of these strict ones.

 

New Squarespace templates are Ajax-powered SPAs

In the newest gen of Squarespace templates (note: my sole SS site is on a very old version and still looks fine, thank you very much!) such as Brine, your entire site is actually a single page.

 

Once that initial page is loaded, other would-be “pages” are actually HTML fragments dropped inside a placeholder “dynamic content” element. (A full HTML page is fetched under the hood using Ajax, then the interesting parts are clipped out and injected into the placeholder, replacing its previous contents.)

 

As you follow nav links like Shop or Blog and click further into Shop products and Blog posts, you’re doing all that within the same main document:

 

 

If you refresh your browser, the main document does reload once, then the process continues: new “pages” are again Ajax-injected as you click, keeping the same main doc. (The browser URL does change, so to those unfamiliar with the History API, it might look like a new page loaded. But nope, watch the F12 Network tab and you’ll see it’s all Ajax.)

 

So Squarespace pages serve in two capacities:

 

(1) They can serve as an active main document — if you link to them from a Marketo email, hit Refresh, paste them into your browser and hit Enter, etc. — and in these cases they will run your header or footer JavaScript one time, on page load.

(2) But they can also serve merely as passive sources of HTML content, fetched dynamically into the main document. In this case, they’ll replace the page’s dynamic content, including <div>s and <span>s and <img>s and all that stuff, but won’t run any code.

 

Therefore, if you have JavaScript on your page, you need to make sure that it’s ready for both cases.

 

You can’t skip the more traditional case (1). Synchronous <script> or <script src>, external <script src> that’s asynchronous and/or deferred, code that adds listeners for load or DOMContentLoaded — all must run on a traditional page load, because there’s no special event for non-Ajax-created content.[4]

 

But your code must also account for case (2). It’ll run only once during main document load, so during that run it must add an event listener function that’ll be triggered every time a new “page” is loaded via Ajax. The listener won’t always find something to do, but it needs to always check for possible tasks, like adding a Marketo form if newly injected content matches a certain pattern.

 

Squarespace insiders apparently use the jargon “Ajax-enabled code” to describe JavaScript built to handle both cases. Yes, sure it’s “Ajax-enabled,” but such a generic term doesn’t help a developer. A clearer way to put it is: your <script> may run only once per browser session, so it also needs to set up listeners for ongoing changes to the HTML DOM after that first run.

 

Adapting the Marketo form embed

The standard Forms 2.0 embed code is like so:

 

<script src="//pages.example.com/js/forms2/js/forms2.min.js"></script>
<form id="mktoForm_9999"></form>
<script>
MktoForms2.loadForm("//pages.example.com", "123-ABC-456", 9999);
</script>

 

Straightforwardly, the embed:

  • loads the common Forms 2.0 JS library
  • creates an easily findable empty <form> element
  • runs loadForm, which downloads the form descriptor from Marketo, creates the initial contents of the <form>, and sets up all the JS event handlers for validation and Visibility Rules and all that jazz

 

Understandably, the embed code expects to run synchronously, as part of a main document’s (script-enabled!) page load. Its goal is to get the form into the page as quickly as possible (the form being the most important part of a landing page) so it doesn’t include any extra logic. It rightly remains neutral, as it couldn’t fit all manner of unpredictable embedding situations.

 

But clearly the default embed code won’t function on a Squarespace page when that page falls into case (2) above. When the “page” is merely an Ajax-injected block of HTML, the empty <form> element would be rendered (for what that’s worth) but neither top nor bottom <script> would be executed. So there would be no Marketo form.

 

So we need to get smarter. We need JS that:

 

  • Loads the Forms 2.0 JS library — as there’s no reason to redundantly load this static JS — to create the global MktoForms2 object and hold it in reserve, even if the current view isn’t supposed to have a form.
  • Seeks in the current HTML for a recognized parent element. It could be anything, just wherever you want to place the form. For example, if you want every blog post to have a newsletter signup form at the top, see if the page is in “Single Blog Item” mode and find the <article> element on that page.
    • If there’s no matching parent element, don’t do anything for now.
    • If there’s a form-worthy parent element, check to see if it already has a <form> inside (from earlier navigation). If it’s already there, don’t do anything for now.
    • If there’s a parent, but no form yet, inject the <form> using standard DOM createElement, then run loadForm().
  • Adds an event listener to run itself again when there’s new page content. This is the key to being Squarespace-aware. By listening for new “pages” to be loaded via Ajax, we automatically re-check if the parent element has come into view, and inject the form inside it if applicable.

 

The code

For this demo, I wanted to display a Marketo form at the top of every Blog item (not trying to win any design awards here!):

 

 

So first I determined the CSS selector for the parent HTML element, the first match for "article.BlogItem" in Squarespace’s single-Blog-item view:

 

Then added this code to the global Footer (the surrounding <script> tags are required) under Settings » Advanced » Code Injection:

<script>
(function(){

var instanceURL = "//pages.example.com",
munchkinId = "ABC-123-456",
formid = 9999,
parentContainer = "article.BlogItem", // where the form goes
formPositionBefore = true, // put <form> :before other content in parent
pathInfoField = "SquarespaceSubPage"; // hidden field to pass SS sub-page


/* -- NO NEED TO TOUCH BELOW THIS LINE! -- */

var mktoFormsJS = document.createElement("script");
mktoFormsJS.src = instanceURL + "/js/forms2/js/forms2.min.js";
mktoFormsJS.addEventListener("load", function(e){
// check on initial full page load
injectMktoForm();
// recheck on Ajax "page" load
window.addEventListener("mercury:load", injectMktoForm);
MktoForms2.whenReady(function(form){
var fieldsObj = {};
fieldsObj[subPageInfoField] = document.location.pathname;
form.addHiddenFields(fieldsObj);
});
});
document.head.appendChild(mktoFormsJS);

function injectMktoForm(e){
var parentsVisible = document.querySelectorAll(parentContainer),
formVisible = document.querySelector("form#mktoForm_" + formid + ":not(:empty)");

// expect only one eligible parent for simplicity
if ( parentsVisible.length != 1 || formVisible ) {
return;
}

var mktoFormParent = parentsVisible[0],
mktoFormEl = document.createElement("form");

mktoFormEl.id = "mktoForm_" + formid;
mktoFormParent.insertBefore( mktoFormEl, formPositionBefore ? mktoFormParent.firstChild : null );
MktoForms2.loadForm(instanceURL,munchkinId,formid);
}

})();
</script>

 

As you can see, the code assumes you have a single Marketo form that goes in a consistent page location in Squarespace. You can extend the code greatly, to deal with multiple possible parents and multiple form IDs, but the core logic remains the same.

 

One extra frill

You may wonder about the JS variable pathInfoField. It’s optional, but you can set it to a Marketo form field name. The code will add a corresponding hidden field, set to the URL path at the time of form submission:

 

 

This aids in building Smart Campaign filters. You see, because of the SPA architecture, the Referrer property of each Filled Out Form activity is the last main document — that is, the last real Squarespace page, not the Ajax-injected “page” they’re currently viewing — so it’s not a fine-grained constraint.

 

It’s possible to hack harder so the sub-page appears as the Referrer, but that’s complex enough that it’d have to have another post of its own.

 

 

 


NOTES

[1] As I’m ever curious (and hope you are too)  this is the exact section of the XMLHttpRequest standard that specifies that scripts must be neutralized:

 

[2] That is, if you pass contentType="document", you get a fully parsed HTML Document object, but the <script> tags are still disabled.

 

[3] Or, less securely but still effectively, eval() it.

 

[4] A “content loaded via any method” custom event could always fire, for consistency – it would be equivalent to DOMContentLoaded in the case of the initial pageview – but in Squarespace’s case it doesn’t.

Hello Marketing Nation,

 

Thanks for tuning into the second edition of our limited Sneak Preview series, where we preview all the exciting changes coming to Community in mid-December January 2020. Today, we’ll be discussing all search related improvements - please note that these designs are not final and may change prior to release. Marketing Nation Community’s new search capabilities will include:

 

Universal Search: Suppose you were on Community browsing for best practices on Web Personalization. You’re able to find some content, but it’s not the exact information you’re looking for, so then you visit Marketo Product Docs, Knowledge Base, Help Center…

 

Wouldn’t it be great if there was a combined search for all things Marketo? Well, now there is! With a newly integrated universal search engine, you’ll be able to perform keyword searches across all Marketo properties, including: Marketing Nation Community, Marketo Product Docs, and the Marketo Help Center.

 

New Search Menu: Of course, not everyone is interested in searching across EVERY Marketo property, all the time. We’ve built a robust search menu so you can easily toggle which platforms and asset types you’d like to display so that searching is always a breeze.

 

searchfacets

 

Improved Recommended Content: In the months following our transition, our new search engine will start anonymously analyzing user page view history. This data does not use any personal information and will only be used to generate models that return recommendations by comparing a user’s current navigation pattern with other user patterns in the past.

 

Recommendations are made based on the number of user visits – so the more content that is clicked on, the better the recommendations become. Our goal is to better recommend community content to you in a confidential manner, which will hopefully provide you a more holistic view on the topics you’re most interested in!

 

Better Search Suggestions: Search suggestions, when done correctly, vastly improve search user experience by reducing the amount of time spent scrolling through search results. With our new search engine, query suggestions will utilize relevancy scores, query frequency, performance, and the degree of character matching to provide accurate suggestions for your questions.

 

querysuggestions

 

Grouped Search Results: In our quest to provide a better search experience, we wanted to ensure that search results were presented to you in an organized manner. We’ve implemented result folding, which will display logical parent-child relationships for search results. This way, when your search query returns multiple results from the same conversation thread, all related child results will be grouped in a way that makes it easy to distinguish the parent post from its subsequent replies.

  

foldedsearchresults

 

That wraps up our second Sneak Preview! I hope you are as excited as I am about these search improvements – coming soon to the Community you know and love! Stay tuned for our next week's Sneak Preview, where we'll cover all things Support. If you have any questions or concerns, please comment in the section below or reach out to me at jonchen@adobe.com.

 

If you haven't checked out our first Sneak Preview on platform and UI improvements, you can read it here!

Filter Blog

By date: By tag: