Overview
Your customers buy everywhere: your own store, Amazon, big-box retail, local shops. Meta only sees the conversions that happen on your site through its pixel. Every purchase made through an unowned channel is invisible to Meta, so its algorithm optimizes and attributes against a fraction of the revenue your ads actually drive.
Brij closes that loop. A QR code on the package turns an unowned-channel purchase into a registered, first-party customer, and Brij forwards that purchase to Meta’s Conversions API (CAPI) in the exact shape Meta expects. The result is deterministic, brand-owned conversion signal: off-site purchases become matched, attributable events, and Meta optimizes against your whole business instead of just dot-com.
How it works at a glance
- Scan — after unboxing, the customer scans the QR code printed on the product or packaging.
- Register — they submit a short registration on a Brij-hosted flow (email, purchase details), unlocking warranty and perks.
- Attribute — Brij ingests the registration, transforms it into a Meta purchase event, and POSTs it to the Conversions API.
Worked example
Consider a headphone brand that sells through its own site, Amazon, and a national retail chain. A shopper buys a pair in-store at a retailer — no pixel, no on-site checkout, so the sale is invisible to the brand’s Meta account. At home, the shopper unboxes the product, scans the QR code to register for warranty, and submits their details. Brij matches the registration to the purchase and sends a Purchase event to Meta. A conversion Meta could never have seen becomes a matched, attributable event tied to the campaign that earned it.
What Brij collects
The registration flow is deliberately short — enough to satisfy Meta’s matching requirements without inflating drop-off. Every field maps to a Meta parameter.
| Field | How it’s captured | Purpose |
|---|---|---|
| Entered | Primary match key against Meta’s user graph. | |
| Country / region | Derived automatically | Strengthens the match and powers regional reporting. |
| First & last name | Entered | Additional match keys; raise match quality. |
| Phone | Entered | High-value match key. |
| Purchase date | Entered | Sets the event timestamp. |
| Place of purchase | Entered | Identifies the channel and sets the event’s action source. |
In parallel, with no input from the customer, Brij captures Meta’s click identifiers (fbc/fbp) from the registration session — see Click IDs and event source below.
The pipeline
The moment the customer submits, Brij ingests the registration as a first-party event, which triggers an outbound, server-to-server workflow:
- Ingest — the registration is written as a structured event on Brij’s servers.
- Transform — Brij validates and normalizes each field, hashes the identifiers, and reshapes the record into Meta’s payload schema.
- Send — Brij POSTs the event to the Conversions API endpoint for the brand’s dataset.
All normalization, SHA-256 hashing, and payload shaping happen server-side at Brij before the request leaves. Because the call is server-to-server rather than browser-based, it is unaffected by ad blockers, cookie loss, or on-device tracking limits.
The payload
Brij sends events to POST https://graph.facebook.com/v{version}/{dataset_id}/events. Each request carries one or more events across three groups of parameters.
Event parameters
| Parameter | Value |
|---|---|
event_name | Purchase, or a custom brijPurchase when the brand wants to isolate unowned-channel conversions from on-site Purchase for separate optimization or reporting. |
event_time | Unix timestamp of the purchase. |
event_id | Stable Brij identifier for the conversion; Meta uses it to deduplicate. |
action_source | website or physical_store — where the underlying conversion happened. |
event_source_url | The registration URL (for website events). |
User data — matching
Sent SHA-256 hashed unless noted.
| Parameter | Value |
|---|---|
em | Email. |
ph | Phone, normalized to E.164. |
fn / ln | First / last name. |
ct / st / zp / country | City / state / postal / country. |
external_id | The Brij customer ID — the brand’s owned, stable identifier for the person. |
fbc | Click ID. Sent raw (not hashed). |
fbp | Browser pixel cookie. Sent raw. |
client_ip_address / client_user_agent | Sent raw; further strengthen matching. |
Custom data
| Parameter | Value |
|---|---|
currency | ISO code (USD, EUR, …). |
value | Purchase value, for value-based optimization and ROAS. |
order_id | Order/registration reference. |
content_ids / contents | SKU-level product detail. |
Example request body
{
"data": [
{
"event_name": "Purchase",
"event_time": 1751808600,
"event_id": "brij_reg_9f2a1c7e4b",
"action_source": "physical_store",
"user_data": {
"em": ["e7c2f1a0d4b98c5e2f6a1b3c7d9e0f4a5b6c7d8e9f0a1b2c3d4e5f6a7b8c9d0e"],
"ph": ["3b9f7c204a1d55e0c8f2a6b4d1e9c073a5f8b2d6c4e0a1f3b7d9c2e5a0f6b8c1"],
"fn": ["a1d477ab0c2e9f13b6d8025a4c7e1f90b3d5a8c2e6f0b4d7a9c1e3f5b8d0a2c4"],
"ln": ["9c0241de6b8a3f157e2d049c6a1b8f30d5c7e9a2b4c6f8017a3d9e5b2c40f168"],
"country": ["79ad0f2c1b6e4a90d3f857c2e0b9a146d8c3f5a7e1b02d4c6f9a8b3e5d7c0142"],
"external_id": "brij_5f3c9a27",
"fbc": "fb.1.1751804000.IwAR2xk9QaExample_fbclid_value",
"fbp": "fb.1.1751804000.1093874655",
"client_ip_address": "203.0.113.42",
"client_user_agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 18_5 like Mac OS X) AppleWebKit/605.1.15"
},
"custom_data": {
"currency": "USD",
"value": "129.99",
"order_id": "BRIJ-2026-0000123",
"content_ids": ["SKU-HP-XT900-BLK"],
"contents": [{ "id": "SKU-HP-XT900-BLK", "quantity": 1 }]
}
}
]
}Normalization. Before hashing, Brij lowercases and trims email and names, formats phone numbers to E.164, and uses ISO country codes, so its digests align with Meta’s hashing of the same values. fbc, fbp, IP, and user agent are always sent raw.
Click IDs and event source
fbc and fbp
When a shopper reaches the Brij registration page after clicking a Meta ad, the landing URL carries an fbclid. Brij captures it and builds the fbc parameter in Meta’s format (fb.1.<timestamp>.<fbclid>), and reads the _fbp first-party cookie for fbp. Click identifiers are the highest-confidence way to tie a conversion to a specific ad click, so Brij persists them with the registration and includes them on the outbound event whenever present.
Website vs. offline events
Registration always happens on the web, but the purchase it represents may not. Brij sets action_source from the place of purchase: website for online orders, physical_store for in-store and other offline sales. This lets Meta treat retail conversions as genuine offline events and apply them across both on-site and in-store optimization.
Routing to multiple datasets
Brands often run more than one pixel/dataset — by region, business unit, or sub-brand. Brij addresses each event to the correct dataset and can segment which events go where, so conversion signal lands in the account that owns the campaign rather than in a single catch-all.
Hashing and matching
Meta never receives raw PII. Email, phone, name, and location are hashed with SHA-256 before they leave Brij. Meta hashes its own user graph with the same algorithm and compares digests; when they align, it is the same person — and the purchase is tied to that user and any ad they saw or clicked. Because Brij sends a broad set of identifiers on every event (email, phone, name, location, external_id, plus fbc/fbp when present), Meta has the maximum surface to make a confident match. The brand keeps the underlying first-party record; Meta sees only hashes.
Attribution and deduplication
Once matched, Meta credits the purchase to the campaign that earned it, using the attribution windows configured in Ads Manager (Meta’s defaults are 7-day click and 1-day view). Because every event carries a stable event_id, any overlap with a pixel event of the same name collapses to a single conversion — no double counting.
Outcome
Every Amazon, retail, and local-shop purchase Brij captures becomes a real, attributable conversion inside Meta. Optimization trains on the full set of conversions your ads drive, attribution reflects total sales rather than the dot-com slice, and the customer record stays owned by the brand.
Security and compliance
All identifiers are SHA-256 hashed server-side before transmission. Brij is SOC 2 Type II certified and GDPR- and CCPA-compliant, and the customer data underlying every event remains brand-owned.