---
title: "Meta Pixel Analytics on Event Landing Page"
description: "Learn how to implement Meta Pixel analytics handling in your event in Meeting Application"
url: https://help.meetingapplication.com/en/articles/9497480-meta-pixel-analytics-on-event-landing-page
collection: "Technical stuff"
updated: 2026-10-12
language: en
alternates: [pl]
---

# Meta Pixel Analytics on Event Landing Page

Learn how to implement Meta Pixel analytics handling in your event in Meeting Application

## Meta Pixel on Your Event's Landing Page in Meeting Application

Meta Pixel allows you to track user actions on **your event's Landing Page in Meeting Application** and send Meta information about subsequent stages of the purchase journey — from entering the page, through adding a ticket to the cart, to the purchase.

You can connect Meta Pixel to your event's Landing Page in **two ways**:

-   **Path A — Meta Pixel embedded in the Landing Page** — we configure the integration on the Meeting Application side.
    
-   **Path B — Meta Pixel via your Google Tag Manager** — you configure the Pixel yourself in your GTM container.
    

> **Warning:** Before you start.
>
> For one event, use only **one Meta Pixel integration path**.
>
> Do not run the embedded Pixel and Meta Pixel tags in your Google Tag Manager at the same time. In such a case, the same events and conversions may be sent to Meta twice.
>
> If you are unsure which configuration is active for your event, **contact us before launching the Pixel**.

  

## Two integration paths — key differences

<table data-id="be8b6c07-690b-4fa3-b5be-e860051a8072" style="min-width: 181px;"><colgroup><col style="width: 131px;"><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1"><p data-id="51deadbb-65b6-4686-81f4-055ad6bf6b19"></p></td><td colspan="1" rowspan="1"><p data-id="1adb9153-68d6-47ca-8104-1e5a5e14cb63"><strong>Path A — Built-in Pixel</strong></p></td><td colspan="1" rowspan="1"><p data-id="99147635-8459-4870-9116-64e7cbc93d03"><strong>Path B — Pixel via Your GTM</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="7bc9e9fd-6562-4df2-8052-30d787e5eefe"><strong>Who configures Meta Pixel?</strong></p></td><td colspan="1" rowspan="1"><p data-id="9c3f9895-5c4a-485b-8b5c-65a315ca0ee5">Meeting Application</p></td><td colspan="1" rowspan="1"><p data-id="52ebaa10-a99f-40c0-bea8-e5442cc72a50">You or a specialist / agency managing your GTM</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="9c178998-8cf3-4e9c-b82c-b1fbd6679d2d"><strong>Where does the configuration work?</strong></p></td><td colspan="1" rowspan="1"><p data-id="0c88c831-b706-41b5-94f6-748dc07c454f">Directly in the Landing Page code</p></td><td colspan="1" rowspan="1"><p data-id="8d70d309-8a10-4f8b-91a0-72101755ba46">In your Google Tag Manager container</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="2c40fc7d-b255-4469-9eed-c7f00b04a6e8"><strong>Pixel ID</strong></p></td><td colspan="1" rowspan="1"><p data-id="c5d292b2-b8d6-46bf-81b0-d42ea50247ed">You pass it to us</p></td><td colspan="1" rowspan="1"><p data-id="de1c06bf-d88a-4bb0-92ea-f16b2b450d1d">You use it exclusively in your own GTM — you do not pass it to Meeting Application</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="6439d44d-feae-4487-b71f-b470337c2ee8"><strong>Later changes</strong></p></td><td colspan="1" rowspan="1"><p data-id="f780e9c6-21e8-400c-a68b-f10878c3985f">Require a change on the Meeting Application side</p></td><td colspan="1" rowspan="1"><p data-id="27da524a-7ce0-45e5-bda7-deb7a13267d3">You can make them yourself in GTM</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="3a52c7df-1b12-499b-bcc1-027ba01eceb8"><strong>Scope of basic events</strong></p></td><td colspan="1" rowspan="1"><p data-id="59adaebd-b545-4ccb-9e5d-8585c9076798">Full purchase funnel + <code>CompleteRegistration</code> for free joining without a cart</p></td><td colspan="1" rowspan="1"><p data-id="da4e2eb4-a45d-4c31-997e-565b832f717e">Full purchase funnel</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="b9143ea4-2615-4261-98d6-c61f2ba853f4"><strong>eventID at Purchase</strong></p></td><td colspan="1" rowspan="1"><p data-id="0bc7cd34-840f-43d6-857a-9098f85ca7f1">Handled automatically</p></td><td colspan="1" rowspan="1"><p data-id="064b19f5-a759-450e-aaab-3bc7bdb56639">You configure it according to the instructions below</p></td></tr></tbody></table>

If you do not manage Google Tag Manager independently, the simpler option is **Path A**.

If you have your own GTM specialist or agency and want to manage the Meta Pixel configuration independently, choose **Path B**.

## Before you choose a path — prepare the shared configuration

Both options use the same basic elements.

### 1\. Prepare Meta Pixel

Create a Pixel in your **Meta Events Manager**:

**Connect data sources → Web**

In the data set settings you will find **Pixel ID** — a string of 15–16 digits.

