Data Privacy (GDPR, PCI)
Feature
Any data can be masked, anonymized or excluded (not collected) by Germain.
Mask
Data is captured as “***” instead of real value, and sent back to Germain enterprise, then stored within whichever datastore is used (on premise or cloud).
Additional advanced settings are available in this option:
Preserve or not the length of the real value
Preserve or not whitespaces of the real value
Examples:
User name “admin” masked with preserved length

User name “admin” masked without preserved length

Anonymize
Data is captured as hashed value instead of real value, and sent back to Germain enterprise, then stored within whichever datastore is used (on premise or cloud).
Examples:
User name “admin” anonymized

Exclude
Data is not captured/stored anywhere and not sent back to the Germain enterprise.
Examples:
User name “admin” excluded

Login form’s inputs excluded

Configuration
Go to Analytics > Data Privacy to:
add new configuration
review and update existing configuration entries

To add new Data Privacy configuration click :plus: button and pick one option:
Data Field Exclusion (applies to fields on all data points across the entire system, e.g. user.name, userAgent.family, sessionId, …)
Session Replay Exclusion (applies to UI/HTML/DOM elements available on UX Session Replay only, e.g. div[id=”credit-card”], input, form, …)
Data Field Exclusion
The following steps show how to add new Data Field Exclusion:
Go to Analytics > Data Privacy, click :plus: button and select Data Field Exclusion
Fill in the wizard form:
Name*: Data Field Exclusion name
Field Name*: Field name to apply the exclusion on
[KPI]: Optional constraint on the KPI to apply the exclusion on (if not selected then exclusion will apply to all data points)
Type*: Exclusion type
[Advanced Settings for Mask option only]:
Preserve Length: If true, excluded field value will have the same length as the original otherwise the length value will be randomized, example: If true, original value: admin (4 char. long), exclusion value: **** (also 4 char. long).
Preserver Whitespace: If true, will preserve whitespace characters when masking otherwise will skip whitespace characters, example: if true, original value: This is a test, exclusion value: **** ** * ****.
[Advanced Settings for all options]:
Pattern: Pattern to optionally match exclusion value. Example: "User: (.*)"
The example below shows how to mask username field on all data points without preserving its length and whitespace.

Session Replay Exclusion
The following steps show how to add new Session Replay Exclusion:
Go to Analytics > Data Privacy, click :plus: button and select Session Replay Exclusion
Fill in the wizard form:
Application Profile*: Which settings profile should this exclusion be added to
Name*: Session Replay Exclusion name
Element Selector*: Tag name or * wildcard, optionally followed by one attribute constraint. See example for syntax. Example: div[id="credit-card"]
Type*: Exclusion type
[Advanced Settings for Mask option only]:
Preserve Length: If true, excluded field value will have the same length as the original otherwise the length value will be randomized, example: If true, original value: admin (4 char. long), exclusion value: **** (also 4 char. long).
Preserver Whitespace: If true, will preserve whitespace characters when masking otherwise will skip whitespace characters, example: if true, original value: This is a test, exclusion value: **** ** * ****.
[Advanced Settings for all options]:
Pattern: Pattern to optionally match exclusion value. Example: "User: (.*)"
The example below shows how to exclude completely input fields which contain credit card information from the UX Session Replay collection.

Form Privacy
Form Policy is a predefined set of rules to exclude from collection sensitive user information entered in form elements. These rules apply to UX Session Replay monitoring only and, once enabled, they can be updated or disabled on demand per UX Monitoring Profile. The following rules get installed when Form Privacy is enabled:
Form Privacy Mask rule (masking following HTML elements):
<input/>
<textarea/>
<select/>
<datalist/>
<option/>
<[contenteditable]/>
<[autocomplete^=cc-]/>
Form Privacy Exclude rule (excluding following HTML elements):
<input type="checkbox"/>
<input type="radio"/>
Configuration
You can enable Form Privacy set of rules when deploying Germain monitoring for the first time:

You can update Form Privacy rules either from global Data Privacy view either from a particular UX Monitoring Profile.
Data Privacy view
Go to Analytics > Data Privacy
Search for UX Monitoring Profile for which Form Privacy has been enabled (e.g. reactjs2 in this example)
Two rules should be available in default configuration: Form Privacy Mask and Form Privacy Exclude
Pick one of the rule and edit it

