Skip to main content

SFMC System Data Views

Dive deep into System Data Views - the backend Marketing Cloud data. Actionable pearls await.

Data Views Basics

System Data Views are built-in backend Data Extensions that you can use to find information about your subscribers and sends. You cannot change them, but you can leverage their data in SQL queries for quick reports in Query Studio or outputting to the standard Data Extension. They are excellent fuel for SSJS logic.

Data Views have data retention settings set to 6 months. If you want to store any data for a more extended period, you must create an Automation that will be copying data to your Data Extension.

Be careful, however, as some of the System Data Views can get absurdly big quick, and making copies within your Marketing Cloud Instance may lead to performance issues. In such cases, a much better idea might be to export that data on a scheduled basis to an external Data Warehouse.

Another important point related to Data Views is always knowing which Data View you genuinely want to use. For example, in most cases, you will be interested in parent-level _Subscribers Data View, which means you will need to use the Ent. prefix in your query.

You Should Know

Below you can find selected Salesforce Marketing Cloud Data Views focused on Subscribers, Journeys, Email and SMS Channel. I plan to cover the rest of them in the future.

Be sure to check the excellent Dataviews.io - an interactive system tables relationship diagram created by Zuzanna Jarczyńska. It will for sure help you with multi-view JOINs.

There is also a more detailed System Tables relationship diagram created by Cameron Roberts that contains SQL Database structure along with field lengths.


Subscriber Data Views

_Subscribers

Stores information about your Subscribers. Great for high-level perspective or adding Email Address field to other more detailed Data Views.

NameDescriptionData TypeNullable
SubscriberIDThe subscriber ID for the affected subscriber. This number represents the unique ID for each subscriber record.Number
DateUndeliverableThe date an email for the subscriber was returned as undeliverableDateX
DateJoinedThe Date, the subscriber, joined your listDateX
DateUnsubscribedThe Date, the subscriber, unsubscribed from your listDateX
DomainThe domain of the subscriberTextX
EmailAddressThe subscriber's email addressEmail
BounceCountThe total number of bounces accrued by the subscriberNumber
SubscriberKeyA potential alternate identifier for subscribers.Text
SubscriberTypeThe subscriber type for the affected subscriberText
StatusThe status of the subscriberTextX
LocaleThe locale code for the subscriberLocaleX

When working with _Subscribers Data View:

  1. If you are using the query in the child Business Unit, use Ent. prefix, as the data is stored on Parent BU level.
  2. If you need high-level data on your subscribers, this Data View might be enough. If you want to learn more (for example, why a subscriber bounced, where did he unsubscribe), you will need to JOIN other Data Views.
  3. Use SubscriberID to JOIN data from different engagement-based Data Views like _Sent, _Open, _Click or _Bounce.
  4. The Status field is excellent for a quick check of your database quality. It is also nice to manage multiple records. Pull the selection of your subscribers with SQL Query, add a new status with custom value (for example, 'unsubscribed' AS Status) and leverage Automation to export-transfer-import the Data Extension to All Subscribers.
  5. This Data View, along with _EnterpriseAttribute, _BusinessUnitUnsubscribes and _ListSubscribers, does not have six-month data retention.

_EnterpriseAttribute

Stores information about your Profile and Preference Attributes from Email Studio.

NameDescriptionData TypeNullable
_SubscriberIDThe subscriber ID for the affected subscriber. This number represents the unique ID for each subscriber record stored.Number

When working with _EnterpriseAttribute Data View:

  1. If you are using the query in the child Business Unit, always use ENT. prefix as it is enterprise-level only Data View.
  2. When querying or joining _EnterpriseAttribute, always include the underscore before SubscriberID - this is the only Data View that requires it.
  3. Despite the Email Address field is visible in the Salesforce Marketing Cloud UI when you go to Profile Attributes, it is not part of the _EnterpriseAttribute Data View. To get the Email Address of your Subscriber, query the _Subscribers Data View.
  4. Unfortunately, the default Preference Attribute HTML Email is not accessible via query.
  5. _EnterpriseAttribute Data View is unique, as it might contain spaces in field names. You build it by creating the Profile Attributes in Email Studio. If your profile attribute name contains space, you will have to use the square bracket notation to capture it: SELECT [Attribute With Spaces] FROM _EnterpriseAttribute.
  6. This Data View, along with _Subscribers, _BusinessUnitUnsubscribes and _ListSubscribers , does not have six-month data retention.

Email Data Views

_Job

Stores information about your Email Sends Jobs. Great for capturing detailed data about your communication, especially when paired with Send Log. Must-have for extending your engagement-based Email Data Views.

