To collect analytics about your storefront visitors, you might need to establish consent. Use Shopify's [built-in cookie banner](#activate-the-shopify-cookie-banner) to get consent from your customers. ## Configure your domains (required) Some consent settings require setting the specific domain names for your store. ### Configure your Hydrogen checkout domain This keeps your customers' preferences consistent across storefronts and checkout. 1. Start a checkout from your store, then copy the domain name from the checkout. 1. For example, `hydrogen.shop` has a checkout domain of `checkout.hydrogen.shop`. 1. From your Hydrogen storefront admin, go to **Storefront settings > Environments and variables**. 1. Add a new environment variable with a key of `PUBLIC_CHECKOUT_DOMAIN` and the value of your checkout domain. 1. Don't include `https://`. 1. Apply the variable to your **Production** environment. <figure class="figure"><img src="https://cdn.shopify.com/shopifycloud/shopify_dev/assets/custom-storefronts/hydrogen/analytics/hydrogen-analytics-checkout-domain-05ebfc656b776e063fcf9ee8f6efe1b25a1479cdb6e1022abdddc36488d19bee.png" class="lazyload" alt="Hydrogen demo store checkout domain environment variable" width="1978" height="1290"></figure> ### Add your domains to your content security policy Make sure both your store and checkout domains are included in your [content security policy](/docs/storefronts/headless/hydrogen/content-security-policy). This configuration is scaffolded by default with Hydrogen's Skeleton template. Check that your project includes the required domains: <p> <div class="react-code-block" data-preset="file"> <div class="react-code-block-preload ThemeMode-dim"> <div class="react-code-block-preload-bar "></div> <div class="react-code-block-preload-placeholder-container"> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> </div> </div> <script data-option="filename" data-value="Add store and checkout domain to CSP"></script> <script type="text/plain" data-language="jsx" data-filename="/app/entry.server.jsx" data-title="JavaScript"> export default async function handleRequest( request: Request, responseStatusCode: number, responseHeaders: Headers, remixContext: EntryContext, context: AppLoadContext, ) { const {nonce, header, NonceProvider} = createContentSecurityPolicy({ shop: { checkoutDomain: context.env.PUBLIC_CHECKOUT_DOMAIN, storeDomain: context.env.PUBLIC_STORE_DOMAIN, } }); </script> <script type="text/plain" data-language="tsx" data-filename="/app/entry.server.tsx" data-title="TypeScript"> export default async function handleRequest( request: Request, responseStatusCode: number, responseHeaders: Headers, remixContext: EntryContext, context: AppLoadContext, ) { const {nonce, header, NonceProvider} = createContentSecurityPolicy({ shop: { checkoutDomain: context.env.PUBLIC_CHECKOUT_DOMAIN, storeDomain: context.env.PUBLIC_STORE_DOMAIN, } }); </script> <script type="text/plain" data-language="ts" data-filename="/app/env.d.ts" data-title="Type declaration file"> declare global { // ... interface Env { // ... PUBLIC_CHECKOUT_DOMAIN: string; } } </script> </div> </p> ## Activate the Shopify cookie banner > Note: > You're responsible for ensuring that all analytics you're sending from your Hydrogen site are compliant with consent laws. 1. From your Shopify admin, go to **Settings > Customer Privacy > Cookie banner**. 1. Select the regions where your banner should display. 1. (Optional) In the **Appearance** section, click **Customize**. Make any required changes to the wording, colors, or preferences, then click **Save**. 1. (Optional) In the **Position** section, choose how you want the cookie banner to be positioned. 1. Click **Save**. 1. To display the Shopify cookie banner on your site, in your Hydrogen project pass in `withPrivacyBanner: true` in the `consent` prop. <p> <div class="react-code-block" data-preset="file"> <div class="react-code-block-preload ThemeMode-dim"> <div class="react-code-block-preload-bar "></div> <div class="react-code-block-preload-placeholder-container"> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> </div> </div> <script data-option="filename" data-value="Enable Shopify privacy banner"></script> <script type="text/plain" data-language="jsx" data-filename="/app/routes/root.jsx" data-title="JavaScript"> <Analytics.Provider consent={ { checkoutDomain: `ENV_PUBLIC_CHECKOUT_DOMAIN`, storefrontAccessToken: `ENV_PUBLIC_STOREFRONT_API_TOKEN`, withPrivacyBanner: true, } } > { /* ... */ } </Analytics.Provider> </script> </div> </p> This is what the default cookie banner looks like on the Hydrogen demo store: <figure class="figure"><img src="https://cdn.shopify.com/shopifycloud/shopify_dev/assets/custom-storefronts/hydrogen/analytics/hydrogen-analytics-cookie-banner-example-99f06c21f6972e3e2f7a2107de1698ec061a08bdd755a938092f04e4d9d601aa.png" class="lazyload" alt="Hydrogen demo store showing Shopify’s default cookie permission banner" width="2340" height="1820"></figure> ## Set a different language for the Shopify cookie banner (Optional) If you need to display the cookie banner in a different language, then specify the country and language in the consent config: <p> <div class="react-code-block" data-preset="file"> <div class="react-code-block-preload ThemeMode-dim"> <div class="react-code-block-preload-bar "></div> <div class="react-code-block-preload-placeholder-container"> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> <div class="react-code-block-preload-code-container"> <div class="react-code-block-preload-codeline-number"></div> <div class="react-code-block-preload-codeline"></div> </div> </div> </div> <script data-option="filename" data-value="Enable Shopify privacy banner"></script> <script type="text/plain" data-language="jsx" data-filename="/app/routes/root.jsx" data-title="JavaScript"> <Analytics.Provider consent={ { checkoutDomain: `ENV_PUBLIC_CHECKOUT_DOMAIN`, storefrontAccessToken: `ENV_PUBLIC_STOREFRONT_API_TOKEN`, withPrivacyBanner: true, // localize the privacy banner country: storefront.i18n.country, language: storefront.i18n.language, } } > { /* ... */ } </Analytics.Provider> </script> </div> </p> ## Troubleshooting If the cookie banner doesn't display, then check the following: - The cookie banner won't work on default Oxygen URLs (`*.myshopify.dev`). Run the project locally or assign a domain to your Oxygen project. - Ensure your region is selected in **Settings > Customer Privacy > Cookie banner > Regions**. - Ensure that your checkout domain is set correctly. - Ensure that your [content security policy](#add-your-domains-to-your-content-security-policy) is configured correctly. - Ensure that you've added the `withPrivacyBanner: true` option to your `Analytics.Provider`. ## Next steps <div class="resource-card-grid"> <div> <a class="resource-card" href="/docs/storefronts/headless/hydrogen/analytics/tracking" data-theme-mode=""> <div class="resource-card__indicator-container"><img src="/assets/resource-cards/analytics" data-alt-src="/assets/resource-cards/analytics-dark" aria-hidden="true" class="resource-card__icon themed-image"></div> <h3 class="resource-card__title"> Add Analytics tracking to Hydrogen </h3> <p class="resource-card__description">Manually implement analytics event tracking in Hydrogen, or upgrade an older project</p> </a> </div></p> <p><div> <a class="resource-card" href="/docs/storefronts/headless/hydrogen/analytics/validation" data-theme-mode=""> <div class="resource-card__indicator-container"><img src="/assets/resource-cards/cli" data-alt-src="/assets/resource-cards/cli-dark" aria-hidden="true" class="resource-card__icon themed-image"></div> <h3 class="resource-card__title"> Validate and troubleshoot Hydrogen analytics </h3> <p class="resource-card__description">Test that your analytics are working and check for common errors</p> </a> </div> </div>