Meta currently also uses the term **data set — dataset**. Dataset ID and Pixel ID refer to the same identifier here.

You will need the Pixel ID in the further configuration:

-   in **Path A** you will pass it to Meeting Application,
    
-   in **Path B** you will use it independently during tag configuration in your GTM.
    

### 2\. Configure Cookiebot

**Cookiebot is required in both paths.**

Landing Page runs marketing scripts according to the consent provided by the user. Without proper Cookiebot configuration, Meta Pixel will not work according to the intended consent mechanism.

Prepare:

-   Cookiebot account and configuration,
    
-   Cookiebot identifier,
    
-   the domain of the Landing Page event added in your Cookiebot panel.
    

> ### 📌 Before you proceed
> 
> If you have not yet configured Cookiebot and Google Tag Manager for your event's Landing Page, start with this configuration. You will find detailed instructions in the article: [**Sales Analysis via Google Analytics — Google Tag Manager and Cookiebot**](https://help.meetingapplication.com/pl/articles/9497444-analiza-sprzedazy-poprzez-google-analytics.md)

### 3\. Prepare Google Tag Manager

Your event's Landing Page must have your Google Tag Manager container connected.

Its identifier has the format:

`GTM-XXXXXXX`

Please provide us with:

-   **GTM container ID**,
    
-   **Cookiebot identifier**.
    

On our end, we will connect both identifiers to your event's configuration.

Ta konfiguracja pozwala Landing Page załadować Twój kontener GTM oraz przekazywać do `dataLayer` zdarzenia i sygnały zgody.

> **Success:** ID kontenera GTM i identyfikator Cookiebot są elementami konfiguracji Landing Page **w obu ścieżkach Meta Pixel**. Warto przekazać nam oba identyfikatory na początku konfiguracji analityki wydarzenia.

### 4\. Wyłącz automatyczne zdarzenia Meta

W **Meta Events Managerze**, w ustawieniach Pixela, rekomendujemy wyłączenie:

**„Śledź zdarzenia automatycznie bez kodu”  
Track events automatically without code**

Konfiguracje opisane w tym artykule korzystają z konkretnie zdefiniowanych zdarzeń.

Wyłączenie automatyki pomaga uniknąć dodatkowych zdarzeń generowanych samodzielnie przez Meta i utrzymać czytelne dane.

## Ścieżka A — Meta Pixel wbudowany w Landing Page

> **Info:** In this variant, Meta Pixel integration is maintained directly in the Landing Page Meeting Application code and is enabled for a specific event.

You do not need to manually map Meta events in Google Tag Manager.

### What do you need to provide us with?

After preparing the joint configuration, please provide us with:

-   **Pixel ID**,
    
-   confirmation that your GTM container **does not trigger Meta Pixel tags for this Landing Page**.
    

> ### ⚠ If you already have Meta Pixel in your GTM
> 
> Before we launch the built-in integration, disable Meta Pixel tags running in your GTM for the event's Landing Page.
> 
> If both sources are active at the same time, events may be counted twice.

After receiving the necessary information, we will configure Meta Pixel for your event.

Subsequent changes to this integration require modification on the Meeting Application side.

### What events will you receive in Path A?

<table data-id="3e53712f-4f25-43a0-aa11-ef45ad622125" style="min-width: 75px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1"><p data-id="07ee161f-995d-4383-ab2e-3b187beebf3b"><strong>Meta Event</strong></p></td><td colspan="1" rowspan="1"><p data-id="9c1deb66-a89e-4902-a98f-bcfa9c854659"><strong>When is it sent?</strong></p></td><td colspan="1" rowspan="1"><p data-id="65252b05-76d4-4710-9055-e9ece0e0e700"><strong>Key parameters</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="1db42980-01f6-4ec1-9a98-2ae3fb9eb346"><code>PageView</code></p></td><td colspan="1" rowspan="1"><p data-id="1f44dbd4-70aa-40d3-be1e-ad19fbf92ea2">Landing page entry and every page change</p></td><td colspan="1" rowspan="1"><p data-id="a115354c-a99a-40a1-9167-93ccb82f0720">—</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="3fd80cbb-cc4e-4686-b91d-de743fa938c9"><code>ViewContent</code></p></td><td colspan="1" rowspan="1"><p data-id="8843b45e-f88d-4cc0-8021-a937b7832945">Just before adding an item to the cart</p></td><td colspan="1" rowspan="1"><p data-id="88636d15-e765-464a-8021-16552f3f3353"><code>content_ids</code>, <code>content_name</code>, net value, currency</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="ed566537-b8b9-4387-aef3-272892d6b2b8"><code>AddToCart</code></p></td><td colspan="1" rowspan="1"><p data-id="fc7f69de-d3a4-4c5c-8324-1fdd9b648b87">Adding a ticket, add-on or workshop to the cart</p></td><td colspan="1" rowspan="1"><p data-id="795d6025-e8d8-46d4-a49c-877a026cc179"><code>contents</code>, value of added item, currency</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="0a7f9f84-8a2b-4699-8916-ba16c73655b9"><code>InitiateCheckout</code></p></td><td colspan="1" rowspan="1"><p data-id="d4f7b363-fb40-48da-9992-d31657176c5f">Payment initiation</p></td><td colspan="1" rowspan="1"><p data-id="c131b915-e690-4384-bdcc-0966adce4769"><code>contents</code>, net value of cart, number of items</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="c7a88819-21af-4d57-bacb-9b04f7ced466"><code>AddPaymentInfo</code></p></td><td colspan="1" rowspan="1"><p data-id="442357bc-5187-4305-8a96-158681a6cd84">Payment method selection</p></td><td colspan="1" rowspan="1"><p data-id="0e42cd75-fccc-4c19-b62a-98ef5d745872"><code>contents</code>, net value, currency</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="78b7532b-918c-4b2f-8eda-c9a731b429f2"><code>Purchase</code></p></td><td colspan="1" rowspan="1"><p data-id="c0541bdc-9bb4-42d2-a166-b1f5a79d8368">Confirmed payment</p></td><td colspan="1" rowspan="1"><p data-id="e22dec92-1c22-4a95-956f-e016b4289605">gross value, currency, <code>contents</code>, <code>eventID</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="0b1f8f6a-ab24-44f3-b9f6-1e993275e886"><code>CompleteRegistration</code></p></td><td colspan="1" rowspan="1"><p data-id="08176f37-5ca3-4d14-ad4a-75b38ef5bc28">Free event registration without cart</p></td><td colspan="1" rowspan="1"><p data-id="915dd096-e540-4e5c-bcee-b397e07f1124"><code>status</code></p></td></tr></tbody></table>