NameDescriptionData TypeNullable
JobIDThe job ID number for the email sendNumber
EmailIDThe email ID for the jobNumberX
AccountIDThe ID number for the account that performed the jobNumberX
AccountUserIDThe ID number for the account user that performed the jobNumberX
FromNameThe from name in the email sendTextX
FromEmailThe from email address in the email sendEmailX
SchedTimeThe time the job was scheduledDateX
PickupTimeThe time the Marketing Cloud application started the jobDateX
DeliveredTimeThe time the email was deliveredDateX
EventIDThe ID for the job eventTextX
IsMultipartWhether the job was sent as multi-part MIME or notBoolean
JobTypeThe type of jobTextX
JobStatusThe status of the jobTextX
ModifiedByIf modified, the user who modified the jobNumberX
ModifiedDateThe date the job was modifiedDateX
EmailNameThe name of the email sent by the jobTextX
EmailSubjectThe subject of the email sendTextX
IsWrappedWhether the links in the email were wrapped for trackingBoolean
TestEmailAddrThe test email address used in the jobEmailX
CategoryThe job categoryText
BccEmailAny email address send in the BCC fieldEmailX
OriginalSchedTimeThe initially scheduled time for the jobDateX
CreatedDateThe date the job was createdDate
CharacterSetThe character set used in the jobTextX
IPAddressThis value will always be a null value.TextX
SalesForceTotalSubscriberCountThe total number of Salesforce subscribers included in the jobNumber
SalesForceErrorSubscriberCountThe total number of Salesforce subscribers included in the job that received errorsNumber
SendTypeThe type of send used in the jobText
DynamicEmailSubjectThe dynamic email subject included in the jobTextX
SuppressTrackingIf tracking information for this job was suppressedBoolean
SendClassificationTypeThe type of send classification for the jobTextX
SendClassificationThe custom name of send classification for the jobTextX
ResolveLinksWithCurrentDataIf the job resolved links with current dataBoolean
EmailSendDefinitionThe email send definition used in the jobTextX
DeduplicateByEmailWhether the email addresses in the job are used to deduplicate subscribersBoolean
TriggererSendDefinitionObjectIDThe object ID for the triggered send definitionNumberX
TriggeredSendCustomerKeyThe customer key for the triggered sendTextX

When working with _Job Data View:

  1. JobID field will be your bread and butter to JOIN with other engagement-based Data Views.
  2. EmailName, FromName, and FromEmail are handy data points missing in the _Sent, _Open, _Click, _Bounce Data Views and are worth checking for reporting needs.
  3. If you are performing A/B tests or want to analyse the subject line's impact on performance, be sure to pick EmailSubject. Pair it with CASE to create a great knowledge source for your content team.
  4. For debugging purposes, be sure to check out IsWrapped and SuppressTracking - if you are missing tracking data, CharacterSet - if you have problems with formatting, SendClassification - if you have issues with unsubscribers or spam complaints.
  5. AccountUserID field is fantastic for _Job-based Audit Log creation. Unfortunately, there is no UI-based easy way to determine which user has which UserID. You can either use SOAP API or match based on these SQL results.
You Should Know

_Job Data View is unique among other Email-focused Data Views, as it shows data limited to a specific Business Unit. Your parent Business Unit has access to _Sent, _Open, _Click and other data from all Business Units, but this is not the case with _Job. You can query only those jobs that occurred in the Business Unit where you execute your SQL snippet.

Always consider this when choosing Business Unit to execute the query and the type of JOIN statement.


_Sent

Stores information about your Email Sends. Great for understanding who had a chance to receive your message and whose communication did not leave your system.

NameDescriptionData TypeNullable
AccountIDYour parent account ID (MID) numberNumber
OYBAccountIDThe account ID (MID) number of the child Business Unit that owns the data. If queried on parent Business Unit, it will be NullNumberX
JobIDThe job ID number for the email sendNumber
ListIDThe list ID number for the list used in the sendNumber
BatchIDThe batch ID number for any batches used in the sendNumber
SubscriberIDThe subscriber ID for the affected subscriber. This number represents the unique ID for each subscriber record.Number
SubscriberKeyThe subscriber key for the affected subscriberText
EventDateThe date the send took placeDate
DomainThe domain at which the send occurredText
TriggererSendDefinitionObjectIDThe object ID for the triggered send definitionTextX
TriggeredSendCustomerKeyThe customer key for the triggered sendTextX

When working with _Sent Data View:

  1. Use JobID, ListID, BatchID and SubscriberId or SubscriberKey to match various events from multiple Data Views like _Open, _Click, _Bounce for a single engagement with a particular subscriber. Example: Query for Debugging Email Sends.
  2. The most valuable data here is the EventDate field that lets you know when the email was sent (and whether that happened at all).
  3. If you have triggered a send for an email and after a few minutes you don't see it here, in most cases, it means that the send was blocked and never left Marketing Cloud. Check enhanced Send Log, applied personalisation, data source, RaiseError scripts.

_Open

Stores information about your Email Opens. For when you need to know when someone opened your email. Kind of.

