FullStory Private by Default

Understand the basics of FullStory privacy capabilities and feel confident utilizing them with our new FullStory Privacy 101 interactive course.


Private by Default is a setting that minimizes the risk of capturing sensitive or unwanted data with FullStory. When enabled, no text is ever recorded or leaves the user's browser unless explicitly allowlisted as safe to capture. For FullStory for Mobile Apps customers, Private by Default also automatically masks any images that contain external content. Images that are bundled with the app remain visible. 

Note: Only Admins or Umbrella Managers (available on select FullStory Enterprise plans) can modify privacy settings.

This privacy-first approach is made possible by proprietary masking technology that essentially transforms (non-allowlisted) elements of your website into a wireframe during session replay. This means that without allowlisting even a single element, you are still able to gain deep insights into the user experience.

The main reason for this functionality is to allow FullStory to be used straight out of the box with zero risk of collecting unwanted end-user data. Failing to properly scope your recording rules should no longer result in the collection of unwanted data. This article will teach you the functionality of Private by Default recording rules and guide you through best practices you should consider for your digital properties.


Enabling Private by Default

Private by Default can be turned on via request to our Customer Support team.

If you’re an existing FullStory customer, note that enabling Private by Default may cause issues with pre-existing segments, event funnels, or Conversions funnels that are based on text elements. Please contact us if you’d like assistance in transitioning to Private by Default.

Exclude vs Mask vs Unmask

FullStory has three different ways to treat elements when it comes to recording a site or app. These (in order from most private to least private) are Exclude, Mask and Unmask. As mentioned above, the default setting for FullStory when Private by Default is enabled is to record Masked versions of all elements. This gives you a safe place to begin your implementation and allows you to begin getting value from FullStory even before you have gone through the process of Unmasking the safe portions of you digital properties. Let’s explore each of these types of recording rules in more detail.


Exclude (.fs-exclude)

FullStory’s most private element recording rule is an Exclusion. For excluded elements, the element itself (as well as any child elements) will be ignored by recording. All excluded elements are replaced in playback by rectangles containing diagonal grey and white stripes. This allows a FullStory user to differentiate between excluded elements and intentional white-space when viewing recreated sessions in Session Replay. Because exclusions apply to all child elements, it is not possible to Mask or Unmask the child of an excluded element.

Events that target excluded elements (click or change, for example) are ignored entirely. If understanding end-user interaction with an element is important, then using Mask is preferable to Exclude.

The CSS class .fs-exclude is a replacement for the deprecated (yet still currently supported) class .fs-block. 

NOTE: The fact that click events are ignored on excluded elements is new. Prior to the existence of Masking, clicks on excluded elements were recorded on FS Web.

Mask (.fs-mask)

Masking is FullStory’s “happy medium” privacy setting and is the default setting for recording out of the box when Private by Default is enabled. Masking is functional enough that even in a fully masked state, it is still possible to understand user experience using search, segmentation and session replay.

For masked elements containing text, all text will be replaced by irreversibly-transformed placeholder text, meant to resemble a wireframe of the original content. This placeholder text blob will retain the size, color and character length of the original text. Additional information on how collection / rendering of masked text is managed is included in the technical section below.

As with excluded elements, Masking applies to the children of masked elements. However, unlike with excluded elements, specific children of a masked element can be Unmasked. This allows for a more granular level of privacy control for complex elements like forms.

Interaction events targeting masked elements (such as click or change) are recorded. Because actual text is not collected for masked elements, you will need to leverage CSS selectors in search where you might have searched using text had the element been fully Unmasked.

NOTE: Images cannot be masked when recording web sessions. If you wish to hide images from recording, use.fs-exclude.

Unmask (.fs-unmask)

Unmask is FullStory’s “record everything” setting. When elements are unmasked, FullStory will record all text, images and user interactions. It is likely that for digital products that contain little to no sensitive data, the vast majority of the site or app can be unmasked. On an ecommerce site for example, the number of places that will need to be masked or excluded are likely limited to parts of the payment flow and/or the end-users profile/settings. The remaining bulk of the site could safely be unmasked.

Below is a summary table for comparing Exclude, Mask and Unmask:

Note: It is important to point out that when Privacy By Default is enabled, this controls what is recorded in the browser (as opposed to the console). Console recording will still be on by default. If there is a possibility that sensitive data could be captured in the console, you should take the additional step of disabling console recording.


Exclusion Example Data Structure


Masking / Unmasking Example Data Structures



Managing recording rules

FullStory offers two different approaches to managing your element recording rules. The first is to implement the appropriate CSS classes into your element libraries, an approach we refer to as “code-first.” The second method for managing element recording rules is through the FullStory Element Recording Rules UI located in Settings > Recording and Privacy > Privacy.

Code-first rule management

The code-first approach to managing element recording rules is FullStory’s recommended approach. Adding CSS classes to your libraries is simply a less brittle and more future-proof approach than handling these rules through the UI using CSS selectors. FullStory has three classes for managing basic element recording rules and three additional classes that interact with our fs.consent API:

