LiveRamp
This document provides the required information for integrating LiveRamp's GDPR for web and contentpass. Please complete the following general steps first
General Tasks
Here, all general tasks are listed. contentpass does not directly obtain or store any user consent, or any other personal data for that matter. We have integrations with several Consent Management Providers though. Everything CMP-specific is described in the according sub-pages.
Steps:
- Make sure no third party resources are loaded without consent
- Sign up for a contentpass account
- Configure CNAME Record for contentpass Session Management
- Mention contentpass in Privacy Policy
- Integrate contentpass with your CMP
- Further improvements
0. Load third party resources after consent
Visit our docs on Third Party Resources for more information on how to block third parties and the technical details on why this is important.
1. Sign up for contentpass
Go to publisher.contentpass.net and create your publisher account. The wizard will guide you through the steps of creating a publisher profile as well as the first property. The property's status page will present the required steps for a successful contentpass integration. This document contains further details that should help you with the process.
2. Configure CNAME Record for contentpass Session Management
Since 3rd-party cookies don't work reliably anymore in most browsers, contentpass subscribers must be identified using a 1st-party session.
To simplify handling of these 1st-party sessions, contentpass provides an endpoint that must be configured behind a CNAME subdomain of the publisher's first-party domain.
In the following example we assume that the publisher's website is: https://www.example.com and the propertyId is 1234abcd. You can find your propertyId in the settings of your property. Can't find it? Get in touch with us to obtain your propertyId.
A CNAME must be set up as follows:
cp.example.com. 300 IN CNAME 1234abcd.with.contentpass.net.
Once the CNAME has been set up, contentpass will automatically provision the required SSL certificates.
3. Mention contentpass in Privacy Policy
While we do not process any data of non-subscribers, we receive the IP addresses of your visitors for technical reasons. Please inform your visitors about this data processing and link to our privacy policy by including the following snippet on your privacy policy page:
- plain text
- html
contentpass
Auf unserer Website bieten wir Ihnen einen Service zum werbe- und tracking-freien Zugang an. Dieser Service nennt sich contentpass und ist ein Angebot der Content Pass GmbH, Wolfswerder 58, 14532 Kleinmachnow, Deutschland. Beim Abschluss des Service wird contentpass Ihr Vertragspartner. Weitere Informationen zu diesem Service finden Sie auf contentpass.net.
Um Ihnen diesen Service auf unserer Webseite anzuzeigen und damit anbieten können, verarbeitet contentpass, in unserem Auftrag, zu Beginn Ihres Webseitenaufrufs Ihre IP-Adresse. Für die Registrierung sowie die Vertragsabwicklung des contentpass und die damit einhergehende Datenverarbeitung ist contentpass Verantwortlicher im Sinne der DS-GVO. Wir sind ausschließlich Verantwortlicher für die Verarbeitung Ihrer IP-Adresse. Für weitere Informationen bezüglich der Datenverarbeitung bei contentpass, lesen Sie bitte die dortigen Datenschutzhinweise.
Grundlage für die Datenverarbeitung der IP-Adresse, im Rahmen unserer Auftragsverarbeitung mit contentpass, ist unser berechtigtes Interesse Ihnen die Möglichkeit zu bieten, unsere Webseite werbe- und tracking-frei aufrufen zu können und Ihr Interesse an der Nutzung unserer Webseite praktisch ohne Werbung und Tracking [Art. 6 Abs. 1 S. 1 lit. f.) DS-GVO]. Zudem erfüllen wir hiermit die rechtliche Verpflichtung, eine rechtskonforme Zustimmung in einwilligungsbedürftige Datenverarbeitungen einzuholen [Art. 6 Abs. 1 lit. c) DS-GVO].
Sie können sich hier in Ihren contentpass Account einloggen, und sich hier für contentpass anmelden.
<h3>contentpass</h3>
<p>Auf unserer Website bieten wir Ihnen einen Service zum werbe- und tracking-freien Zugang an. Dieser Service nennt sich contentpass und ist ein Angebot der Content Pass GmbH, Wolfswerder 58, 14532 Kleinmachnow, Deutschland. Beim Abschluss des Service wird contentpass Ihr Vertragspartner. Weitere Informationen zu diesem Service finden Sie auf <a href="https://www.contentpass.net/">contentpass.net</a>.</p>
<p>Um Ihnen diesen Service auf unserer Webseite anzuzeigen und damit anbieten können, verarbeitet contentpass, in unserem Auftrag, zu Beginn Ihres Webseitenaufrufs Ihre IP-Adresse. Für die Registrierung sowie die Vertragsabwicklung des contentpass und die damit einhergehende Datenverarbeitung ist contentpass Verantwortlicher im Sinne der DS-GVO. Wir sind ausschließlich Verantwortlicher für die Verarbeitung Ihrer IP-Adresse. Für weitere Informationen bezüglich der Datenverarbeitung bei contentpass, lesen Sie bitte die dortigen <a href="https://www.contentpass.net/privacy">Datenschutzhinweise</a>.</p>
<p>Grundlage für die Datenverarbeitung der IP-Adresse, im Rahmen unserer Auftragsverarbeitung mit contentpass, ist unser berechtigtes Interesse Ihnen die Möglichkeit zu bieten, unsere Webseite werbe- und tracking-frei aufrufen zu können und Ihr Interesse an der Nutzung unserer Webseite praktisch ohne Werbung und Tracking [Art. 6 Abs. 1 S. 1 lit. f.) DS-GVO]. Zudem erfüllen wir hiermit die rechtliche Verpflichtung, eine rechtskonforme Zustimmung in einwilligungsbedürftige Datenverarbeitungen einzuholen [Art. 6 Abs. 1 lit. c) DS-GVO].</p>
<p>Sie können sich <a href="https://www.contentpass.net/login/" onclick="cp('login'); return false;" target="_self" >hier</a > in Ihren contentpass Account einloggen, und sich <a href="https://www.contentpass.net/register/" onclick="cp('signup'); return false;" target="_self" >hier</a> für contentpass anmelden. </p>
Note:
Link target for login:
javascript: cp('login');
Link target for signup:
javascript: cp('signup');
Since these are not quite ordinary links, it may happen that your CMS does not support them. In that case, you can simply link to https://www.contentpass.net/login and https://www.contentpass.net/signup instead.
4. LiveRamp Contentpass integration
Please add the following script below the LiveRamp script. Make sure to check/update the LiveRamp appId and the contentpass variables cpBaseUrl and cpPropertyId.
<script src="https://gdpr-wrapper.privacymanager.io/gdpr/{{appId}}/gdpr-liveramp.js">
</script>
<script type="text/javascript" charset="UTF-8">
!function() {
var cpBaseUrl = 'https://cp.example.com';
var cpController = cpBaseUrl + '/now.js';
var cpPropertyId = '1234abcd';
!function(C,o,n,t,P,a,s){C['CPObject']=n;C[n]||(C[n]=function(){
(C[n].q=C[n].q||[]).push(arguments)});C[n].l=+new Date;a=o.createElement(t);
s=o.getElementsByTagName(t)[0];a.src=P;s.parentNode.insertBefore(a,s)}
(window,document,'cp','script',cpController);
// Will activate Contentpass and initialize basic interfaces for
// communicating with Contentpass
cp('create', cpPropertyId, {
baseUrl: cpBaseUrl
});
// Will render the wall provided by contentpass.
// If user gives full consent, the onFullConsent callback is fired.
// If user is logged into contentpass and has a valid subscription for the
// current website, no wall is displayed.
// Use the cp('authenticate') function below to react on further details
// regarding contentpass users.
cp('render', {
onFullConsent: function() {
console.log('[DEMO] onFullConsent');
// load advertising
}
});
// Will evaluate the user's login state regarding contentpass and whether
// user has a valid subscription.
// This call is optional as "cp('render')" above is also checking for the
// contentpass subscription state.
// Use this function for example to update your layout for contentpass users.
cp('authenticate', function (error, user) {
if (error) {
// Error handling depending on use case
return;
}
if (user.isLoggedIn() && user.hasValidSubscription()) {
// User has valid subscription
} else {
// User has no valid subscription
}
});
}()
</script>
5. Further Improvements
5.1 Performance Optimizations (optional)
Providing a reliable and high-performant service is one of our highest concerns. One such way is by ensuring our now.js bundle is as small as possible (~25 KB) and also having our components loaded asynchronously, so chunks are fetched only as needed.
Speed up connection to our servers
One way in which you can improve the initial loading time of your page is by adding a preconnect link element to the head of your website. This will tell the browser to initiate a connection to our servers as early as possible so it is ready when our actual SDK is requested.
The following tag is for demonstration purposes only. The href placeholder https://cp.example.com should use the CNAME created for your property. You can find the correct values for the property on the publisher dashboard.
Please replace the href placeholder and add the following tag to the head of your page, as high up in the HTML as possible.
<link rel="preconnect" href="https://cp.example.com" />
You can also initiate a preconnect via the Link HTTP header
Additionally, moving our SDK script tag high up in the HTML will also help make the response time of the page quicker as the browser can fetch the resources it needs to render the first layer immediately.
Fast Path Loading
In some rare situations you may want to load third-parties without basing it on TCF-Consent, but not load them for contentpass users. There is a way to accomplish this without relying on our backend, thus without additional request. Please consult our fast path section in the third-party docs for details.
5.2 Improving UX for contentpass users
We offer a few methods for you to recognize if the current visitor is a contentpass subscriber, so you can improve the user experience for them. This can be achieved on both the client and server side.
Client-Side Javascript
To check if a contentpass subscriber is authenticated on the front-end we recommend using our SDK method: cp('authenticate'), see our web-sdk docs for more details.
The callback argument will return an object that contains all the up-to-date information you need to determine a user with a valid contentpass session. You can see an implementation of this in our fast path example in the third party resources page.
cp('authenticate', function (error, user) {
if (error) {
// Error handling depending on use case
return;
}
if (user.isLoggedIn() && user.hasValidSubscription()) {
// User has valid subscription
} else {
// User has no valid subscription
}
});
The .cpauthenticated CSS class
To avoid having lots of empty ad-slots for contentpass users, we provide a way to recognize contentpass users on the client-side via CSS.
When an authenticated contentpass user is logged in we add the .cpauthenticated class name to the body tag of the page. (Read here for information on why we add this class).
This way you can apply style rules to hide elements on the page, depending on the user's authentication status.
We do not recommend relying on this as a robust method for recognizing contentpass users for business logic. CSS classes can be easily manipulated by the user or any other javascript running on the page. Additionally there is no guarantee that the CSS styles are applied before your javascript runs.
As an example, if your ad spaces use the class name .ad-slot you can hide them for contentpass users with the following CSS override:
/* Add this to your global CSS style-sheet or in the head of your page */
body .cpauthenticated .ad-slot {
display: none !important;
}
Please ensure that this CSS rule is applied as early as possible on your page to avoid layout shifts of the page content! Adding it to the first CSS file that is loaded on your page is recommended, or as high up as possible in the <head> of your page.
Server-Side Cookie
For recognizing contentpass users on the backend we provide a _cpauthhint cookie that we set on the user's browser. If the user is a logged-in contentpass user the cookie will have a value of 1 and 0 if they are logged out.
The following is a simplified-code example of how one might check for the cookie on a node.js server, in order to serve content without anti-adblocking messages for contentpass users and only for regular users.
// Middleware to check the "_cpauthhint" cookie
function checkUserType(req, res, next) {
const cpAuthHintCookie = req.cookies._cpauthhint;
// Check if the cookie exists and has the value for a logged in CP user
req.isLoggedInCpUser = cpAuthHintCookie === '1';
next();
}
// Route that uses the authentication middleware
app.get('/dashboard', checkUserType, function (req, res) {
// Render different views for ContentPass users and regular users
if (req.isCpUser) {
res.render('dashboard', { user: 'ContentPassUser', showAdblockCommunication: false });
} else {
res.render('dashboard', { user: 'RegularUser', showAdblockCommunication: true });
}
});