NameDescriptionData TypeNullable
AccountIDYour parent account ID (MID) numberNumber
OYBAccountIDThe account ID (MID) number of the child Business Unit that owns the data. If queried on parent Business Unit, it will be NullNumberX
JobIDThe job ID number for the email sendNumber
ListIDThe list ID number for the list used in the sendNumber
BatchIDThe batch ID number for any batches used in the sendNumber
SubscriberIDThe subscriber ID for the affected subscriber. This number represents the unique ID for each subscriber record.Number
SubscriberKeyThe subscriber key for the affected subscriberText
EventDateThe date the open took placeDate
DomainThe domain at which the open occurredText
IsUniqueWhether the event is unique or repeatedBooleanX
TriggererSendDefinitionObjectIDThe object ID for the triggered send definitionTextX
TriggeredSendCustomerKeyThe customer key for the triggered sendTextX

When working with _Open Data View:

  1. Use JobID, ListID, BatchID and SubscriberId or SubscriberKey to match various events from multiple Data Views like _Sent, _Click, _Bounce for a single engagement with a particular subscriber. Example: Query for Debugging Email Sends.
  2. Use _open.IsUnique = 1 in JOIN or WHERE to focus on the the first occurence of each event. Example: Query for Debugging Email Sends.
  3. The most valuable data here is the EventDate field that lets you know when the email was opened (and whether that happened at all). But with email opens, it's not that easy. In many cases, the lack of open data in this Data View doesn't mean that your recipient for sure did not open the email. And in some instances, tracked open might not mean he did.
You Should Know

There is no official engagement feedback loop that informs Marketing Cloud (or any other Marketing Automation Platform) that your recipient opened the email.

All Marketing Automation Platforms put an invisible 1px wide image in the email body that is unique for every email you send. When someone opens an email, its images are downloaded from the server. SFMC treats the download of this 1px wide image as proof that the recipient opened the email. And in most cases, it is correct. But...

The images don't always render (that's why you should always use alt-text). Some recipients opt-in on a per-email basis to download email graphics. Government audiences might not even have this option. Because of the admin policy, the privacy concerns over engagement tracking or limited internet bandwidth. In such a case, even if the user opens an email, you won't have information about it.

It might lead to weird data, like clicks visible for contacts that did not open. Marketing Automation Platforms track Clicks via a different, more confident approach.

It can also lead to cases where a user has both click and open data, but click data is earlier than the open. Why? Your recipient clicked something in your email and only after that decided to allow his email program to load the images in it.

There might be cases where the data is wrong the other way - when you see that email as opened, but in reality, the user didn't engage with it. It sometimes happens for B2B sends when your recipient's administrator uses bots that automatically check the emails for malicious or spammy content. You can recognise such things by checking the EventDate on _Open and _Click Data Views, as those bots will open the email and click all its links within a second. Something not possible for an actual human.


_Click

Stores information about your Email Clicks. Detailed click reporting and behavioural logic are possible, thanks to this one.

NameDescriptionData TypeNullable
AccountIDYour parent account ID (MID) numberNumber
OYBAccountIDThe account ID (MID) number of the child Business Unit that owns the data. If queried on parent Business Unit, it will be NullNumberX
JobIDThe job ID number for the email sendNumber
ListIDThe list ID number for the list used in the sendNumber
BatchIDThe batch ID number for any batches used in the sendNumber
SubscriberIDThe subscriber ID for the affected subscriber. This number represents the unique ID for each subscriber record.Number
SubscriberKeyThe subscriber key for the affected subscriberText
EventDateThe date the click took placeDate
DomainThe domain at which the click occurredText
URLThe URL for the link clicked. Dynamic elements are shown as code: www.example.com?id=%%SubID%%TextX
LinkNameThe link name assigned in the email sendTextX
LinkContentThe link content assigned in the email send. Dynamic elements are shown as result: www.example.com?id=12345TextX
IsUniqueWhether the event is unique or repeated
TriggererSendDefinitionObjectIDThe object ID for the triggered send definitionTextX
TriggeredSendCustomerKeyThe customer key for the triggered sendTextX

When working with _Click Data View:

  1. Use JobID, ListID, BatchID and SubscriberId or SubscriberKey to match various events from multiple Data Views like _Sent, _Open, _Bounce for a single engagement with a particular subscriber. Example: Query for Debugging Email Sends.
  2. Use _click.IsUnique = 1 in JOIN or WHERE to focus on the first occurence of each event. Example: Query for Debugging Email Sends.
  3. The most valuable data here is the EventDate field that lets you know when the email was clicked (and whether that happened at all).
  4. You can significantly improve the value of that information by checking the LinkName and LinkContent fields to understand which links proved interesting for your customers.
  5. Suppose you want to create an extensive report on link clicks. In that case, you might want to use the URL field instead of LinkContent due to the former not showing final personalisation values. It will be much easier to group clicks or even cleanly delete all AMPScript from them.
You Should Know

There might be cases where the click data is wrong - when you see that email as clicked, but in reality, the user didn't engage with it. It sometimes happens for B2B sends when your recipient's administrator uses bots that automatically check the emails for malicious or spammy content. You can recognise such things by checking the EventDate on _Open and _Click Data Views, as those bots will open the email and click all its links within a second. Something not possible for a actual human.