### How does this path work?

Pixel:

-   does not send events before obtaining marketing consent,
    
-   does not duplicate `PageView` while navigating the Landing Page,
    
-   has Meta automatic events disabled,
    
-   can handle more than one Pixel, e.g. organizer and agency Pixel,
    
-   passes `eventID` during purchase, which prepares the event for potential future deduplication with Conversions API.
    

If a participant obtains a **free ticket through the cart**, they go through the standard purchase process and complete it with an event: `Purchase` with value: `0`

`CompleteRegistration` applies to free participation in an event taking place **without a cart**.

## Path B — Meta Pixel through Your Google Tag Manager

> **Info:** In this path, you, your GTM specialist, or agency perform the configuration in **your own Google Tag Manager container**.

Landing Page Meeting Application provides a ready-made `dataLayer` with e-commerce events and consent signals.

Your task is to map these events to the appropriate Meta Pixel events.

### What do you provide to Meeting Application?

Provide us with:

-   **GTM container ID** in the format `GTM-XXXXXXX`,
    
-   **Cookiebot identifier**.
    

Also make sure that the Landing Page event domain has been added in your Cookiebot panel.

### Pixel ID

-   In this path, you **do not share your Pixel ID with us**. You use it exclusively in your own Meta Pixel tags configured in GTM.
    

> **Warning:** Before you start configuration
>
> Make sure that the **built-in Meta Pixel from Path A is disabled** for your event. If you are unsure — contact us before publishing the tags in GTM.

Events use GA4 naming and structure with an object:

```javascript
ecommerce
```

Before each e-commerce event, the following is also sent:

```javascript
{ ecommerce: null }
```

This way, previous e-commerce data is cleared before the next event.