Dynamic Data Privacy
Each individual “fact” in Germain data model can be secured following a Privacy Script that your organization can inject into Germain. That Privacy Script is inserted in:
either in a Germain RUM JS’s Init Script, for User Session Replay-related data
or in a “rule” for other fact/data (that you configure Germain to collect) and visible at Germain Workspace > Left Menu > Analytics > Rules.
Example
This client needed to dynamically set the visibility of the User Session that Germain records, so that a Recorded User Session cannot be replayed by any Team but instead only a dedicated Team is entitled to view them, based on the financial stock(s) that was/were being traded in that recorded user session. To achieve this, the client customized Germain RUM JS’s init script with its data privacy logic.
Germain RUM JS’s init script:
Example to add access controls to all facts including replay:
/**
* Sets all facts (and the Replay itself) to be visible based on the user being monitored
*
* In the example below:
* - Application User is an Admin user - Data visible to Germain UX Technical team only
* - Application User is a Business user - Data visible to Germain UX Technical team OR Germain UX Business team
* - Application User is any other type - Data visible to all Germain UX users
*/
settings.application.metadataProviders['access'] = function(window) {
// These constants are available from the Teams view in Germain UX
const technicalTeamAccessId = 't0';
const businessTeamAccessId = 't1';
if (isAdminUser(user)) {
// If the user being collected is an Admin user (within the application being
// monitored), only allow the Technical Team (in Germain UX) to access the replay
return technicalTeamAccessId;
} else if (isBusinessUser(user)) {
// If the user being collected is a Business user (within the application being monitored),
// allow the Technical Team (in Germain UX) or Business Team (in Germain UX) to access the replay
return `${technicalTeamAccessId} || ${businessTeamAccessId}`;
}
// Otherwise any Germain UX user can view the replay
return undefined;
};
function isAdminUser(user) {
// custom application logic here...
return user.type === 'Admin';
}
function isBusinessUser(user) {
// custom application logic here...
return user.type === 'Business';
}
Example to add access controls to a specific type of fact (in this example UxConsoleEvent), not including replay:
/**
* Sets UxConsoleEvents to be visible based on the user being monitored
*
* In the example below:
* - Application User is an Admin user - Data visible to Germain UX Technical team only
* - Application User is a Business user - Data visible to Germain UX Technical team OR Germain UX Business team
* - Application User is any other type - Data visible to all Germain UX users
*/
settings.application.factProcessor = (fact) => {
if (fact.myClassName === 'UxConsoleEvent') {
// These constants are available from the Teams view in Germain UX
const technicalTeamAccessId = 't0';
const businessTeamAccessId = 't1';
if (isAdminUser(user)) {
// If the user being collected is an Admin user (within the application being monitored),
// only allow the Technical Team (in Germain UX) to access this fact
fact.access = technicalTeamAccessId;
} else if (isBusinessUser(user)) {
// If the user being collected is a Business user (within the application being monitored),
// allow the Technical Team (in Germain UX) or Business Team (in Germain UX) to access this fact
fact.access = `${technicalTeamAccessId} || ${businessTeamAccessId}`;
} else {
// do nothing, this will mean the fact is visible to all Germain UX users
}
}
};
function isAdminUser(user) {
// custom application logic here...
return user.type === 'Admin';
}
function isBusinessUser(user) {
// custom application logic here...
return user.type === 'Business';
}
Notes:
The isAdminUser and isBusinessUser would be logic based on the monitored application.
This logic is completely customisable, above are only examples, the important parts are:
In the first example the settings.application.metadataProviders['access'] should return the access expression
In the second example, the settings.application.factProcessor should set the fact.access property to the access expression for the fact
We support complex syntax for these access expressions:
t1 => only members of the Team with accessId t1 can see the data
t1 || t2 => members of either Team with accessId t1 OR t2 can see the data
t1 && t2 => members must be members of both Teams with accessId t1 AND t2 to be able to see the data
UX Monitoring Profile view
Go to Analytics > UX Monitoring Profiles
Search for UX Monitoring Profile for which Form Privacy has been enabled (e.g. reactjs2 in this example)
Select a profile and scroll down in the Editor to Session Replay Exclusions section
Two rules should be available in default configuration: Form Privacy Mask and Form Privacy Exclude
Pick one of the rule and edit it
