{"id":10464,"date":"2026-09-18T07:20:00","date_gmt":"2026-09-18T05:20:00","guid":{"rendered":"https:\/\/www.lukaswojcik.com\/blog\/?p=10464"},"modified":"2026-10-26T11:52:52","modified_gmt":"2026-10-26T10:52:52","slug":"preparing-customer-data-for-the-meta-conversions-api-correct-formatting-and-hashing","status":"publish","type":"post","link":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/preparing-customer-data-for-the-meta-conversions-api-correct-formatting-and-hashing\/","title":{"rendered":"Preparing Customer Data for the Meta Conversions API: Correct Formatting and Hashing"},"content":{"rendered":"<p>SHA-256 calculates a fixed-length value from the input data. This value is called a hash. A successful Conversions API response does not establish that an email address was matched correctly. A plausible SHA-256 value can originate from incorrectly prepared data. Other identifiers may still support matching. API acceptance, data quality and actual matching therefore require separate checks.<\/p>\n<p>Normalisation means converting an input into the form required for a particular field before hashing. For an email address, the sequence is removal of surrounding whitespace, conversion to lowercase and then SHA-256. Changing the resulting hash cannot repair an input error.<\/p>\n<figure class=\"lw-diagram\"><img decoding=\"async\" src=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/diagrams\/dia-10464-capihash-20261024.png\" width=\"1120\" height=\"580\" loading=\"lazy\" alt=\"Two calculated SHA-256 values and comparison with a fictional expected value. This is not a Meta matching result.\"><figcaption>Two spellings, two hashes. Local comparison with an expected value does not prove API acceptance or attribution.<\/figcaption><\/figure>\n<h2>Why the exact input matters<\/h2>\n<p>SHA-256 processes bytes. Spaces and letter case change the result. Three spellings of the same fictional address produce three different hashes in the example. Comparison with the expected hash requires the normalised spelling. This does not mean that Meta never compares other values, or that the entire event necessarily remains unmatched.<\/p>\n<h2>Field rules instead of one function for everything<\/h2>\n<p>The following overview is an integration guide. The current Meta field specification and the installed SDK version remain decisive. An SDK is a software library supplied to help applications use the API. It may already normalise and hash values, so preceding transformations must be compatible.<\/p>\n<table><thead><tr><th>Field<\/th><th>Preparation and check<\/th><\/tr><\/thead><tbody>\n<tr><td><code>em<\/code><\/td><td>Removal of surrounding whitespace and lowercase conversion; no invented corrections to the address.<\/td><\/tr>\n<tr><td><code>ph<\/code><\/td><td>International number with country calling code, containing only digits for hashing. Country-specific prefixes require correct interpretation first.<\/td><\/tr>\n<tr><td><code>fn<\/code>, <code>ln<\/code><\/td><td>Lowercase and surrounding whitespace require attention. The inspected Python\/Node.js helpers do not universally remove internal spaces and punctuation from these fields.<\/td><\/tr>\n<tr><td><code>ct<\/code><\/td><td>Lowercase city name without spaces or punctuation according to the field specification; SDK behaviour needs representative tests.<\/td><\/tr>\n<tr><td><code>country<\/code>, <code>st<\/code><\/td><td>Country as a two-letter ISO code such as <code>de<\/code>. Region handling is separate: a US state abbreviation is not a worldwide region rule.<\/td><\/tr>\n<tr><td><code>ge<\/code>, <code>db<\/code><\/td><td>Where available and permitted: <code>f<\/code>\/<code>m<\/code> or a valid date in <code>YYYYMMDD<\/code>. Missing values must not be guessed.<\/td><\/tr>\n<\/tbody><\/table>\n<p>Phone numbers can be processed automatically with country context and a maintained library such as libphonenumber. Removing every non-digit is insufficient: the German example <code>+49 (0)170 1234567<\/code> would retain an unnecessary zero. However, deleting a zero after every country calling code is also wrong; a leading zero can belong to an Italian international number. Ambiguous input requires clarification. Format validation does not prove current reachability.<\/p>\n\n\n<!-- lw-flux-illu 10464-a2 -->\n<figure class=\"lw-illu\"><img src=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/illustrationen\/flux-10464-a2.webp\" width=\"1120\" height=\"630\" loading=\"lazy\" decoding=\"async\" alt=\"Laundry is sorted by kind into three baskets, while a silk scarf hangs apart. Likewise, each kind of customer data needs its own rule before hashing (making it unreadable).\"><figcaption>Laundry is sorted by kind into three baskets, while a silk scarf hangs apart. Likewise, each kind of customer data needs its own rule before hashing (making it unreadable).<\/figcaption><\/figure>\n\n\n<h2>Values that remain unhashed<\/h2>\n<p><code>client_ip_address<\/code>, <code>client_user_agent<\/code>, <code>fbp<\/code> and <code>fbc<\/code> are transmitted unhashed according to the respective specification. That does not make these values harmless or unrelated to personal data. The IP address must correspond to the event; a proxy address does not replace the browser address. Cookie and click identifiers must not be arbitrarily invented.<\/p>\n<p>These are important examples, not a complete list of API fields. An explicit field mapping determines validation, normalisation, hashing or unchanged transmission. New fields need a deliberate decision rather than a blanket hashing loop over the entire object.<\/p>\n<h2>A reproducible test without real customer data<\/h2>\n<p>This Python example calculates complete hashes for a fictional address. The first two outputs start with <code>524d6368<\/code> and <code>de4c5edc<\/code>; the normalised version starts with <code>dd432348<\/code>.<\/p>\n<figure style=\"--cbb-digits:2\" class=\"cbb cbb--wrap cbb--numbers wp-block-code-beautifier-block-code\" data-lang=\"python\"><figcaption class=\"cbb-head\"><span class=\"cbb-lang\">Python<\/span><span class=\"cbb-actions\"><button type=\"button\" class=\"cbb-button cbb-button--wrap\" data-cbb-action=\"wrap\" aria-pressed=\"true\" title=\"Wrap long lines\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><path d=\"M2 4h12M2 8h9.5a2.5 2.5 0 0 1 0 5H8m0 0 1.5-1.5M8 13l1.5 1.5M2 12h3\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\" stroke-linecap=\"round\" stroke-linejoin=\"round\"\/><\/svg><span class=\"cbb-sr\">Wrap long lines<\/span><\/button><button type=\"button\" class=\"cbb-button cbb-button--copy\" data-cbb-action=\"copy\" data-cbb-done=\"Copied\" data-cbb-failed=\"Press Ctrl+C to copy\"><svg aria-hidden=\"true\" focusable=\"false\" width=\"16\" height=\"16\" viewBox=\"0 0 16 16\"><rect x=\"5.5\" y=\"5.5\" width=\"8\" height=\"8.5\" rx=\"1.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><path d=\"M10.5 3.5V3A1.5 1.5 0 0 0 9 1.5H4A1.5 1.5 0 0 0 2.5 3v6.5A1.5 1.5 0 0 0 4 11h.5\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.5\"\/><\/svg><span class=\"cbb-button-label\" aria-live=\"polite\">Copy<\/span><\/button><\/span><\/figcaption><pre class=\"cbb-pre\" tabindex=\"0\"><code class=\"cbb-code language-python\" style=\"counter-reset:cbb-line 0;\"><span class=\"cbb-line\"><span class=\"cbb-keyword\">import<\/span> hashlib\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">samples = &#91;\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-string\">\"  Max.Mustermann@Example.COM \"<\/span>,\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-string\">\"  max.mustermann@example.com \"<\/span>,\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-string\">\"max.mustermann@example.com\"<\/span>,\n<\/span><span class=\"cbb-line\">&#93;\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">for<\/span> value <span class=\"cbb-keyword\">in<\/span> samples:\n<\/span><span class=\"cbb-line\">    <span class=\"cbb-function\">print<\/span>(<span class=\"cbb-function\">repr<\/span>(value), hashlib.<span class=\"cbb-function\">sha256<\/span>(value.<span class=\"cbb-function\">encode<\/span>(<span class=\"cbb-string\">\"utf-8\"<\/span>)).<span class=\"cbb-function\">hexdigest<\/span>())\n<\/span><span class=\"cbb-line\">\n<\/span><span class=\"cbb-line\">expected = <span class=\"cbb-string\">\"dd432348e6c3373c5f646913fa94ae7947bc0086b42028aedec4371e3e3c2cdb\"<\/span>\n<\/span><span class=\"cbb-line\">normalised = samples&#91;<span class=\"cbb-number\">0<\/span>&#93;.<span class=\"cbb-function\">strip<\/span>().<span class=\"cbb-function\">lower<\/span>()\n<\/span><span class=\"cbb-line\"><span class=\"cbb-keyword\">assert<\/span> hashlib.<span class=\"cbb-function\">sha256<\/span>(normalised.<span class=\"cbb-function\">encode<\/span>(<span class=\"cbb-string\">\"utf-8\"<\/span>)).<span class=\"cbb-function\">hexdigest<\/span>() == expected<\/span><\/code><\/pre><\/figure>\n<p>The test demonstrates local calculation, not matching by Meta. Integration testing requires the same fictional test value to pass through every processing step, including the final data sent to Meta. Empty values, international phone numbers, postcodes and already hashed inputs also need coverage. Unprotected logs are unsuitable for raw customer data or real identifiers.<\/p>\n<p>API errors and warnings remain relevant. A mismatching hash may pass unnoticed, but an SDK can reject malformed input before transmission. Event Match Quality is a diagnostic indicator, not proof that a specific event was linked to a specific person. A single hashing error does not imply a predictable change in that indicator or the event count.<\/p>\n<h2>Browser or server: the data flow matters<\/h2>\n<p>Normalisation and hashing can run in a browser or on a server. Meta also provides a client-side parameter builder. Browser hashing does not force transmission of the raw address: actual requests and other scripts determine whether raw data leave the device. A backend can also receive raw data, with corresponding protection requirements.<\/p>\n<p>The integration needs a clearly assigned processing stage, a documented input state and inspection of outgoing data. A secret CAPI access token must not appear in publicly delivered browser code. Hashing replaces neither transport encryption nor a lawful processing arrangement.<\/p>\n<div class=\"lw-faq\"><h2>Questions and answers<\/h2>\n<h3>Are hashed customer data automatically anonymous?<\/h3><p>No. In the matching process described here, association with a person remains intended and possible using additional data. Such a hash does not automatically anonymise the data. A lawful basis, transparency and any required consent need separate consideration.<\/p>\n<h3>How can double hashing be prevented?<\/h3><p>Hashing a hash produces a different result from the expected single hash. The interface between processing stages therefore needs an explicit contract: raw value or already normalised SHA-256 value. A pattern of 64 hexadecimal characters proves neither provenance nor correct normalisation. An internal identifier can happen to have the same format. SDK detection rules need inspection and cannot establish provenance.<\/p>\n<h3>What about postcodes and external_id?<\/h3><p><code>zp<\/code> needs country-appropriate preparation. The Python SDK documentation describes five digits for the US and national standards elsewhere. At the same time, the inspected normaliser splits at the first hyphen: <code>00-950<\/code> would become <code>00<\/code>. This SDK effect is not a general rule for Polish postcodes. The integration needs an explicit test case checked against the current field specification.<\/p><p><code>external_id<\/code> is an internal identifier. The inspected Python UserData path passes this list without additional hashing; other helpers may behave differently. The current schema remains decisive. Documented rules need to specify where hashing occurs and whether each input is raw or already hashed. Pixel and CAPI need the same final representation. Silently treating the field like an email address is unsuitable.<\/p><\/div>\n<div class=\"lw-quellen\"><h2>Sources<\/h2><ul>\n<li><a href=\"https:\/\/developers.facebook.com\/documentation\/ads-commerce\/conversions-api\" target=\"_blank\" rel=\"noopener noreferrer\">Meta Conversions API<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/facebook\/facebook-python-business-sdk\/blob\/main\/facebook_business\/adobjects\/serverside\/normalize.py\" target=\"_blank\" rel=\"noopener noreferrer\">Meta Python Business SDK: Normalization and hashing<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/facebook\/facebook-python-business-sdk\/blob\/main\/facebook_business\/adobjects\/serverside\/user_data.py\" target=\"_blank\" rel=\"noopener noreferrer\">Meta Python Business SDK: User data fields<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/facebook\/facebook-nodejs-business-sdk\/blob\/main\/src\/objects\/serverside\/utils.js\" target=\"_blank\" rel=\"noopener noreferrer\">Meta Node.js Business SDK: Field normalization<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/facebook\/capi-param-builder\/blob\/main\/client_js\/README.md\" target=\"_blank\" rel=\"noopener noreferrer\">Meta: Client-side parameter builder<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/google\/libphonenumber\" target=\"_blank\" rel=\"noopener noreferrer\">Google: libphonenumber<\/a><\/li>\n<li><a href=\"https:\/\/github.com\/google\/libphonenumber\/blob\/master\/FAQ.md\" target=\"_blank\" rel=\"noopener noreferrer\">Google libphonenumber: Parsing and validation FAQ<\/a><\/li>\n<li><a href=\"https:\/\/www.edpb.europa.eu\/sme\/find-practical-info\/faq_en\" target=\"_blank\" rel=\"noopener noreferrer\">EDPB: Data protection FAQ<\/a><\/li>\n<\/ul><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Correct CAPI hashing depends on field-specific preparation and a clear processing contract. A reproducible SHA-256 example separates local calculation from API acceptance and matching.<\/p>\n","protected":false},"author":1,"featured_media":30783,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[91057,91061],"class_list":["post-10464","post","type-post","status-publish","format-standard","hentry","category-digital-marketing","tag-meta-conversions-api","tag-server-side-gtm"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Preparing Customer Data for the Meta Conversions API: Correct Formatting and Hashing | Lukas Wojcik<\/title>\n<meta name=\"description\" content=\"Why trimming and lowercasing decide whether a Conversions API event finds a person, and which parameters must not be hashed at all.\" \/>\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\/preparing-customer-data-for-the-meta-conversions-api-correct-formatting-and-hashing\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Preparing Customer Data for the Meta Conversions API: Correct Formatting and Hashing | Lukas Wojcik\" \/>\n<meta property=\"og:description\" content=\"Why trimming and lowercasing decide whether a Conversions API event finds a person, and which parameters must not be hashed at all.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/preparing-customer-data-for-the-meta-conversions-api-correct-formatting-and-hashing\/\" \/>\n<meta property=\"og:site_name\" content=\"Lukas Wojcik - Blog\" \/>\n<meta property=\"article:published_time\" content=\"2026-09-18T05:20:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-26T10:52:52+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/11\/klarheit-20261111-10464.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=\"6 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\\\/preparing-customer-data-for-the-meta-conversions-api-correct-formatting-and-hashing\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/preparing-customer-data-for-the-meta-conversions-api-correct-formatting-and-hashing\\\/\"},\"author\":{\"name\":\"Lukas Wojcik\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"headline\":\"Preparing Customer Data for the Meta Conversions API: Correct Formatting and Hashing\",\"datePublished\":\"2026-09-18T05:20:00+00:00\",\"dateModified\":\"2026-10-26T10:52:52+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/preparing-customer-data-for-the-meta-conversions-api-correct-formatting-and-hashing\\\/\"},\"wordCount\":1040,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#\\\/schema\\\/person\\\/895f7604f9b6b71aad9bba33af28d0f9\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/preparing-customer-data-for-the-meta-conversions-api-correct-formatting-and-hashing\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/klarheit-20261111-10464.png\",\"keywords\":[\"Meta Conversions API\",\"Server-Side GTM\"],\"articleSection\":[\"Digital Marketing\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/preparing-customer-data-for-the-meta-conversions-api-correct-formatting-and-hashing\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/preparing-customer-data-for-the-meta-conversions-api-correct-formatting-and-hashing\\\/\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/preparing-customer-data-for-the-meta-conversions-api-correct-formatting-and-hashing\\\/\",\"name\":\"Preparing Customer Data for the Meta Conversions API: Correct Formatting and Hashing | Lukas Wojcik\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/preparing-customer-data-for-the-meta-conversions-api-correct-formatting-and-hashing\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/preparing-customer-data-for-the-meta-conversions-api-correct-formatting-and-hashing\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/klarheit-20261111-10464.png\",\"datePublished\":\"2026-09-18T05:20:00+00:00\",\"dateModified\":\"2026-10-26T10:52:52+00:00\",\"description\":\"Why trimming and lowercasing decide whether a Conversions API event finds a person, and which parameters must not be hashed at all.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/preparing-customer-data-for-the-meta-conversions-api-correct-formatting-and-hashing\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/preparing-customer-data-for-the-meta-conversions-api-correct-formatting-and-hashing\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/preparing-customer-data-for-the-meta-conversions-api-correct-formatting-and-hashing\\\/#primaryimage\",\"url\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/klarheit-20261111-10464.png\",\"contentUrl\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/11\\\/klarheit-20261111-10464.png\",\"width\":1200,\"height\":630,\"caption\":\"Preparing Customer Data for the Meta Conversions API: Correct Formatting and Hashing\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/en\\\/digital-marketing\\\/preparing-customer-data-for-the-meta-conversions-api-correct-formatting-and-hashing\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.lukaswojcik.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Preparing Customer Data for the Meta Conversions API: Correct Formatting and Hashing\"}]},{\"@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":"Preparing Customer Data for the Meta Conversions API: Correct Formatting and Hashing | Lukas Wojcik","description":"Why trimming and lowercasing decide whether a Conversions API event finds a person, and which parameters must not be hashed at all.","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\/preparing-customer-data-for-the-meta-conversions-api-correct-formatting-and-hashing\/","og_locale":"en_US","og_type":"article","og_title":"Preparing Customer Data for the Meta Conversions API: Correct Formatting and Hashing | Lukas Wojcik","og_description":"Why trimming and lowercasing decide whether a Conversions API event finds a person, and which parameters must not be hashed at all.","og_url":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/preparing-customer-data-for-the-meta-conversions-api-correct-formatting-and-hashing\/","og_site_name":"Lukas Wojcik - Blog","article_published_time":"2026-09-18T05:20:00+00:00","article_modified_time":"2026-10-26T10:52:52+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/11\/klarheit-20261111-10464.png","type":"image\/png"}],"author":"Lukas Wojcik","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Lukas Wojcik","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/preparing-customer-data-for-the-meta-conversions-api-correct-formatting-and-hashing\/#article","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/preparing-customer-data-for-the-meta-conversions-api-correct-formatting-and-hashing\/"},"author":{"name":"Lukas Wojcik","@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"headline":"Preparing Customer Data for the Meta Conversions API: Correct Formatting and Hashing","datePublished":"2026-09-18T05:20:00+00:00","dateModified":"2026-10-26T10:52:52+00:00","mainEntityOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/preparing-customer-data-for-the-meta-conversions-api-correct-formatting-and-hashing\/"},"wordCount":1040,"commentCount":0,"publisher":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#\/schema\/person\/895f7604f9b6b71aad9bba33af28d0f9"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/preparing-customer-data-for-the-meta-conversions-api-correct-formatting-and-hashing\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/11\/klarheit-20261111-10464.png","keywords":["Meta Conversions API","Server-Side GTM"],"articleSection":["Digital Marketing"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/preparing-customer-data-for-the-meta-conversions-api-correct-formatting-and-hashing\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/preparing-customer-data-for-the-meta-conversions-api-correct-formatting-and-hashing\/","url":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/preparing-customer-data-for-the-meta-conversions-api-correct-formatting-and-hashing\/","name":"Preparing Customer Data for the Meta Conversions API: Correct Formatting and Hashing | Lukas Wojcik","isPartOf":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/preparing-customer-data-for-the-meta-conversions-api-correct-formatting-and-hashing\/#primaryimage"},"image":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/preparing-customer-data-for-the-meta-conversions-api-correct-formatting-and-hashing\/#primaryimage"},"thumbnailUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/11\/klarheit-20261111-10464.png","datePublished":"2026-09-18T05:20:00+00:00","dateModified":"2026-10-26T10:52:52+00:00","description":"Why trimming and lowercasing decide whether a Conversions API event finds a person, and which parameters must not be hashed at all.","breadcrumb":{"@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/preparing-customer-data-for-the-meta-conversions-api-correct-formatting-and-hashing\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/preparing-customer-data-for-the-meta-conversions-api-correct-formatting-and-hashing\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/preparing-customer-data-for-the-meta-conversions-api-correct-formatting-and-hashing\/#primaryimage","url":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/11\/klarheit-20261111-10464.png","contentUrl":"https:\/\/www.lukaswojcik.com\/blog\/wp-content\/uploads\/2026\/11\/klarheit-20261111-10464.png","width":1200,"height":630,"caption":"Preparing Customer Data for the Meta Conversions API: Correct Formatting and Hashing"},{"@type":"BreadcrumbList","@id":"https:\/\/www.lukaswojcik.com\/blog\/en\/digital-marketing\/preparing-customer-data-for-the-meta-conversions-api-correct-formatting-and-hashing\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.lukaswojcik.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Preparing Customer Data for the Meta Conversions API: Correct Formatting and Hashing"}]},{"@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\/10464","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=10464"}],"version-history":[{"count":8,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/10464\/revisions"}],"predecessor-version":[{"id":26697,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/posts\/10464\/revisions\/26697"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media\/30783"}],"wp:attachment":[{"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/media?parent=10464"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/categories?post=10464"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.lukaswojcik.com\/blog\/wp-json\/wp\/v2\/tags?post=10464"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}