<table data-id="28599e20-6558-4a91-94b3-86d7410994c0" style="min-width: 50px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1"><p data-id="c79b6730-35e0-422c-a973-041c44e5db80"><strong>Event</strong></p></td><td colspan="1" rowspan="1"><p data-id="d7728930-a749-40d5-a9fd-63b385a61757"><strong>Ecommerce parameters</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="3aecaed1-67eb-4c41-bd33-0b13a56fefa0"><code>view_item</code></p></td><td colspan="1" rowspan="1"><p data-id="16401cfe-4659-4d48-9bdc-b650707a1c76"><code>currency</code>, <code>value</code>, <code>items</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="e63c3144-bfa3-4047-a7e6-38ccc748e355"><code>view_item_list</code></p></td><td colspan="1" rowspan="1"><p data-id="8b907da8-d82b-40ec-b59c-1cb21c46aad0"><code>currency</code>, <code>items</code>, <code>item_list_name</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="9e6c8a0b-853d-43a0-9f1e-7304eff11acc"><code>add_to_cart</code></p></td><td colspan="1" rowspan="1"><p data-id="22c11433-6f5d-45ee-850d-b96edadfeb24"><code>currency</code>, <code>value</code>, <code>items</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="78acfe9e-13fc-4d6a-833e-762095989be9"><code>remove_from_cart</code></p></td><td colspan="1" rowspan="1"><p data-id="047c7f53-fb3f-443d-b43a-4128c65e6050"><code>currency</code>, <code>value</code>, <code>items</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="cc3f342a-6f02-4ebf-871a-cf4ff6970d92"><code>view_cart</code></p></td><td colspan="1" rowspan="1"><p data-id="26cf78a5-e61a-465e-957c-2a650cd59cd4"><code>currency</code>, <code>value</code>, <code>items</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="23454c7a-5ba1-45fe-8136-a9b288f1bcb6"><code>begin_checkout</code></p></td><td colspan="1" rowspan="1"><p data-id="90c83617-f3e1-4689-b86d-02fcc3e203cb"><code>currency</code>, <code>value</code>, <code>tax</code>, <code>items</code>, optionally <code>coupon</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="c89806a9-c296-4017-907f-ae2180c1154b"><code>add_shipping_info</code></p></td><td colspan="1" rowspan="1"><p data-id="4b2e6298-49ad-47d9-9021-104defb03002"><code>currency</code>, <code>value</code>, <code>items</code>, <code>shipping_tier</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="2f548076-da2d-4604-b4ea-4a6cb50525b6"><code>add_payment_info</code></p></td><td colspan="1" rowspan="1"><p data-id="a87cfcaa-4653-4b2a-9fc0-dc5da069ef98"><code>currency</code>, <code>value</code>, <code>items</code>, <code>payment_type</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="16fdeded-018c-4d6a-8697-7939e48db780"><code>purchase</code></p></td><td colspan="1" rowspan="1"><p data-id="5b0243ba-d9b3-49da-84ae-c95baa5b1b5e"><code>transaction_id</code>, <code>value</code>, <code>currency</code>, <code>tax</code>, <code>items</code>, optionally <code>coupon</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="b1ae59fa-5a4c-40b0-8835-f2f7688f422b"><code>checkout_progress</code></p></td><td colspan="1" rowspan="1"><p data-id="ef12679b-6649-4561-8474-add8c058f139"><code>checkout_step</code>, <code>checkout_option</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="877b9649-5983-4e4d-8d59-5d6ed0bbc04f"><code>set_event_id</code></p></td><td colspan="1" rowspan="1"><p data-id="098c8fa3-7e4f-4930-b068-e5cc53697995"><code>event_id</code> — Event ID in Meeting Application</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="9ed34044-4cb4-4a43-90c5-601a82498dfb"><code>default_consent</code> / <code>update_consent</code></p></td><td colspan="1" rowspan="1"><p data-id="bfe9b12b-0e09-4568-94a9-0ed0ef076d95"><code>consent.ad_storage</code>, <code>consent.analytics_storage</code> and other Consent Mode v2 information</p></td></tr></tbody></table>

Each element of the `items` array contains:

-   `item_id`,
    
-   `item_name`,
    
-   `item_category`,
    
-   `price`,
    
-   `quantity`,
    

and optionally:

-   `discount`,
    
-   `coupon`.
    

> **Warning:** IMPORTANT
>
> The net and gross value `ecommerce.value` passed by the Landing Page is a **net** value. Tax is located separately in: `ecommerce.tax.`
>
> For the `Purchase` event, Meta requires a **gross** value. Therefore, during configuration you will create a separate variable that will sum: `value + tax`

## Step 1. Map events

Basic mapping looks as follows:

<table data-id="9d040aab-2bf1-49e9-875b-8f79e25061e9" style="min-width: 75px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1"><p data-id="1ca33830-528b-456d-bb28-04781c0846b6"><strong>dataLayer GA4</strong></p></td><td colspan="1" rowspan="1"><p data-id="0c060f7e-6d43-4a40-b39b-181089b0022a"><strong>Meta Pixel</strong></p></td><td colspan="1" rowspan="1"><p data-id="cd983722-3d28-4d1d-93c7-8287358bcae6"><strong>Notes</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="5cc25d10-a01b-4f89-9d3f-1cde92386bbe"><code>view_item</code></p></td><td colspan="1" rowspan="1"><p data-id="8e1ebb90-c8b9-4dab-b4eb-3174be845d3d"><code>ViewContent</code></p></td><td colspan="1" rowspan="1"><p data-id="d7c0b6c7-e400-4988-809f-e2d1155413fd">Landing Page does not have a separate product page.<code>view_item</code> is sent just before <code>add_to_cart</code>, therefore the numbers of both events may be very similar.</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="215c29e2-ea77-485f-a1df-4c8a447875ca"><code>add_to_cart</code></p></td><td colspan="1" rowspan="1"><p data-id="6c44c76f-e2ec-4473-afa2-18c202738ff7"><code>AddToCart</code></p></td><td colspan="1" rowspan="1"><p data-id="26887232-37fb-4bc1-b8ad-862b5fb9e9f5"><code>value</code> means the value of the added item, not the entire cart.</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="bcf6a545-15ab-46ae-af96-85106065ef11"><code>begin_checkout</code></p></td><td colspan="1" rowspan="1"><p data-id="643fbcb2-1948-4705-ada6-d5bd8468f677"><code>InitiateCheckout</code></p></td><td colspan="1" rowspan="1"><p data-id="f7adeb0c-ee70-442d-bfef-bf88897f6f06">—</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="1814066c-d712-42ea-9571-85b6f1bf7583"><code>add_payment_info</code></p></td><td colspan="1" rowspan="1"><p data-id="db1323ac-100c-4da7-9236-71be708d4372"><code>AddPaymentInfo</code></p></td><td colspan="1" rowspan="1"><p data-id="dc3d0f01-2c48-43fb-acde-6dcb746bda43">—</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="fcce4929-2f27-4949-a4b7-0ac78a05aad3"><code>purchase</code></p></td><td colspan="1" rowspan="1"><p data-id="9e6da3f9-ebc6-4b0c-a335-ab05772af8aa"><code>Purchase</code></p></td><td colspan="1" rowspan="1"><p data-id="780b2723-5d09-4813-a2f9-5c4736a24b1e">Use gross value, currency, <code>contents</code>, <code>content_type: 'product'</code> and <code>eventID = transaction_id</code>.</p></td></tr></tbody></table>