Element Recording CSS Classes

Consent Related Recording Classes








NOTE: .fs-exclude is replacing the now deprecated (but still currently supported) CSS class .fs-block. Similarly, .fs-exclude-without-consent is replacing the now deprecated (but still currently supported) CSS class .fs-record-with-consent.

In-app rule management via Settings

In the event that no engineering resources are available and/or there are circumstances that make managing recording rules in a code-first manner untenable, it is possible to manage these rules via the Element Recording Rules UI located in app at Settings > Recording and Privacy > Privacy. This is an example of the Recording Rules widget:


From here you can create/modify recording rules based on CSS selector. Additionally you can set a rule “Scope.” The scope is related to preview mode and will be discussed below.

Clicking the “Create Rule” button will open this Add Element Recording Rule widget, where the CSS selector is added, the rule type is selected and the rule is scoped (a similar widget exists for editing rules):


A similar widget is also available for adding element recording rules directly from Inspect Mode:


CSS Supported by Element Recording Rules

CSS selectors are the main mechanism for managing Exclude, Mask and Unmask through the FullStory UI. It is important to properly make use of broad selectors, especially when Unmasking, in order to keep the list of items in your Recording Rules as manageable as possible. For managing recording rules, FullStory supports nearly all types of CSS selectors. The complete list can be seen here:

Direct descendent: a > b

Attribute word selector contains: [a~=b]

Arbitrary attributes

Attribute hyphen contains: [a|=b]

Attribute equals: [a=b]

Attribute exists: [a]

Attribute starts with: [a^=b]

Id selectors: #a

Attribute ends with: [a$=b]

Class selectors: .a

Attribute contains: [a*=b]

Type (element) selectors: a

Any descendant: a b



For reference, Element Recording Rules DO NOT support the following CSS selectors:

Any sibling: a ~ b


Direct sibling: a + b

:is() (formerly :matches())

Universal selector: *

:nth-child /nth-of-type /etc


Grouping (OR): a, b


Here are some examples of some broad CSS selectors that have been used for unmasking larger sets of things (these examples worked in the case of a specific test site and may not apply to all sites):

Example CSS Selector



All selectors where the class contained “search” making all search bars visible

[class^="hz-secondary-menu container"]

All selectors where the class starts with “hz-secondary-menu container”


All divs where the class contains “carousel”


All buttons


To Mask or to Exclude: Recommended Best Practices

A common question related to element recording rules normally goes something like “How do I know if I should upgrade the rule for an element from Mask to Exclude?” This is a great question, and while the answer isn’t particularly complicated, it does require some careful thought.

First, if the element in question is meant to contain or could possibly contain information of a regulated nature (meaning the information is governed by regulations like HIPAA, FERPA, GLBA, etc) then you should seriously consider upgrading from Mask to Exclude.

Second, personal confidential data like Social Security numbers, driver’s license numbers, bank account numbers or passwords are also great candidates for Exclusion.

The third potential application of Exclude over Mask is definitely the most nuanced. You should consider upgrading from Mask to Exclude for elements where the nature of the information, even in masked form and/or end-user interaction with the element makes it possible to potentially infer personal details about the end-user. Let’s look at a couple of examples.

Example 1: We could imagine that there are healthcare related sites or apps that are meant to collect all kinds of information about an end-user’s medical history. If part of the interface were to contain checkboxes for recording the presence of certain medical conditions, it would not be enough to simply obscure the text content in session replay. Because masked elements collect interaction data, it would be possible for someone with good working knowledge of the product to understand which health issues a user was checking the boxes for. Therefore, the best course of action would be to exclude the checkboxes themselves, so that it would be impossible to make these kinds of inferences.

Example 2: This second example comes to us from the financial technology sector. Many different services exist for managing various aspects of one's finances. These include banking apps, investment apps, apps for creating and managing budgets, apps for transfering money and even apps for paying taxes. Many of the elements contained in applications like these would be just fine masked. However, there may be fields (like account balance) where even the relative text length might actually be too much information. If you were comparing the session replays of 2 different accounts and one showed a placeholder string for account balance that was three inches long and the other had a placeholder string that was half an inch long, you now know more about these two accounts than you probably need to. So, fields like account balance are good candidates for upgrading from Mask to Exclude.

Hopefully these suggestions have helped make it more clear when to consider Exclude over Mask. If there is ever a situation where you are on the fence, go with the most private option. You’ll sleep better, and it’s the right thing to do!

Scoping Recording Rules

With the introduction of FullStory’s Preview Mode, Admins now have the ability to test new recording rules on themselves before pushing these changes live for actual end-users. This should help to increase the confidence that Admins have about new iterations of their recording settings and should reduce the need to constantly test new recording rules in an actual staging environment.

As noted briefly in the Settings UI section above, all element recording rules can now be Scoped. This means that you can set recording rules to function in four different ways:


To learn more about using scoped rules with FullStory's Preview Mode, please check out the existing help article for Preview Mode.

Need to get in touch with us?

The FullStory Team awaits your every question.

Contact us