{"id":10092,"date":"2026-11-08T07:38:00","date_gmt":"2026-11-08T06:38:00","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/?p=10092"},"modified":"2026-10-26T13:02:50","modified_gmt":"2026-10-26T12:02:50","slug":"meta-conversions-api-via-server-side-gtm-normalization-deduplication-and-emq-checks","status":"publish","type":"post","link":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/meta-conversions-api-via-server-side-gtm-normalization-deduplication-and-emq-checks\/","title":{"rendered":"Meta Conversions API via Server-Side GTM: Normalization, Deduplication and EMQ Checks"},"content":{"rendered":"<p>Event Match Quality describes how useful customer information sent with server events may be for matching those events to Meta accounts. Correct normalization and genuinely available identifiers can improve quality, but a score above 6.0 is not a guaranteed result of a particular combination of fields. Deduplication means recognizing browser and server messages about the same purchase so that the purchase is not counted twice. This check, complete order measurement and EMQ are separate tasks.<\/p>\n<p>Server-side Google Tag Manager (sGTM) processes incoming measurement requests on a server. A client is the component that reads a request and creates an event object for the tags. This guide describes controlled sGTM processing with the facebookincubator Meta template. Prerequisites include a configured server container, a client matching the incoming protocol and a working consent-state handoff. Transport from the shop to that client remains project-specific; a data-layer push alone does not send an HTTP request.<\/p>\n<figure class=\"lw-diagram\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/diagrams\/dia-10092-review-20261024.png\" width=\"1120\" height=\"580\" alt=\"Consent and validated inputs precede processing; normalization and hashing are separate from event deduplication. EMQ remains a measured value without a guaranteed outcome.\"><figcaption>Consent and validated inputs precede processing; normalization and hashing are separate from event deduplication. EMQ remains a measured value without a guaranteed outcome.<\/figcaption><\/figure>\n<h2>1. Event identity and consent before transmission<\/h2>\n<p>A purchase event follows a confirmed order. A stable event ID belongs to that business action and is reused for the browser Pixel, server event and retries. A fresh random ID on each page load breaks that relationship. An event-type and shop prefix prevents collisions between different sources.<\/p>\n<p>The following JSON illustrates the event object after processing by the sGTM client, not a ready-to-use browser transport configuration. Values and timestamp are examples only. Actual event time must be captured at purchase; a retry must not become a new event with a new ID.<\/p>\n<pre class=\"wp-block-code-beautifier-block-code\"><code>{\n  &quot;event_name&quot;: &quot;purchase&quot;,\n  &quot;event_id&quot;: &quot;purchase:shop-example:ORD-10432&quot;,\n  &quot;event_time&quot;: 1792843200,\n  &quot;action_source&quot;: &quot;website&quot;,\n  &quot;page_location&quot;: &quot;https:\/\/shop.example\/confirmation&quot;,\n  &quot;transaction_id&quot;: &quot;ORD-10432&quot;,\n  &quot;value&quot;: 149,\n  &quot;currency&quot;: &quot;PLN&quot;,\n  &quot;user_data&quot;: {\n    &quot;email_address&quot;: &quot;customer@example.com&quot;,\n    &quot;phone_number&quot;: &quot;+48601234567&quot;\n  }\n}\n<\/code><\/pre>\n<p>In this design, collection for Meta and forwarding require valid advertising consent. Missing or denied consent blocks the Meta path in both the web container and the server. A server container does not automatically implement that decision for every community template. Purpose, withdrawal and actual tag execution must remain consistent.<\/p>\n<p>Raw contact information in the global data layer is accessible to other page scripts. Controlled handoff and separate recipient permissions are therefore required. Email addresses do not belong in arbitrary GA4 event parameters. A Google transport must use its documented user-provided-data fields and policies; the server container\u2019s GA4 client is distinct from an outgoing GA4 tag.<\/p>\n<h2>2. The fields actually received<\/h2>\n<p>Server-side Event Data variables read the object created by the client. Browser Data Layer variables do not provide direct page access there. Google\u2019s common schema includes <code>user_data.email_address<\/code> and <code>user_data.phone_number<\/code>. The Meta template also reads <code>x-fb-ud-em<\/code> and <code>x-fb-ud-ph<\/code> for prepared values.<\/p>\n<p>A test with invented contact details must establish which client claims the request and which fields are present afterwards. An arbitrary HTTP request does not become the desired event without matching client logic. Unknown fields or incorrect types must not silently count as successful delivery.<\/p>\n<h2>3. Normalization without a guessed country code<\/h2>\n<p>Phone input must already have been validated as an international number with known country context, for example by a maintained phone-number library in the shop backend. The template below accepts only canonical plus-and-digits form. National numbers, 00 prefixes, spaces and extensions are deliberately not rewritten. This prevents silently incorrect prefixes on German 0171\u2026 numbers or Polish numbers beginning with the Radom area code 48.<\/p>\n<p>The pattern checks format, not whether a number exists, can receive calls or is valid under a country\u2019s numbering plan. Email checking is also a basic plausibility filter, not complete address validation. Leading and trailing whitespace and letter case are normalized; internal whitespace and selected invisible characters cause omission instead of silent repair.<\/p>\n<p>The custom variable template requires text fields <code>inputEmail<\/code> and <code>inputPhone<\/code>, plus a select field <code>outputField<\/code> with <code>em<\/code> and <code>ph<\/code>. Two variable instances use the same Event Data inputs and select one output each. <code>sha256Sync<\/code> explicitly produces hexadecimal output. The regex API requires a supported server runtime; this example returns no value when that support is unavailable.<\/p>\n<pre class=\"wp-block-code-beautifier-block-code\"><code>\/\/ Custom Variable Template: text fields inputEmail, inputPhone; select field outputField (em\/ph).\n\/\/ Phone input must already be a validated canonical international number.\nconst getType = require(&#x27;getType&#x27;);\nconst createRegex = require(&#x27;createRegex&#x27;);\nconst sha256Sync = require(&#x27;sha256Sync&#x27;);\nconst emailPattern = createRegex(&#x27;^[^@\\\\s]+@[^@\\\\s]+\\\\.[^@\\\\s]+$&#x27;);\nconst hiddenPattern = createRegex(&#x27;[\\u0000-\\u001F\\u007F\\u00AD\\u200B-\\u200D\\u2060\\uFEFF]&#x27;);\nconst phonePattern = createRegex(&#x27;^\\\\+[1-9][0-9]{1,14}$&#x27;);\nif (!emailPattern || !hiddenPattern || !phonePattern) return undefined;\n\nfunction normalizeEmail(raw) {\n  if (getType(raw) !== &#x27;string&#x27;) return undefined;\n  const value = raw.trim().toLowerCase();\n  if (!value.match(emailPattern)) return undefined;\n  if (value.match(hiddenPattern)) return undefined;\n  return value;\n}\n\nfunction normalizePhone(raw) {\n  if (getType(raw) !== &#x27;string&#x27;) return undefined;\n  const value = raw.trim();\n  if (!value.match(phonePattern)) return undefined;\n  return value.substring(1);\n}\n\nconst email = normalizeEmail(data.inputEmail);\nconst phone = normalizePhone(data.inputPhone);\nif (data.outputField === &#x27;em&#x27;) {\n  return email ? sha256Sync(email, {outputEncoding: &#x27;hex&#x27;}) : undefined;\n}\nif (data.outputField === &#x27;ph&#x27;) {\n  return phone ? sha256Sync(phone, {outputEncoding: &#x27;hex&#x27;}) : undefined;\n}\nreturn undefined;\n<\/code><\/pre>\n<p>Normalization puts an input into a consistent form. Hashing then calculates a fixed-length value from that input; the same input produces the same hash. A correctly normalized hash can also be created before the server container. A blanket prohibition on client-side hashing would be incorrect. Already hashed input needs a separately validated path and must not be hashed again; this example processes raw input. A 64-character hexadecimal string alone does not prove correct normalization.<\/p>\n<p><!-- lw-flux-illu 10092-a3 --><\/p>\n<figure class=\"lw-illu\"><img src=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/illustrationen\/flux-10092-a3.webp\" width=\"1120\" height=\"630\" loading=\"lazy\" decoding=\"async\" alt=\"The basket holds only clearly identified chanterelles, while an unknown mushroom is left in the moss. Likewise, phone numbers are only formatted when the country code is known, rather than guessed.\"><figcaption>The basket holds only clearly identified chanterelles, while an unknown mushroom is left in the moss. Likewise, phone numbers are only formatted when the country code is known, rather than guessed.<\/figcaption><\/figure>\n<h2>4. Recipient-specific mapping and purchase deduplication<\/h2>\n<p>An Augment transformation can add the two variables as <code>x-fb-ud-em<\/code> and <code>x-fb-ud-ph<\/code> for the Meta tag alone. The inspected facebookincubator template prioritizes these values. Before publication, the actual installed template version, permissions and outgoing object need verification. Access token and Pixel ID are configured in the server tag; the token does not belong in the browser or an example-page URL.<\/p>\n<p>Transformation order matters: Augment first computes the two hashes from the raw inputs; a following Exclude\/Redact rule removes the entire <code>user_data<\/code> object for the Meta tag. Otherwise the template can fall back to a rejected raw phone number and hash it anyway. Only the prepared <code>x-fb-ud-em<\/code>\/<code>x-fb-ud-ph<\/code> values should remain available for these two fields. Event Enhancement and automatic cookie extension stay disabled in this example, so cached user data does not silently replace omitted inputs. The tag preview must confirm both valid and rejected cases.<\/p>\n<p>The inspected template maps <code>purchase<\/code> to <code>Purchase<\/code> and copies <code>event_id<\/code>. The browser Pixel must receive the same Meta event name and the same identifier as <code>eventID<\/code>. A shared order ID can form part of that identifier if event type and shop remain unambiguous. A successful HTTP response alone confirms neither correct deduplication nor complete order measurement.<\/p>\n<p>Other tags need their own field permissions or Redaction transformations. Hashing inside the Meta tag does not automatically remove raw values from the incoming request, event object or other tags. Preview, proxy and application logs therefore need explicit inspection. Hashing is not encryption or proof of anonymity.<\/p>\n<h2>5. The roles of fbp, fbc and external_id<\/h2>\n<p><code>fbp<\/code> and <code>fbc<\/code> are transmitted unhashed in Meta\u2019s expected format. These identifiers are not therefore anonymous or insignificant. The server can only read cookies actually included in the request; domain and path rules can restrict visibility. The inspected template also accepts explicitly supplied <code>x-fb-ck-fbp<\/code>\/<code>x-fb-ck-fbc<\/code> fields.<\/p>\n<p><code>fbc<\/code> can come from a genuine <code>fbclid<\/code> or an existing cookie. A later organic visit can therefore retain an identifier from an earlier click. Without such a source, a click identifier must not be invented. Consent, blocking and cookie conditions also mean <code>fbp<\/code> is not present on every visit. A stable <code>external_id<\/code> can provide additional matching information, but cannot guarantee recovery of every lost match.<\/p>\n<h2>6. Separate evidence for quality checks<\/h2>\n<p>Acceptance checks include test events with invented contact details in Events Manager, actual parameter coverage, browser\/server-pair deduplication, unchanged IDs on retries and blocked transmission without consent. EMQ and its recommendations are examined for the relevant event. An unavailable score is not a measured zero, and a rising score does not prove additional real purchases.<\/p>\n<div class=\"lw-faq\">\n<h2>Questions and answers<\/h2>\n<h3>What happens to a national phone number?<\/h3>\n<p>The hashing template omits the field. Upstream country-aware validation must first produce a canonical international number. No arbitrary country code is appended.<\/p>\n<h3>Does an email address together with fbp guarantee EMQ above 6?<\/h3>\n<p>No. Availability, quality and actual matching depend on the event population. The implementation provides verifiable inputs, not a fixed score.<\/p>\n<\/div>\n<p>Related article: <a href=\"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-analytics\/meta-conversions-api-maximizing-event-match-quality-emq-and-deduplication\/\">Meta Conversions API: Maximizing Event Match Quality (EMQ) and Deduplication<\/a>.<\/p>\n<div class=\"lw-quellen\">\n<h2>Sources<\/h2>\n<ul>\n<li><a href=\"https:\/\/github.com\/facebookincubator\/ConversionsAPI-Tag-for-GoogleTagManager\" target=\"_blank\" rel=\"noopener noreferrer\">Meta-maintained template repository<\/a><\/li>\n<li><a href=\"https:\/\/raw.githubusercontent.com\/facebookincubator\/ConversionsAPI-Tag-for-GoogleTagManager\/main\/template.tpl\" target=\"_blank\" rel=\"noopener noreferrer\">Meta template: actual field mapping and hashing<\/a><\/li>\n<li><a href=\"https:\/\/developers.google.com\/tag-platform\/tag-manager\/server-side\/common-event-data\" target=\"_blank\" rel=\"noopener noreferrer\">sGTM common event data<\/a><\/li>\n<li><a href=\"https:\/\/developers.google.com\/tag-platform\/tag-manager\/server-side\/api\" target=\"_blank\" rel=\"noopener noreferrer\">sGTM template APIs<\/a><\/li>\n<li><a href=\"https:\/\/developers.google.com\/tag-platform\/tag-manager\/server-side\/transformations\" target=\"_blank\" rel=\"noopener noreferrer\">Recipient-specific transformations<\/a><\/li>\n<li><a href=\"https:\/\/developers.google.com\/tag-platform\/tag-manager\/server-side\/ads-user-data\" target=\"_blank\" rel=\"noopener noreferrer\">Google transport: dedicated user-provided-data fields<\/a><\/li>\n<li><a href=\"https:\/\/developers.google.com\/tag-platform\/tag-manager\/server-side\" target=\"_blank\" rel=\"noopener noreferrer\">Server-side tagging<\/a><\/li>\n<li><a href=\"https:\/\/developers.google.com\/tag-platform\/tag-manager\" target=\"_blank\" rel=\"noopener noreferrer\">Google Tag Manager documentation<\/a><\/li>\n<li><a href=\"https:\/\/developers.facebook.com\/documentation\/ads-commerce\/conversions-api\" target=\"_blank\" rel=\"noopener noreferrer\">Meta Conversions API<\/a><\/li>\n<\/ul>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Meta Conversions API through server-side GTM: validated email and phone inputs are normalized and hashed, while fbp and fbc remain unhashed. Consent, duplicate purchase messages and Event Match Quality require separate checks.<\/p>\n","protected":false},"author":1,"featured_media":23334,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[127],"tags":[91261,91279,91057,91061,91219],"class_list":["post-10092","post","type-post","status-publish","format-standard","hentry","category-tutorials-en-digital-marketing","tag-conversion-tracking","tag-prywatnosc-danych-pl","tag-meta-conversions-api","tag-server-side-gtm","tag-tutorial"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Meta Conversions API via Server-Side GTM: Normalization, Deduplication and EMQ Checks | Lukas Wojcik<\/title>\n<meta name=\"description\" content=\"Wiring the Meta Conversions API through server-side GTM: normalizing and SHA-256 hashing email and phone, and pushing Event Match Quality above 6.0.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/meta-conversions-api-via-server-side-gtm-normalization-deduplication-and-emq-checks\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Meta Conversions API via Server-Side GTM: Normalization, Deduplication and EMQ Checks | Lukas Wojcik\" \/>\n<meta property=\"og:description\" content=\"Wiring the Meta Conversions API through server-side GTM: normalizing and SHA-256 hashing email and phone, and pushing Event Match Quality above 6.0.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/meta-conversions-api-via-server-side-gtm-normalization-deduplication-and-emq-checks\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-11-08T06:38:00+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/hero-10092-review-20261024-dark.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Lukas Wojcik\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Lukas Wojcik\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/tutorials-en-digital-marketing\\\/meta-conversions-api-via-server-side-gtm-normalization-deduplication-and-emq-checks\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/tutorials-en-digital-marketing\\\/meta-conversions-api-via-server-side-gtm-normalization-deduplication-and-emq-checks\\\/\"},\"author\":{\"name\":\"Lukas Wojcik\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"headline\":\"Meta Conversions API via Server-Side GTM: Normalization, Deduplication and EMQ Checks\",\"datePublished\":\"2026-11-08T06:38:00+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/tutorials-en-digital-marketing\\\/meta-conversions-api-via-server-side-gtm-normalization-deduplication-and-emq-checks\\\/\"},\"wordCount\":1278,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/tutorials-en-digital-marketing\\\/meta-conversions-api-via-server-side-gtm-normalization-deduplication-and-emq-checks\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/hero-10092-review-20261024-dark.png\",\"keywords\":[\"Conversion Tracking\",\"Data Privacy\",\"Meta Conversions API\",\"Server-Side GTM\",\"Tutorial\"],\"articleSection\":[\"Tutorials\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/tutorials-en-digital-marketing\\\/meta-conversions-api-via-server-side-gtm-normalization-deduplication-and-emq-checks\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/tutorials-en-digital-marketing\\\/meta-conversions-api-via-server-side-gtm-normalization-deduplication-and-emq-checks\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/tutorials-en-digital-marketing\\\/meta-conversions-api-via-server-side-gtm-normalization-deduplication-and-emq-checks\\\/\",\"name\":\"Meta Conversions API via Server-Side GTM: Normalization, Deduplication and EMQ Checks | Lukas Wojcik\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/tutorials-en-digital-marketing\\\/meta-conversions-api-via-server-side-gtm-normalization-deduplication-and-emq-checks\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/tutorials-en-digital-marketing\\\/meta-conversions-api-via-server-side-gtm-normalization-deduplication-and-emq-checks\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/hero-10092-review-20261024-dark.png\",\"datePublished\":\"2026-11-08T06:38:00+00:00\",\"description\":\"Wiring the Meta Conversions API through server-side GTM: normalizing and SHA-256 hashing email and phone, and pushing Event Match Quality above 6.0.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/tutorials-en-digital-marketing\\\/meta-conversions-api-via-server-side-gtm-normalization-deduplication-and-emq-checks\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/tutorials-en-digital-marketing\\\/meta-conversions-api-via-server-side-gtm-normalization-deduplication-and-emq-checks\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/tutorials-en-digital-marketing\\\/meta-conversions-api-via-server-side-gtm-normalization-deduplication-and-emq-checks\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/hero-10092-review-20261024-dark.png\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/10\\\/hero-10092-review-20261024-dark.png\",\"width\":1200,\"height\":630,\"caption\":\"Meta Conversions API via Server-Side GTM: Normalization, Deduplication and EMQ Checks\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/tutorials-en-digital-marketing\\\/meta-conversions-api-via-server-side-gtm-normalization-deduplication-and-emq-checks\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Meta Conversions API via Server-Side GTM: Normalization, Deduplication and EMQ Checks\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\",\"name\":\"Lukas Wojcik - Blog\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\",\"name\":\"Lukas Wojcik\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\",\"width\":424,\"height\":636,\"caption\":\"Lukas Wojcik\"},\"logo\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/lw-x2.jpg\"},\"sameAs\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Meta Conversions API via Server-Side GTM: Normalization, Deduplication and EMQ Checks | Lukas Wojcik","description":"Wiring the Meta Conversions API through server-side GTM: normalizing and SHA-256 hashing email and phone, and pushing Event Match Quality above 6.0.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/meta-conversions-api-via-server-side-gtm-normalization-deduplication-and-emq-checks\/","og_locale":"en_US","og_type":"article","og_title":"Meta Conversions API via Server-Side GTM: Normalization, Deduplication and EMQ Checks | Lukas Wojcik","og_description":"Wiring the Meta Conversions API through server-side GTM: normalizing and SHA-256 hashing email and phone, and pushing Event Match Quality above 6.0.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/meta-conversions-api-via-server-side-gtm-normalization-deduplication-and-emq-checks\/","og_site_name":"Lukas Wojcik - Blog","article_published_time":"2026-11-08T06:38:00+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/hero-10092-review-20261024-dark.png","type":"image\/png"}],"author":"Lukas Wojcik","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Lukas Wojcik","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/meta-conversions-api-via-server-side-gtm-normalization-deduplication-and-emq-checks\/#article","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/meta-conversions-api-via-server-side-gtm-normalization-deduplication-and-emq-checks\/"},"author":{"name":"Lukas Wojcik","@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"headline":"Meta Conversions API via Server-Side GTM: Normalization, Deduplication and EMQ Checks","datePublished":"2026-11-08T06:38:00+00:00","mainEntityOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/meta-conversions-api-via-server-side-gtm-normalization-deduplication-and-emq-checks\/"},"wordCount":1278,"commentCount":0,"publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/meta-conversions-api-via-server-side-gtm-normalization-deduplication-and-emq-checks\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/hero-10092-review-20261024-dark.png","keywords":["Conversion Tracking","Data Privacy","Meta Conversions API","Server-Side GTM","Tutorial"],"articleSection":["Tutorials"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/meta-conversions-api-via-server-side-gtm-normalization-deduplication-and-emq-checks\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/meta-conversions-api-via-server-side-gtm-normalization-deduplication-and-emq-checks\/","url":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/meta-conversions-api-via-server-side-gtm-normalization-deduplication-and-emq-checks\/","name":"Meta Conversions API via Server-Side GTM: Normalization, Deduplication and EMQ Checks | Lukas Wojcik","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/meta-conversions-api-via-server-side-gtm-normalization-deduplication-and-emq-checks\/#primaryimage"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/meta-conversions-api-via-server-side-gtm-normalization-deduplication-and-emq-checks\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/hero-10092-review-20261024-dark.png","datePublished":"2026-11-08T06:38:00+00:00","description":"Wiring the Meta Conversions API through server-side GTM: normalizing and SHA-256 hashing email and phone, and pushing Event Match Quality above 6.0.","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/meta-conversions-api-via-server-side-gtm-normalization-deduplication-and-emq-checks\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/meta-conversions-api-via-server-side-gtm-normalization-deduplication-and-emq-checks\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/meta-conversions-api-via-server-side-gtm-normalization-deduplication-and-emq-checks\/#primaryimage","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/hero-10092-review-20261024-dark.png","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/10\/hero-10092-review-20261024-dark.png","width":1200,"height":630,"caption":"Meta Conversions API via Server-Side GTM: Normalization, Deduplication and EMQ Checks"},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/tutorials-en-digital-marketing\/meta-conversions-api-via-server-side-gtm-normalization-deduplication-and-emq-checks\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Meta Conversions API via Server-Side GTM: Normalization, Deduplication and EMQ Checks"}]},{"@type":"WebSite","@id":"https:\/\/www.lukaswojcik.com\/blog\/#website","url":"https:\/\/www.lukaswojcik.com\/blog\/","name":"Lukas Wojcik - Blog","description":"","publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.lukaswojcik.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9","name":"Lukas Wojcik","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg","width":424,"height":636,"caption":"Lukas Wojcik"},"logo":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/07\/lw-x2.jpg"},"sameAs":["https:\/\/www.lukaswojcik.com\/blog"]}]}},"_links":{"self":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/10092","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/comments?post=10092"}],"version-history":[{"count":9,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/10092\/revisions"}],"predecessor-version":[{"id":27161,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/10092\/revisions\/27161"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media\/23334"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=10092"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/categories?post=10092"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=10092"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}