_Bounce

Stores information about your Email Bounces. Best place in Marketing Cloud to understand why your messages are not getting delivered.

This Data View, along with _Complaint, should be monitored regularly to assess the health of your email marketing.

NameDescriptionData TypeNullable
AccountIDYour parent account ID (MID) numberNumber
OYBAccountIDThe account ID (MID) number of the child Business Unit that owns the data. If queried on parent Business Unit, it will be NullNumberX
JobIDThe job ID number for the email sendNumber
ListIDThe list ID number for the list used in the sendNumber
BatchIDThe batch ID number for any batches used in the sendNumber
SubscriberIDThe subscriber ID for the affected subscriberNumber
SubscriberKeyThe subscriber key for the affected subscriberText
EventDateThe date the bounce took placeDate
IsUniqueWhether the event is unique or repeated - 1 for the first occurrence, 0 for subsequentBoolean
DomainThe domain at which the bounce occurredText
BounceCategoryIDThe ID number for the bounce categoryNumber
BounceCategoryThe category of the bounceTextX
BounceSubcategoryIDThe ID number for the bounce subcategoryNumberX
BounceSubcategoryThe subcategory of the bounceTextX
BounceTypeIDThe ID number for the bounce typeNumber
BounceTypeThe type of bounce that occurredTextX
SMTPBounceReasonThe reason for the bounce relayed by the mail systemTextX
SMTPMessageThe message regarding the bounce from the mail systemTextX
SMTPCodeThe error code for the bounce from the mail systemNumberX
TriggererSendDefinitionObjectIDThe object ID for the triggered send definitionTextX
TriggeredSendCustomerKeyThe customer key for the triggered sendTextX
IsFalseBounceIndicates a false bounce if SFMC received delivery receipt after receiving bounce.BooleanX

When working with _Bounce Data View:

  1. Use JobID, ListID, BatchID and SubscriberId or SubscriberKey to match various events from multiple Data Views like _Sent, _Open, _Click for a single engagement with a particular subscriber. Example: Query for Debugging Email Sends.
  2. Use _bounce.IsUnique = 1 in JOIN or WHERE to focus on the first occurence of each event. Example: Query for Debugging Email Sends.
  3. The Domain helps aggregate the bounce data to see any domain-specific problem with deliverability.
  4. SMTPBounceReason is the most helpful information when you want to understand what happened to your send. Be careful - this value can be configured to a custom string by the server owner. Some administrators are using this to inform you about a specific issue. Some are even faking the information to limit the emails coming to their servers from selected sources.
  5. SMTPCode is useful for getting additional data on the Bounce Reason. Watch especially for 541 and 554. In most cases, it means you are considered a spammer by the server or already blocklisted. I recommend you to create an Automation with Verification Activity to get an automated warning whenever there are more than a few occurrences. Triage immediately.
  6. If you get errors when trying to select IsFalseBounce - it might be missing on the SFMC backend. Create a Support Ticket to resolve it.
You Should Know

SMTPBounceReason field is nvarchar(max) SQL type, and due to that might be longer than the 4000 characters limit for the Data Extension string length in Salesforce Marketing Cloud. If you want to save this data outside of Data View, be sure to use LEFT(SMTPBounceReason, 4000).

_Complaint

_Complaint Data View stores Email Service Providers Feedback Loop (FBL) data. It means that if someone clicks the Report Spam button for your email and there is FBL in place, this information will be added to the Data View. It will also result in an unsubscribe event and be visible in the _Unsubscribe.

Currently, Salesforce Marketing Cloud supports Feedback Loops for Bluetie (Excite), Comcast, Cox, Fastmail, Microsoft Hotmail, Italia Online, La Poste, Liberty Global, Locaweb, Mail.ru, OpenSRS (Tucows), Rackspace (Mailtrust), Seznam, Synacor, Telenor, Telstra, Terra, UOL (Brazil), USA.net, XS4ALL and Yandex.

You can additionally register for the Yahoo Feedback Loop. Gmail also has a Feedback Loop system, but it works differently and won't be in _Complaint Data View.

This Data View, along with _Bounce, should be monitored regularly to assess the health of your email marketing.

NameDescriptionData TypeNullable
AccountIDYour parent account ID (MID) numberNumber
OYBAccountIDThe account ID (MID) number of the child Business Unit that owns the data. If queried on parent Business Unit, it will be NullNumberX
JobIDThe job ID number for the email sendNumber
ListIDThe list ID number for the list used in the sendNumber
BatchIDThe batch ID number for any batches used in the sendNumber
SubscriberIDThe subscriber ID for the affected subscriberNumber
SubscriberKeyThe subscriber key for the affected subscriberText
EventDateThe date the send took placeDate
IsUniqueWhether the event is unique or repeated - 1 for the first occurrence, 0 for subsequentBoolean
DomainThe domain at which the send occurredText

