Enhanced Conversions enable you to send first-party customer data (like email and phone) to Facebook, improving match rates and attribution accuracy. This is especially critical for OpenCart stores where conversions may happen post-login or via redirects.
๐งฐ Prerequisites
- OpenCart (v3.x/4.x)
- Facebook Pixel and CAPI access
- GTM Web + Server Containers
- Consent mechanism (GDPR/CCPA compliant)
- SHA-256 hashing support
๐งฑ Step 1: Add Facebook Pixel with Enhanced Conversion Signals
- GTM Web > New Tag > Custom HTML
- Trigger: All Pages
<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('init', 'YOUR_PIXEL_ID', {
em: '{{user_email}}',
ph: '{{user_phone}}'
});
fbq('track', 'PageView');
</script>
๐ฅ Step 2: Collect Email & Phone in Data Layer
Edit catalog/view/theme/YOUR_THEME/template/checkout/success.twig
:
<script>
dataLayer = dataLayer || [];
dataLayer.push({
event: 'purchase',
event_id: 'fb_{{ order_id }}',
transaction_id: '{{ order_id }}',
value: {{ order_total }},
currency: '{{ currency }}',
user_email: '{{ email | lower | sha256 }}',
user_phone: '{{ phone | regex_replace('/\D/', '') | sha256 }}'
});
</script>
๐ Step 3: Trigger Server Event from Web GTM
GTM Web > New Custom HTML tag
- Trigger:
purchase
<script>
fetch('https://gtm.yourdomain.com/event', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
event_name: 'Purchase',
event_id: '{{DL - event_id}}',
transaction_id: '{{DL - transaction_id}}',
value: '{{DL - value}}',
currency: '{{DL - currency}}',
email: '{{DL - user_email}}',
phone: '{{DL - user_phone}}'
})
});
</script>
๐ก Step 4: Send Enhanced Conversions via CAPI
In GTM Server:
- Trigger:
event_name
=Purchase
- Tag: HTTP Request
POST https://graph.facebook.com/v18.0/YOUR_PIXEL_ID/events?access_token=ACCESS_TOKEN
{
"data": [{
"event_name": "Purchase",
"event_time": {{timestamp}},
"event_id": "{{event_id}}",
"action_source": "website",
"user_data": {
"em": "{{email}}",
"ph": "{{phone}}"
},
"custom_data": {
"currency": "{{currency}}",
"value": {{value}},
"transaction_id": "{{transaction_id}}"
}
}]
}
๐ Step 5: Deduplication
- Keep
event_id
consistent between browser and server events. - Facebook deduplicates events using this ID.
๐ Step 6: Consent Logic
Use a consent_granted
variable to delay dataLayer push and tag triggers. Ensure only compliant users are tracked.
๐งช Step 7: QA & Debugging
Tool | Purpose |
---|---|
GTM Preview Mode | Inspect variables and tag firing |
Facebook Events Manager | Check Enhanced Conversions match quality |
Chrome Dev Tools | Validate network request payloads |
๐ฏ Strategic Notes
- Improved match rates = better ROAS
- Helps fill attribution gaps from iOS/blocked environments
- Consent-friendly and future-ready