## Step 2. Create variables in GTM

In Google Tag Manager, go to:

**Variables → User-Defined Variables → New → Data Layer Variable**

Create the following variables:

-   `DLV - ecommerce.value`
    
-   `DLV - ecommerce.tax`
    
-   `DLV - ecommerce.currency`
    
-   `DLV - ecommerce.transaction_id`
    
-   `DLV - ecommerce.items`
    
-   `DLV - consent.ad_storage`
    

For each one, select: **Data Layer Version → Version 2**

![](https://files.gleap.io/pf/gattachments/wFEWDC7eHj0biiCoqdiugabd1YIvsdso2ApynsRML7zTBudFrlFwxf3g1urdUBuH6Ft6kBoXHe1.png?v=1&k=a&s=api&e=1794528000&sig=8pzXP4fFTu2nFDA6D5OJpu5f60eGIC6Tr2qtoekfIYg)

![](https://files.gleap.io/pf/gattachments/d7L1bv1doGVuCmwJE8iFcwQRlO6F7n4oJQof96a30cvxvuaUaTakuvpnib7zjikH0X0WbHiCOgB.png?v=1&k=a&s=api&e=1794528000&sig=IVQ5BoTTqRTB9guYaaLgK3kMKtgVh41aG0RuJpGNjkY)

Then create two variables of type: **Custom JavaScript Code — Custom JavaScript**

### CJS - Meta value gross

```javascript
function () {
  var net = Number({{DLV - ecommerce.value}}) || 0;
  var tax = Number({{DLV - ecommerce.tax}}) || 0;
  return Math.round((net + tax) * 100) / 100;
}

```

This variable calculates the gross value: `net value + tax`

### CJS - Meta contents

```javascript
function () {
  var items = {{DLV - ecommerce.items}} || [];
  return items.map(function (item) {
    return {
      id: String(item.item_id),
      quantity: item.quantity || 1,
      item_price: item.price
    };
  });
}

```

This variable maps the `items` array from the Landing Page to the `contents` format required by Meta.

![](https://files.gleap.io/pf/gattachments/ux37erYXEghoKlApapIXjchFxEw6sinGFbssHZ6hZKEDmq4nG7arhr37vkDLfdUZisEakbAySWr.png?v=1&k=a&s=api&e=1794528000&sig=3IanKa92JsT_P6X39lM2bzkqYNeYaYru6kMySRTHrXc)

## Step 3. Create triggers

Create triggers of type: **Custom Event**

The event name must be exactly the same as the name sent by the Landing Page to `dataLayer`.

Create:

-   `CE - view_item`
    
-   `CE - add_to_cart`
    
-   `CE - begin_checkout`
    
-   `CE - add_payment_info`
    
-   `CE - purchase`
    

Additionally, create:

-   `CE - update_consent (marketing granted)`
    

Set:

-   event name: `update_consent`,
    
-   trigger: **Some custom events**,
    
-   condition: `DLV - consent.ad_storage` **equals** `granted`
    

## Trigger PageView for Landing Page

Landing Page Meeting Application works as an SPA application — the URL can change without a full page reload.

Therefore, for subsequent `PageView` create a trigger of type: **History Change — History Change** **(**(History Change; `HC - all history changes`, without conditions)**,** without additional conditions.

![](https://files.gleap.io/pf/gattachments/IpihQg3MmbQdiBSrGW4BzweqQMx5XYgT33E9I5xza54hhiuQWo90duPmGsNZP8c5JMh4iNFJEwb.png?v=1&k=a&s=api&e=1794528000&sig=WVbvhRf9dtuFaAfo4qjXTXoo-TDW-Gkb-OspaNNpsjc)

## Step 4. Add base Meta Pixel tag

Create a tag of type: **Custom HTML**

Set as trigger: `CE - update_consent (marketing granted)`

Then go to: **Advanced settings → Tag firing options** and select: **Once per page**

Paste the code below:

```html
<script>
!function(f,b,e,v,n,t,s){if(f.fbq)return;n=f.fbq=function(){n.callMethod?
n.callMethod.apply(n,arguments):n.queue.push(arguments)};
if(!f._fbq)f._fbq=n;n.push=n;n.loaded=!0;n.version='2.0';
n.queue=[];t=b.createElement(e);t.async=!0;
t.src=v;s=b.getElementsByTagName(e)[0];
s.parentNode.insertBefore(t,s)}(window, document,'script',
'https://connect.facebook.net/en_US/fbevents.js');

fbq.disablePushState = true;
fbq('set', 'autoConfig', false, 'TWOJ_PIXEL_ID');
fbq('init', 'TWOJ_PIXEL_ID');
fbq('trackSingle', 'TWOJ_PIXEL_ID', 'PageView');

window.__maLastPvPath = location.pathname;
</script>

```

![](https://files.gleap.io/pf/gattachments/KqNEx6xmTdVZ6cI82o52xiOQeyjTPPdgVq7DtrqdHxSPMgFafc9iSOtpZeZKOlxPFSm4cAXKvLZ.png?v=1&k=a&s=api&e=1794528000&sig=qSTwqHo9w-ZND1E7_q4HoIDLwTuZnNXgaUm6Z01gX8k)

Replace: `TWOJ_PIXEL_ID` with your correct Pixel ID.

`autoConfig=false` disables automatic Meta events.

`disablePushState = true` disables automatic `PageView` sent by `fbevents.js` during URL changes in your SPA application.

You will configure PageView during navigation yourself in the next step.

> ### What happens before marketing consent?
> 
> The base tag only launches after receiving the signal: `consent.ad_storage = granted`
> 
> Events occurring earlier — including the first `PageView` before accepting Cookiebot — will not be sent to Meta.

## Step 5. Add event tags

Create each of the following tags as: **Custom HTML**

In the code, replace: `TWOJ_PIXEL_ID` with your correct Pixel ID.

### PageView

Trigger: `HC - all history changes`

```html
<script>
if (window.fbq && window.__maLastPvPath !== location.pathname) {
  window.__maLastPvPath = location.pathname;
  fbq('trackSingle', 'TWOJ_PIXEL_ID', 'PageView');
}
</script>

```

The condition comparing `location.pathname` protects against sending two `PageView` events if the Landing Page changes history in more than one step.

### ViewContent

Trigger: `CE - view_item`

```html
<script>
if (window.fbq) {
  fbq('trackSingle', 'TWOJ_PIXEL_ID', 'ViewContent', {
    contents: {{CJS - Meta contents}},
    content_type: 'product',
    value: {{DLV - ecommerce.value}},
    currency: '{{DLV - ecommerce.currency}}'
  });
}
</script>

```

### AddToCart

Trigger:

`CE - add_to_cart`

```html
<script>
if (window.fbq) {
  fbq('trackSingle', 'TWOJ_PIXEL_ID', 'AddToCart', {
    contents: {{CJS - Meta contents}},
    content_type: 'product',
    value: {{DLV - ecommerce.value}},
    currency: '{{DLV - ecommerce.currency}}'
  });
}
</script>

```

### InitiateCheckout

Trigger: `CE - begin_checkout`

```html
<script>
if (window.fbq) {
  fbq('trackSingle', 'TWOJ_PIXEL_ID', 'InitiateCheckout', {
    contents: {{CJS - Meta contents}},
    content_type: 'product',
    value: {{DLV - ecommerce.value}},
    currency: '{{DLV - ecommerce.currency}}',
    num_items: {{CJS - Meta contents}}.length
  });
}
</script>

```

### AddPaymentInfo

Trigger: `CE - add_payment_info`

```html
<script>
if (window.fbq) {
  fbq('trackSingle', 'TWOJ_PIXEL_ID', 'AddPaymentInfo', {
    contents: {{CJS - Meta contents}},
    content_type: 'product',
    value: {{DLV - ecommerce.value}},
    currency: '{{DLV - ecommerce.currency}}'
  });
}
</script>

```

### Purchase

Trigger: `CE - purchase`

```html
<script>
if (window.fbq) {
  fbq('trackSingle', 'TWOJ_PIXEL_ID', 'Purchase', {
    value: {{CJS - Meta value brutto}},
    currency: '{{DLV - ecommerce.currency}}',
    contents: {{CJS - Meta contents}},
    content_type: 'product',
    num_items: {{CJS - Meta contents}}.length
  }, {
    eventID: String({{DLV - ecommerce.transaction_id}})
  });
}
</script>

```

In this event:

-   `value` is the gross value,
    
-   `currency` specifies the currency,
    
-   `contents` contains items from the cart,
    
-   `eventID` uses `transaction_id`.
    

The same `eventID` can be used for deduplication if you implement server-side Conversions API in the future.

![](https://files.gleap.io/pf/gattachments/BMZncbby3WJmz1MFwZZkAdugZMusT9Tn43uCdBJ4DE5ZYhOBSB9s08z9GVJN8wDDyLCMV7iPuUs.png?v=1&k=a&s=api&e=1794528000&sig=tSNwCAGWmZ2kuRI4NO3xB4sRaZ0qrT8kDcwntD7Ld5k)

> ### ⚠ Do not use tag sequencing
> 
> Do not set the base Meta Pixel tag as the trigger for subsequent event tags.
> 
> The base tag works with the **"Once per page"** setting. On the next GTM trigger attempt, it may block its re-execution, and as a result, also block the event tag.
> 
> In the codes above, a condition is used instead: `if (window.fbq)`
> 
> If the user has not given consent and the base Pixel has not been triggered, subsequent events will not be sent.

> ### ⚠ Use `trackSingle`, not `track`
> 
> For `PageView` on Landing Page SPA use:
> 
> `fbq('trackSingle', ...)`
> 
> Regular `fbq('track', 'PageView')` can be deduplicated by `fbevents.js`, which means subsequent PageView calls triggered by History Change will not be sent correctly.
> 
> `trackSingle` additionally specifies a specific Pixel ID.

## Alternative — Facebook Pixel template from Community Template Gallery

Instead of Custom HTML tags, you can use the template: **Facebook Pixel** from **Community Template Gallery**, publisher: `facebookincubator`

The template supports:

-   base code,
    
-   standard events,
    
-   Object Properties,
    
-   Event ID.
    

Parameter mapping remains the same as in the configuration described earlier.

> ### Remember
> 
> The template does not set `disablePushState`.
> 
> If you choose this variant, during testing verify in particular whether duplicate `PageView` events do not appear during navigation on the Landing Page.

## Custom events — optional

The basic configuration includes events that have direct equivalents among [Meta standard events](https://developers.facebook.com/docs/meta-pixel/reference#standard-events).

You can use other events from `dataLayer` as **custom events**.

<table data-id="be98596a-2438-422c-9346-77f480111537" style="min-width: 75px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1"><p data-id="4f52f474-c8ef-4cf9-87fc-480c0fa85ef3"><strong>dataLayer Event</strong></p></td><td colspan="1" rowspan="1"><p data-id="5157a3aa-046a-4f0f-a16c-ac8ad5b91edc"><strong>Standard Meta Event</strong></p></td><td colspan="1" rowspan="1"><p data-id="38358f41-59f6-4267-9d8f-8836fe291938"><strong>Possible Mapping</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="17430705-8054-481a-85e9-ff4da6eeb6cc"><code>remove_from_cart</code></p></td><td colspan="1" rowspan="1"><p data-id="c612eaac-27a7-460c-9bfa-61e7a87e308a">none</p></td><td colspan="1" rowspan="1"><p data-id="0cf468d6-e50e-402a-bdbe-bc66747a2549"><code>RemoveFromCart</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="70d9071c-3f6b-40fc-ac29-30316ba4d8f1"><code>view_cart</code></p></td><td colspan="1" rowspan="1"><p data-id="aaecd0bf-b964-444a-a2a5-a96e8e9ad255">none</p></td><td colspan="1" rowspan="1"><p data-id="debefbf9-db25-40ae-8925-12fd28786915"><code>ViewCart</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="c969048d-27b1-44db-b9e3-21ad14d0db79"><code>view_item_list</code></p></td><td colspan="1" rowspan="1"><p data-id="c349ee51-2d38-4731-ae4d-c021da96baa8">none</p></td><td colspan="1" rowspan="1"><p data-id="ee58e707-9af3-4ac4-aedb-027960d2819a"><code>ViewItemList</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="f6b7e405-f72f-4013-8b4d-d8377d505aa6"><code>add_shipping_info</code></p></td><td colspan="1" rowspan="1"><p data-id="3b6e786f-a910-48ed-afdc-ca45db110d1b">none</p></td><td colspan="1" rowspan="1"><p data-id="d913bb50-fdca-43ff-85ac-bcb9e3131bf8">skip - in Meeting App this is a technical step "Email", not an actual shipment</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="950e81ca-5e39-4ff2-a5d8-65f4a47b3b5c"><code>checkout_progress</code></p></td><td colspan="1" rowspan="1"><p data-id="656e2520-b1dd-48f4-88d6-0128b61490f2">none</p></td><td colspan="1" rowspan="1"><p data-id="32eea739-e73f-48ec-83e0-76f5d8a9a7a7"><code>CheckoutProgress</code></p></td></tr></tbody></table>

### What custom events are for — and what they're not for

You can send custom events via: `fbq('trackSingleCustom', ...).`

-   **They do not power** standard campaign optimization the way `Purchase` or `AddToCart` do — Meta doesn't know what they mean.
    
-   **They are used to build custom audiences** — for example, retargeting people who reached step 2 of checkout (`CheckoutProgress` with `checkout_step ≥ 2`), but don't have `Purchase`. This is their main value.
    
-   You can define **custom conversions** based on them in Events Manager and then optimize your campaign on such a conversion.
    
-   Format limitations: name up to 50 characters, parameter keys without spaces.
    

> **Success:** **Recommendation:** to start, skip this section. Add custom events only when a specific retargeting scenario that needs them comes up — each tag is additional traffic and noise in Events Manager.

## Example: RemoveFromCart

Trigger: `CE - remove_from_cart`

```html
<script>
if (window.fbq) {
  fbq('trackSingleCustom', 'TWOJ_PIXEL_ID', 'RemoveFromCart', {
    contents: {{CJS - Meta contents}},
    content_type: 'product',
    value: {{DLV - ecommerce.value}},
    currency: '{{DLV - ecommerce.currency}}'
  });
}
</script>

```

## Example: CheckoutProgress

First, create an additional Data Layer Variable: `DLV - checkout_step`

Key: `checkout_step`

Then use:

```html
<script>
if (window.fbq) {
  fbq('trackSingleCustom', 'TWOJ_PIXEL_ID', 'CheckoutProgress', {
    checkout_step: {{DLV - checkout_step}}
  });
}
</script>

```

Just like in basic events, use: `if (window.fbq)` instead of tag sequencing.

### What about free tickets?

If a participant obtains a free ticket through the basket on the Landing Page Meeting Application, they still go through the standard flow:

**basket → checkout → finalization**

Therefore, registration ends with the event: `Purchase` with: `value: 0`

You do not need to create an additional registration event for such a process.

## Step 6. Check your configuration

![](https://files.gleap.io/pf/gattachments/XVm6KgHrLSWZoqeNAhn9hDIRbLA2XzkJQ61jXAwruCND88bVcoClYH1LpOoYvY6zY85zUkODpmt.png?v=1&k=a&s=api&e=1794528000&sig=CgmZbXG2ICJXW8IHF7Q7wAlseWVl2nhfE4RPrMYbt1g)

Before launching your campaign, perform a full test.

If you are using Path B, open simultaneously:

-   **GTM Preview**,
    
-   **Meta Events Manager → Test Events**.
    

Then go through the user process on the Landing Page.

<table data-id="f900a44a-60d1-42eb-88bb-4309add0984e" style="min-width: 50px;"><colgroup><col style="min-width: 25px;"><col style="min-width: 25px;"></colgroup><tbody><tr><td colspan="1" rowspan="1"><p data-id="a2529bdd-efd3-4a4a-b4aa-346777eee265"><strong>What are you doing?</strong></p></td><td colspan="1" rowspan="1"><p data-id="2bf9cd0f-f6df-42f2-be8e-be9a4924d6c3"><strong>What should happen?</strong></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="60da2b70-5a68-4990-b7d8-96ce846a7d51">You open the Landing Page before accepting Cookiebot</p></td><td colspan="1" rowspan="1"><p data-id="564c1ea9-076b-4eca-8246-1c1bd1db4513">No requests to Meta to <code>facebook.com/tr</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="db767b32-272e-481d-a114-04efef15f83a">You accept marketing consent</p></td><td colspan="1" rowspan="1"><p data-id="017ac4a0-e581-477f-a28d-896b3d95d139">A <code>PageView</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="b6f90fe3-8f33-429c-a50f-6f9a6af7329c">You navigate between subpages</p></td><td colspan="1" rowspan="1"><p data-id="7fe07247-82ee-403f-94ed-cec74017c21a">Exactly one <code>PageView</code> per navigation</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="8d13b7e2-71ad-4045-a30c-f1de21270ce8">You add a ticket to your cart</p></td><td colspan="1" rowspan="1"><p data-id="301ef454-df27-4d19-88f3-b9729964e3ef"><code>ViewContent</code> + <code>AddToCart</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="51942316-fcd1-4c8c-87cc-d953664592b4">You start checkout</p></td><td colspan="1" rowspan="1"><p data-id="bb2df6e0-a62f-4877-8fb8-64b9fe69a8d2"><code>InitiateCheckout</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="394fe76d-0b4a-451c-a196-cdb329c9c0fc">You select a payment method</p></td><td colspan="1" rowspan="1"><p data-id="19a6c8e8-45b1-473d-b33d-b0c7b31bc5e0"><code>AddPaymentInfo</code></p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="dfc12b07-f3a4-4a59-8618-bf05f7f61826">You finalize your purchase</p></td><td colspan="1" rowspan="1"><p data-id="169faa53-af43-4fdd-9ce4-b1b620c47e85"><code>Purchase</code> with gross value and Event ID</p></td></tr><tr><td colspan="1" rowspan="1"><p data-id="63ac7d8b-c026-44bf-86ca-65682a8d72e2">You reject marketing consent</p></td><td colspan="1" rowspan="1"><p data-id="46734b29-fa45-45c9-88d4-feec2ba9d984">No traffic to <code>facebook.com/tr</code></p></td></tr></tbody></table>

For purchase events, also check the following parameters:

-   `value`,
    
-   `currency`,
    
-   `contents`.
    

For `Purchase` additionally check:

-   gross value,
    
-   `Event ID`.
    

## Most common pitfalls

### Events are counted twice

First, check whether both of the following are active simultaneously for your Landing Page:

-   built-in Meta Pixel from Path A,
    
-   Meta Pixel tags in your GTM.
    

One event should use **one Meta event source**.

### Purchase has net value

Do not use directly: `ecommerce.value` as the value of `Purchase`.

`ecommerce.value` is the net value.

For `Purchase` use: `CJS - Meta gross value` which is: `ecommerce.value + ecommerce.tax`

### PageView is counted twice

Check if the base code contains: `fbq.disablePushState = true`

Without this `fbevents.js` may independently send PageView when the URL changes, in parallel with your tag triggered by History Change.

### `contents` does not contain `quantity`

Meta requires `id` and `quantity` for each item.

Variable: `CJS - Meta contents` ensures their correct mapping.

### Currency has incorrect format

`currency` should contain the currency code, e.g.: `PLN` not the symbol: `zł`

Landing Page passes the currency code in the correct format.

## Before launching the campaign

Make sure that:

-   you are using only one Meta Pixel path,
    
-   Cookiebot is properly configured,
    
-   the Landing Page domain has been added in Cookiebot,
    
-   the correct GTM container is connected to the event,
    
-   automatic Meta events are disabled,
    
-   you have completed a full user path test,
    
-   `Purchase` passes the correct value, currency, and Event ID.
    

If you are unsure which Meta Pixel configuration is active for your event, **contact us before publishing tags or launching a campaign**.

**Successful event with Meeting Application!**