When working with _Complaint Data View:

  1. Use JobID, ListID, BatchID and SubscriberId or SubscriberKey to match various events from multiple Data Views like _Sent, _Open, _Click for a single engagement with a particular subscriber.
  2. Use _complaint.IsUnique = 1 in JOIN or WHERE to focus on the first occurence of each event.
  3. The Domain helps aggregate the Complaint data to see any domain-specific problem with targeting your communication.

Subscription Data Views

Subscription management in Salesforce Marketing Cloud is complex. Very complex.

It starts with four levels of unsubscriptions:

  1. List unsubscribe = no more sends from a particular list or publication list.
  2. Business Unit unsubscribe = no more sends from a particular business unit.
  3. Master unsubscribe = no more sends from your Marketing Cloud.
  4. Global unsubscribe = no more sends from Marketing Cloud. Any, globally.

And it gets even more interesting when you consider that triggering specific unsubscription level depends on email configuration, Email Studio configuration, preference center configuration and subscriber's behaviour.

Oh, and there is no out-of-the-box unsubscription from Data Extensions, which are currently the most popular segmentation and targeting tool.

To give us at least a chance to make sense of that mess, Salesforce created multiple System Data Views related to (un)subscriptions.

You Should Know

Spam Complaint and List-Unsubscribe Header are pretty particular unsubscription use cases. They are added to _Unsubscribe and _BusinessUnitUnsubscribe as unsubscriptions from a list used in send (for example, ID of Publication List selected for the send). In reality, Marketing Cloud will perform automatic unsubscribe from the All Subscriber list (depending on Email Studio settings - Child BU's or Enterprise one), not the list mentioned in ListID.

As a result, when querying, you will see the list-specific unsubscribe that doesn't result in unsubscription from the list but instead blocks all commercial communication as a Business Unit or Master unsubscribe.

Custom solution (Automation with Query and Script Activities) will be necessary to perform the list-specific unsubscribe.

_Unsubscribe

_Unsubscribe Data View stores data about unsubscribe events. The wording here is crucial, as it explains the difference from _Subscribers Data View unsubsrciption counts.

In _Subscribers, you can check what is the current subscription status for the All Subscribers list. In _Unsubscribe, you see the unsubscription events happening from List-Unsubscribe Header, LogUnsubEvent API call, Reply Mail Management responses, Complaints and out-of-the-box Preference Center - all linked to a specific _Job. It is also not limited to All Subscribers but also covers unsubscribes from other types of lists.

It means that status changes like Import Activity, direct API change, manual change in the Email Studio (not Job-specific) will be reflected in the _Subscribers Data View, but not in the _Unsubscribe. On the other hand, UnsubEvents does not necessarily change the Status in the _Subscribers. For example, taking care of List-Unsubscribe Header clicks require dedicated Automation to get this data from _Unsubscribe Data View and push it to other parts of your consent data model.

This Data View stores data only for six-months, so retention-less _Subscribers Data View might show more unsubscribed records if you are not cleaning them from SFMC regularly.

All of this makes _Unsubscribe a much better source of knowledge about unsubscription.

NameDescriptionData TypeNullable
AccountIDYour account ID numberNumber
OYBAccountIDThe account ID (MID) number of the child Business Unit that owns the data. If queried on parent Business Unit, it will be NullNumberX
JobIDThe job ID number for the email sendNumber
ListIDThe list ID number for the list used in the sendNumber
BatchIDThe batch ID number for any batches used in the sendNumber
SubscriberIDThe subscriber ID for the affected subscriberNumber
SubscriberKeyThe subscriber key for the affected subscriberText
EventDateThe date the unsubscribe took placeDate
IsUniqueWhether the event is unique or repeated - 1 for the first occurrence, 0 for subsequentBoolean
DomainThe domain at which the unsubscribe occurredText

When working with _Unsubscribe Data View:

  1. Use JobID, ListID, BatchID and SubscriberId or SubscriberKey to match various events from multiple Data Views like _Job and _Subscribers to check unsubscription context.
  2. Use _unsubscribe.IsUnique = 1 in JOIN or WHERE to focus on the first occurence of each event.
  3. If you query this Data View on the child Business Unit, it will return only unsubscribe events from that specific BU.
  4. The most valuable data here are:
    • EventDate field that lets you know when the unsubscription happened
    • ListID field that tells you which list is impacted by the unsubscription
You Should Know

If the subscriber clicks "Unsubscribe from All" on the out-of-the-box unsubscription center, it will perform Master Unsubscribe from all Lists. As it is a single event, it will be stored as a single record in the _Unsubscribe Data View with random ListID assigned to it. For a complete picture, you will need to check _ListSubscribers Data View.


_BusinessUnitUnsubscribes

_Subscribers Data View might give you information about the current state of subscriptions on the All Subscribers list. But if in Email Studio you configure Business Unit Level unsubscribes, this information will not be helpful, as the data stored there will not reflect the subscription status in a specific Business Unit.

Here comes the fresh _BusinessUnitUnsubscribes Data View. It shows you the only unsubscribed contacts for each Business Unit. If the contact resubscribes - it will disappear from this Data View.

_BusinessUnitUnsubscribes Data View will work differently depending on your SFMC unsubscription configuration. You will be able to query it from the Child BU level only for Business Units set to "unsubscribe from this business unit only".

NameDescriptionData TypeNullable
BusinessUnitIDThe Account ID for the Business UnitNumber
SubscriberIDThe subscriber ID for the affected subscriberNumber
SubscriberKeyThe subscriber key for the affected subscriberText
UnsubDateUTCThe date the subscriber unsubscribed on the BU.DateX
UnsubReasonThe reason listed is a custom value configured by your administrator.TextX

When working with _BusinessUnitUnsubscribes Data View:

  1. Remember that it stores only currently unsubscribed contacts. Not unsubscribe event data (that's in _Unsubscribe) and not other statuses (like bounced, held). It will also not show unsubscribed users after they resubscribed or got deleted.
  2. SubscriberID or SubscriberKey along with UnsubDateUTC might fuzzy match the data in this data view with _Unsubscribe.
  3. UnsubDateUTC, as name suggests, is in UTC instead of the SFMC-standard UTC-6. Remember to use DATEADD to normalize it before comparing to other system dates.
  4. The real treat in this data view (apart from finally having an easy option to see Business Unit unsubscribes) is the UnsubReason field that can tell you more about the unsubscribe.
  5. This Data View, along with _Subscribers, _EnterpriseAttribute and _ListSubscribers, does not have six-month data retention.
You Should Know

UnsubDateUTC not only uses a different timezone from the rest of the system dates. It differs by a few milliseconds from _Unsubscribe EventDate. When querying (SFMC doesn't show seconds for date fields), you won't see it, but the comparison is using the full datetime value.

Because of it, you cannot match it out-of-the-box. DATEDIFF is here to save the day:

DATEDIFF will allow you to compare despite the difference
DATEDIFF(MINUTE, _Unsubscribe.EventDate, DATEADD(HOUR, -6, _BusinessUnitUnsubscribes.UnsubDateUTC)) < 1

_ListSubscribers

_ListSubscribers Data View stores data about the current status of the subscription. It might sound similar to _Subscribers and _BusinessUnitUnsubscribes, but there are significant differences:

  • _Subscribers has data about All Subscribers list only. _ListSubscribers shows status for all Lists available in Salesforce Marketing Cloud.
  • _BusinessUnitUnsubscribes has data about contacts unsubscribed from All Subscribers on every Business Unit. _ListSubscribers doesn't show Business Unit information, but it covers all Lists and all Statuses.
NameDescriptionData TypeNullable
AddedByThe ID of the user who ran the process that added the subscriber (might also be 0 or -1000)Number
AddMethodThe method by which the subscriber was addedText
CreatedDateThe date the subscriber was added to the specific listDateX
DateUnsubscribedThe date the subscriber unsubscribedDateX
EmailAddressThe subscriber's email addressTextX
ListIDThe list ID number for the list used in the sendNumberX
ListNameThe name of the list containing the subscribersTextX
ListTypeShows whether the type is list or groupText
StatusThe status of the subscriberTextX
SubscriberIDThe subscriber ID for the affected subscriberNumber
SubscriberKeyThe subscriber key for the affected subscriberText
SubscriberTypeThe type of subscriber (it will be ExactTarget)TextX

When working with _ListSubscribers Data View:

  1. Thanks to having ListID, ListName and ListType fields, it allows you to make sense of the ListID field available in all other engagement-based System Data Views.
  2. This Data View, along with _Subscribers, _EnterpriseAttribute and _BusinessUnitUnsubscribes, does not have six-month data retention.
  3. You can only query Lists available on the current Business Unit. It's not possible to check Child's List subscription status from the Parent BU. The exception is the All Subscribers list that is shared across all Business Units.

Mobile Connect Data Views

Learn more about Mobile Connect SMS Data Views here.


Journey Data Views

_Journey

Stores information about your Journeys for when context matters.

NameDescriptionData TypeNullable
VersionIDThe unique identifier for the version of the JourneyText
JourneyIDThe unique identifier for the Journey. There are one or more VersionID's associated to a JourneyID.Text
JourneyNameThe name of the JourneyText
VersionNumberThe version number of the version of the JourneyNumber
CreatedDateThe date that the version of the Journey was createdDate
LastPublishedDateThe date that the version of the Journey was last publishedDateX
ModifiedDateThe date that the version of the Journey was last editedDate
JourneyStatusThe current running mode of the JourneyText

When working with _Journey Data View:

  1. VersionID field is perfect to JOIN with _JourneyActivity. It lets you map multi-channel engagement to a particular Journey (visible in JourneyName) and its specific version (as shown in VersionNumber).
  2. You can also connect it to SMS channel using _SMSMessageTracking Data View by making a JOIN ON journey.VersionID = smsTracking.JBDefinitionID.
  3. Use JourneyStatus to check what is the current Journey Status. It is fantastic for both the WHERE statement and a data point for engagement analysis. Think about scheduled Automation that finds all emails performing below expectations and checks which are in the Active Journeys. For all found, it sends you a notification to check and improve. For awful results, you can even use this data in Script Activity to automatically stop the Journey with the SFMC REST API.
  4. The Date fields (CreatedDate, LastPublishedDate, ModifiedDate) are cool for automated cleanup of old Journeys, especially when paired with the _Sent data. For example, you can create monthly Automation that checks all Journeys that were last modified at least three months ago and, based on the send volume or performance, stop them and notify you about that.
  5. You can query only Journeys that currently exists in your Business Unit.
You Should Know

_Journey Data View shows data limited to a specific Business Unit. Your parent Business Unit has access to _Sent, _Open, _Click and other data from all Business Units, but this is not the case with _Journey. You can query only those Journeys that were created in the Business Unit where you execute your SQL snippet.

Always consider this when choosing Business Unit to execute the query and the type of JOIN statement.


_JourneyActivity

Stores information about Activities available in your Journeys. Must-have for joining Email data with Journey data.

NameDescriptionData TypeNullable
VersionIDThe unique identifier for the version of the JourneyText
ActivityIDThe unique identifier for the activity. There are one or more ActivityID's associated to a VersionID.Text
ActivityNameThe name of the activityTextX
ActivityExternalKeyThe external key associated with the activityText
JourneyActivityObjectIDUse this unique identifier to join to email tracking system Data Views to identify a Journey email's Triggered Send Definition.TextX
ActivityTypeThe type of activityTextX

When working with _JourneyActivity Data View:

  1. There are two key fields here: VersionID and JourneyActivityObjectID. JourneyActivityObjectID lets you match Journey Activity with specific Email Send. Use TriggererSendDefinitionObjectID available on either _Job, _Sent, _Open, _Click or _Bounce Data View. It is handy when you later use the VersionID field to JOIN _Journey Data View and with this connect specific Email engagement with particular Journey and its exact version. Fantastic for full scope reporting.
  2. You can also connect it to SMS channel using _SMSMessageTracking Data View by making a JOIN ON journeyActivity.ActivityID = smsTracking.JBActivityID.
  3. With the help of _Journey Data View, you can use the ActivityType field for an excellent little report created with SQL that will show which Journeys use which channels and what types of logic. For a more in-depth understanding of what happens in Journey, you need to use Script Activity with REST API instead, but SQL is perfect for glancing at the multi-channel use.
  4. _JourneyActivity Data View holds data about activities from deleted Journeys and Journey Versions, so if you want to see only activities currently in use, JOIN _Journey Data View.
You Should Know

_JourneyActivity Data View shows data limited to a specific Business Unit. Your parent Business Unit has access to _Sent, _Open, _Click and other data from all Business Units, but this is not the case with _JourneyActivity. You can query only those Journey Activities that were created in the Business Unit where you execute your SQL snippet.

Always consider this when choosing Business Unit to execute the query and the type of JOIN statement.


Automation Data Views

_AutomationInstance

Provides historical information about Automation runs.

NameDescriptionData TypeNullable
MemberIDThe Account ID for the Business UnitNumber
AutomationNameThe name of the automationText
AutomationDescriptionThe description of the automationTextX
AutomationCustomerKeyThe unique ID of the automationText
AutomationInstanceIDThe unique ID of the specific automation runText
AutomationTypeThe type of starting source used in automationText
AutomationNotificationRecipient_CompleteEmail(s) receiving notification about completed runsTextX
AutomationNotificationRecipient_ErrorEmail(s) receiving notification about errored runsTextX
AutomationNotificationRecipient_SkipEmail(s) receiving notification about skipped runsTextX
AutomationStepCountThe number of steps in the automationNumber
AutomationInstanceIsRunOnceWas this specific automation run executed with Run Once? 1 for true, 0 for false in File Drop and Triggered automations. Null in Schedule automationsBoolean
FilenameFromTriggerName of the file that triggered the automation for Triggered and File Drop automations. Null for Schedule automationsTextX
AutomationInstanceScheduledTime_UTCStarting schedule datetime in UTC timezone for Schedule automations. Null for Triggered and File Drop automationDateX
AutomationInstanceStartTime_UTCAutomation run start datetime in UTC timezone. Null if run is skippedDateX
AutomationInstanceEndTime_UTCAutomation run end datetime in UTC timezone. Null if run is skipped or still runningDateX
AutomationInstanceStatusThe status of the automation run at the time of queryingText
AutomationInstanceActivityErrorDetailsThe first error message encountered in the automation runTextX

When working with _AutomationInstance Data View:

  1. This data view stores all Automation runs, so you will see here separte row for each execution of the Automation. This is great basic audit tool for logging changes to the automation as well as a nice way to counting the amount of automation executions against licence limits.
  2. Key limitation of _AutomationInstance is that it shows data with 24 hours delay. If you need real-time information about Automation Studio status, you will still need an API approach. But for not that urget use cases this new option will be much more performant.
  3. If automation run errored out due to system or unclassified error, AutomationInstanceActivityErrorDetails will show "System Error occurred. Please contact support for details.". In other cases it will store the first error message. If there are more and you want to find them, you will need to leverage _AutomationActivityInstance Data View.
  4. All date fields in this data view are UTC based (unlike most other Data Views) so when manipulating them with SQL Date Functions it might be best to use GETUTCDATE() instead of system date from GETDATE().
  5. AutomationInstanceID field is perfect to JOIN with _AutomationActivityInstance. It lets you find information about execution of each activity within the Automation in the specific run.
You Should Know

_AutomationInstance Data View shows data limited to a specific Business Unit. Your parent Business Unit has access to _Sent, _Open, _Click and other data from all Business Units, but this is not the case with _AutomationInstance. You can query only those Automtion runs that were executed in the Business Unit where you execute your SQL snippet.

Always consider this when choosing Business Unit to execute the query and the type of JOIN statement.

_AutomationActivityInstance

Provides historical information about Automation Studio Activity runs.

NameDescriptionData TypeNullable
MemberIDThe Account ID for the Business UnitNumber
AutomationNameThe name of the automationText
AutomationCustomerKeyThe unique ID of the automationText
AutomationInstanceIDThe unique ID of the specific automation runText
ActivityCustomerKeyThe unique ID of the activityText
ActivityInstanceIDThe unique ID of the specific activity executionText
ActivityTypeThe type of the activity (numeric ID)Number
ActivityNameThe name of the activityText
ActivityDescriptionThe description of the activityTextX
ActivityInstanceStepThe two-dimensional description where in automation the activity is locatedText
ActivityInstanceStartTime_UTCActivity execution start datetime in UTC timezone. Null if run is skippedDateX
ActivityInstanceEndTime_UTCActivity execution end datetime in UTC timezone. Null if run is skipped or still runningDateX
ActivityInstanceStatusThe status of the activity run at the time of queryingText
ActivityInstanceStatusDetailsThe error message encountered in the activity executionTextX

When working with _AutomationActivityInstance Data View:

  1. This data view stores all Automation Activity runs, so you will see here separte row for each execution of each Activity. It is awesome tool for checking how optimised our Activities are and what errors are troubling our Automations.
  2. Key limitation of _AutomationActivityInstance is that it shows data with 24 hours delay.
  3. If activity run errored out due to system or unclassified error, ActivityInstanceStatusDetails will show "System Error occurred. Please contact support for details.". In other cases it will store the error message.
  4. All date fields in this data view are UTC based (unlike most other Data Views) so when manipulating them with SQL Date Functions it might be best to use GETUTCDATE() instead of system date from GETDATE().
  5. The start and end dates in this data view can be leveraged with DATEDIFF and AVG to calculate average time needed for each activity to finish. This information is crucial to assess whether the current automation Schedule is correct and where the optimisation efforts are required to protect against 30 minutes autokill.
  6. AutomationInstanceID field is perfect to JOIN with _AutomationInstance. It lets you find information about the Automation using this Activity.
You Should Know

_AutomationActivityInstance Data View shows data limited to a specific Business Unit. Your parent Business Unit has access to _Sent, _Open, _Click and other data from all Business Units, but this is not the case with _AutomationActivityInstance. You can query only those Automation Activities that were created in the Business Unit where you execute your SQL snippet.

Always consider this when choosing Business Unit to execute the query and the type of JOIN statement.


Custom Data Views

On top of all the built-in Data Views mentioned above, there is also a paid option for custom Data Views. As for the possibilities, the sky is the limit. Example? Lukas Lunow highlighted a fascinating one that solves the problem of knowing what is the current status of a Contact in a given Journey:

You Should Know

As shared by Lukas, since May 2021, there is longer no possibility to create Custom Data Views leveraging the Journey Builder.

NameDescriptionData TypeNullable
JourneyVersionNumberThe version number of the version of the JourneyNumber
JourneyNameThe name of the JourneyText
JourneyStatusTells you whether the Journey is still ActiveText
ContactKeyThe subscriber key for the affected subscriberText
ContactIDGlobal Contact ID (not Contact Key)Number
ContactStatusTell you whether the contact is still in the Journey (Active, Exited or even more detailed like DidNotMeetEntryCriteria, ContactExitedByAPI)Text
EntryDateDate of Journey EntryDate
ExitDateDate of Journey Exit - including Goal / Exit Criteria. Null if still in Journey.Datex

Yes, you can create a workaround to know whether the Contact is in a given Journey using standard Data Extension and Update Contact Journey Activities at the beginning and end of every Journey. Not only it requires you to remember always to add those additional steps. It also blocks you from using Goals and Exit Criteria.

Custom Data View allow you to eat a cookie and have a cookie.

You can certainly come up with other use cases that could be solved if only you had one additional data point. Now you can.