> For clean Markdown of any page, append .md to the page URL.
> For a complete documentation index, see https://docs.pivolio.com/llms.txt.
> For AI client integration (Claude Code, Cursor, etc.), connect to the MCP server at https://docs.pivolio.com/_mcp/server.

# Meta

Pivolio delivers to the Meta Conversions API at
`POST https://graph.facebook.com/v21.0/{pixel_id}/events`, using hashed
customer data plus the browser identifiers Meta needs to match a conversion
back to an ad.

## Get your credentials

These steps are directional — Meta reorganizes Business settings regularly, so
match the concepts rather than hunting for exact labels.

#### Find your pixel ID

In Meta's **Events Manager**, select the pixel (dataset) you want
conversions attached to. Its numeric ID is shown alongside the name. Use the
same pixel your browser tag already uses — sending server events to a
different pixel splits your reporting in half.

#### Create a system user

In **Business settings**, under the users section, create a **system user**
for Pivolio. A system user belongs to the business rather than to a person,
so its token keeps working after the employee who made it leaves.

#### Assign the pixel to it

Grant the system user access to that pixel as an asset. A token from a
system user with no access to the pixel authenticates fine and then fails on
every event.

#### Generate a token

Generate an access token for the system user, scoped to the app you use for
ads, and include the `ads_management` permission. Copy it immediately —
Meta shows it once.

#### Connect in Pivolio

Open **Destinations → Meta**, paste the pixel ID and token, and let Pivolio
verify before enabling.

## Credential fields

#### pixel_id

The numeric Meta pixel (dataset) ID that conversions are posted to. Required.
It forms part of the request URL, so a wrong value produces a 4xx rather
than a quiet no-op.

#### access_token

The system-user access token, with `ads_management`. Required. Stored
encrypted and never returned — to rotate it, paste the new token over the
old one.

#### test_event_code

Optional, and **used only during verification — it is never stored**. Supply
it if you want the verification event to show up in the **Test events** tab
in Events Manager.

> **Note**
>
> The reason `test_event_code` is deliberately not persisted: Meta routes any
> event carrying a test code into the Test Events view instead of counting it as
> a real conversion. A code saved once would silently divert your entire
> production conversion stream — the kind of failure that looks like "Meta
> stopped attributing" for weeks.

## Event mapping

Meta ships these defaults. Anything not listed is skipped unless you add a
[custom mapping](/documentation/destinations/event-mappings).

| Pivolio event                      | Meta event           |
| ---------------------------------- | -------------------- |
| `page_view`                        | PageView             |
| `view_content`                     | ViewContent          |
| `add_to_cart`                      | AddToCart            |
| `add_to_wishlist`                  | AddToWishlist        |
| `initiate_checkout`                | InitiateCheckout     |
| `add_payment_info`                 | AddPaymentInfo       |
| `order_completed`, `purchase`      | Purchase             |
| `lead_submitted`, `lead`           | Lead                 |
| `complete_registration`, `sign_up` | CompleteRegistration |
| `search`                           | Search               |
| `contact`                          | Contact              |
| `find_location`                    | FindLocation         |
| `schedule`                         | Schedule             |
| `start_trial`                      | StartTrial           |
| `subscribe`                        | Subscribe            |
| `submit_application`               | SubmitApplication    |
| `donate`                           | Donate               |

## Identifiers Pivolio sends

Email, phone, name, city, state, zip and country are normalized and SHA-256
hashed server-side before they leave. Send raw values — hashing them yourself
produces different digests than Meta expects and quietly collapses your match
rate.

Two Meta-specific details are worth knowing:

* **`_fbc` is derived from `fbclid`.** If the browser cookie `_fbc` is absent
  but the landing page carried an `fbclid`, Pivolio constructs the click cookie
  as `fb.1.{event_time_ms}.{fbclid}`. This recovers matches on visitors whose
  browser blocked the Meta pixel from writing its own cookie.
* **`external_id` is hashed byte-for-byte**, with no lowercasing or trimming —
  that is what Meta's spec requires, and it differs from every other field.

## Related

* [Event mappings](/documentation/destinations/event-mappings)
* [Consent rules](/documentation/destinations/consent-rules)
* [Troubleshooting](/documentation/destinations/troubleshooting-delivery)