PageSourceSearch

https://www.adverfly.com/_next/static/chunks/pages/docs/s2s-02543e90bafe1c5f.js

js adverfly.com collected 2026-10-02 00:31:02 UTC 24,682 bytes, 1 lines download raw bytes

1(self.webpackChunk_N_E=self.webpackChunk_N_E||[]).push([[7497],{19726:function(e,t,n){(window.__NEXT_P=window.__NEXT_P||[]).push(["/docs/s2s",function(){return n(48943)}])},58716:function(e,t,n){"use strict";n.d(t,{l:function(){return o}});var r=n(85893),i=n(11163),s=n(7376),a=n(18341);function o(e){var t;let{image:n="/homepage/og-image.png",alternateLocales:o,contentLocale:d,pageType:l,breadcrumbs:c,structuredData:p,...u}=e,h=(0,i.useRouter)(),m=null!=d?d:"de"===h.locale?"de":"en",f=null!=o?o:d?[d]:["en","de"];return(0,r.jsx)(s.H,{...u,image:n,contentLocale:m,alternateLocales:f,structuredData:u.noIndex?void 0:null!=p?p:function(e){let{path:t,locale:n,title:r,description:i,image:s="/homepage/og-image.png",pageType:o="WebPage",breadcrumbs:d=[]}=e,l=(0,a.ey)(t,n),c=(0,a.ey)("/",n),p=l===c,u="".concat(a.or,"/#organization"),h="".concat(a.or,"/#website"),m="".concat(l,"#breadcrumb"),f=r.replace(/\s*[|—·]\s*Adverfly(?:\s.*)?$/,""),g=[{name:"de"===n?"Startseite":"Home",path:"/"},...d.filter(e=>{let t=(0,a.ey)(e.path,n);return t!==c&&t!==l}),{name:f,path:t}],y=[{"@type":o,"@id":"".concat(l,"#webpage"),url:l,name:r,description:i,inLanguage:n,isPartOf:{"@id":h},about:{"@id":u},primaryImageOfPage:{"@type":"ImageObject",url:(0,a.GR)(s)},...p?{}:{breadcrumb:{"@id":m}}}];return p?y.push({"@type":"Organization","@id":u,name:"Adverfly",legalName:"Adverfly GmbH",url:a.or},{"@type":"WebSite","@id":h,name:"Adverfly",url:a.or,inLanguage:["en","de"],publisher:{"@id":u}}):y.push({"@type":"BreadcrumbList","@id":m,itemListElement:g.map((e,t)=>({"@type":"ListItem",position:t+1,name:e.name,item:(0,a.ey)(e.path,n)}))}),{"@context":"https://schema.org","@graph":y}}({path:null!==(t=u.canonical)&&void 0!==t?t:h.asPath,locale:m,title:u.title,description:u.description,image:n,pageType:l,breadcrumbs:c})})}},7376:function(e,t,n){"use strict";n.d(t,{H:function(){return l}});var r=n(85893),i=n(9008),s=n.n(i),a=n(67294),o=n(11163),d=n(18341);let l=e=>{let{title:t,description:n,image:i="/favicon.ico",canonical:l,noIndex:c,contentLocale:p,alternateLocales:u,type:h="website",structuredData:m}=e,f=(0,o.useRouter)(),g=null!=p?p:f.locale,y=(0,d.HR)(f.asPath,g,l),v="de"===g?"de_DE":"en_US",x=null!=u?u:["de"===g?"de":"en"],b=(0,d.GR)(i),w=null!=l?l:f.asPath,k=new URL(y).origin===d.or;return(0,a.useEffect)(()=>{let e=()=>{document.documentElement.lang=null!=g?g:"en"};return e(),f.events.on("routeChangeComplete",e),()=>f.events.off("routeChangeComplete",e)},[g,f.events]),(0,r.jsxs)(s(),{children:[(0,r.jsx)("title",{children:t}),(0,r.jsx)("meta",{name:"description",content:n}),c&&(0,r.jsx)("meta",{name:"robots",content:"noindex,nofollow"},"robots"),(0,r.jsx)("link",{rel:"canonical",href:y}),(0,r.jsx)("meta",{property:"og:type",content:h}),(0,r.jsx)("meta",{property:"og:title",content:t}),(0,r.jsx)("meta",{property:"og:description",content:n}),(0,r.jsx)("meta",{property:"og:url",content:y}),(0,r.jsx)("meta",{property:"og:locale",content:v}),(0,r.jsx)("meta",{property:"og:site_name",content:"Adverfly"}),!c&&k&&x.map(e=>(0,r.jsx)("link",{rel:"alternate",hrefLang:e,href:(0,d.ey)(w,e)},"alternate-".concat(e))),!c&&k&&x.length>1&&x.includes("en")&&(0,r.jsx)("link",{rel:"alternate",hrefLang:"x-default",href:(0,d.ey)(w,"en")}),(0,r.jsx)("meta",{property:"og:image",content:b}),(0,r.jsx)("meta",{name:"twitter:card",content:"summary_large_image"}),(0,r.jsx)("meta",{name:"twitter:title",content:t}),(0,r.jsx)("meta",{name:"twitter:description",content:n}),(0,r.jsx)("meta",{name:"twitter:image",content:b}),m&&(0,r.jsx)("script",{type:"application/ld+json",dangerouslySetInnerHTML:{__html:(0,d.nc)(m)}},"structured-data")]})}},68613:function(e,t,n){"use strict";n.d(t,{a:function(){return o}});var r=n(85893),i=n(11163),s=n(58716);let a={index:{path:"/docs",en:{title:"Documentation: apps, tracking pixel & REST API | Adverfly",description:"Integrate Adverfly with your shop: documentation for the tracking pixel, REST API, surveys, widgets, loyalty and marketing apps."},de:{title:"Dokumentation: Apps, Tracking-Pixel & REST-API | Adverfly",description:"Verbinde Adverfly mit deinem Shop: Dokumentation zu Tracking-Pixel, REST-API, Umfragen, Widgets, Loyalty und Marketing-Apps."}},api:{path:"/docs/api",en:{title:"REST API reference: marketing data & reports | Adverfly",description:"Access Adverfly workspace data through the REST API. Read authentication instructions, event, conversion and ad endpoints, reports and error responses."},de:{title:"REST-API-Referenz: Marketingdaten & Reports | Adverfly",description:"Rufe Adverfly-Workspace-Daten per REST-API ab: Authentifizierung, Events, Conversions, Anzeigen, Reports und Fehlerantworten."}},sdk:{path:"/docs/sdk",en:{title:"Tracking pixel & JavaScript SDK documentation | Adverfly",description:"Install the Adverfly pixel with Shopify, Google Tag Manager or JavaScript. Configure events, conversions, personalization and tracking diagnostics."},de:{title:"Tracking-Pixel & JavaScript-SDK dokumentiert | Adverfly",description:"Installiere den Adverfly-Pixel per Shopify, Google Tag Manager oder JavaScript. Konfiguriere Events, Conversions, Personalisierung und Tracking-Diagnosen."}},glossary:{path:"/docs/glossary",en:{title:"Marketing glossary: ROAS, attribution & MMM | Adverfly",description:"Understand the marketing metrics and methods used in Adverfly: ROAS, attribution, marketing mi
1x modeling, tracking, customer segments and AI."},de:{title:"Marketing-Glossar: ROAS, Attribution & MMM | Adverfly",description:"Verstehe die Kennzahlen und Methoden in Adverfly: ROAS, Attribution, Marketing Mix Modeling, Tracking, Kundensegmente und KI."}},apps:{path:"/docs/apps",en:{title:"Marketing apps: setup & feature documentation | Adverfly",description:"Browse Adverfly app documentation for analytics, attribution, marketing mix modeling, tracking, AI assistants and automation."},de:{title:"Marketing-Apps: Einrichtung & Dokumentation | Adverfly",description:"Dokumentation zu Adverfly-Apps f\xfcr Analytics, Attribution, Marketing Mix Modeling, Tracking, KI-Assistenten und Automatisierung."}},widgets:{path:"/docs/widgets",en:{title:"Personalized widgets: installation & events | Adverfly",description:"Integrate Adverfly storefront widgets: personalized popups, banners, countdowns and toasts selected for each visitor through the pixel."},de:{title:"Personalisierte Widgets: Einbindung & Events | Adverfly",description:"Binde Adverfly-Widgets im Shop ein: personalisierte Pop-ups, Banner, Countdowns und Toasts, die der Pixel passend zum Besucher ausw\xe4hlt."}},surveys:{path:"/docs/surveys",en:{title:"Customer surveys: website integration guide | Adverfly",description:"Embed Adverfly surveys on your website with the tracking pixel. Collect post-purchase feedback, NPS responses and customer insights."},de:{title:"Kundenumfragen: Anleitung zur Website-Einbindung | Adverfly",description:"Binde Adverfly-Umfragen mit dem Tracking-Pixel auf deiner Website ein und sammle Feedback nach dem Kauf, NPS-Antworten und Kundeneinblicke."}},loyalty:{path:"/docs/loyalty",en:{title:"Loyalty API, JavaScript SDK & Shopify setup | Adverfly",description:"Integrate Adverfly cashback loyalty programs: authentication, REST endpoints, webhooks, Shopify setup, customer balances and the JavaScript SDK."}},lookbook:{path:"/docs/lookbook",en:{title:"Marketing app guide: from tracking to MMM | Adverfly",description:"Choose the Adverfly app for each stage of your marketing workflow. A guide from tracking and data setup through attribution, optimization and MMM."}},s2s:{path:"/docs/s2s",en:{title:"Server-to-server event & conversion integration | Adverfly",description:"Send events and conversions from your server to Adverfly. Reference for required fields, visitor identifiers, attribution parameters and request examples."}},"shopify-survey-setup":{path:"/docs/shopify-survey-setup",en:{title:"Shopify post-purchase survey setup guide | Adverfly",description:"Add the Adverfly post-purchase survey to Shopify's thank-you page. Configure workspace and survey IDs, countries, languages and checkout blocks."}},"why-adverfly":{path:"/docs/why-adverfly",en:{title:"Why Adverfly: specialized AI for marketing | Adverfly",description:"Compare Adverfly's marketing agents, connected workspace data and approval workflows with general-purpose AI and separate marketing tools."},de:{title:"Warum Adverfly: spezialisierte KI f\xfcrs Marketing",description:"Vergleiche Adverflys Marketing-Agenten, verbundene Workspace-Daten und Freigaben mit allgemeiner KI und einzelnen Marketing-Tools."}},videos:{path:"/docs/videos",en:{title:"Planned video tutorials | Adverfly",description:"Preview the planned Adverfly video tutorials for pixel installation, marketing apps and integrations. Tutorials are coming soon."},de:{title:"Geplante Video-Tutorials | Adverfly",description:"Vorschau auf geplante Adverfly-Video-Tutorials zu Pixel-Installation, Marketing-Apps und Integrationen. Die Tutorials folgen in K\xfcrze."},noIndex:!0}};function o(e){var t;let{page:n}=e,{path:o,...d}=function(e,t){var n;let r=a[e],i="de"===t&&r.de?"de":"en";return{..."de"===i?r.de:r.en,contentLocale:i,alternateLocales:r.de?["en","de"]:["en"],noIndex:null!==(n=r.noIndex)&&void 0!==n&&n,path:r.path}}(n,null!==(t=(0,i.useRouter)().locale)&&void 0!==t?t:"en"),l="de"===d.contentLocale;return(0,r.jsx)(s.l,{...d,pageType:"index"===n||"apps"===n?"CollectionPage":"WebPage",breadcrumbs:[{name:l?"Startseite":"Home",path:"/"},{name:l?"Dokumentation":"Documentation",path:"/docs"},..."index"===n?[]:[{name:d.title.replace(/\s*\| Adverfly$/,""),path:o}]]})}Object.values(a).filter(e=>!e.noIndex).map(e=>({path:e.path,locales:e.de?["en","de"]:["en"]}))},18341:function(e,t,n){"use strict";n.d(t,{GR:function(){return a},HR:function(){return d},ey:function(){return o},nc:function(){return l},or:function(){return s}});var r=n(34155);let i="https://www.adverfly.com",s=function(){try{let e=new URL(r.env.NEXT_PUBLIC_SITE_URL||i);return/^https?:$/.test(e.protocol)?e.origin:i}catch(e){return i}}();function a(e){return new URL(e,"".concat(s,"/")).toString()}function o(e,t){let n=new URL(e,"".concat(s,"/")).pathname.replace(/^\/(en|de)(?=\/|$)/,"").replace(/\/+$/,"")||"/";return"".concat(s).concat("de"===t?"/de".concat("/"===n?"":n):n)}function d(e,t,n){return n?a(n):o(e,t)}function l(e){return JSON.stringify(e).replace(/</g,"\\u003c").replace(/\u2028/g,"\\u2028").replace(/\u2029/g,"\\u2029")}},48943:function(e,t,n){"use strict";n.r(t),n.d(t,{__N_SSG:function(){return s},default:function(){return a}});var r=n(85893),i=n(68613),s=!0;function a(){return(0,r.jsxs)(r.Fragment,{children:[(0,r.jsx)(i.a,{page:"s2s"}),(0,r.jsxs)("div",{style:{maxWidth:780,margin:"0 auto",padding:"48px 24px",fontFamily:"system-ui, -apple-system, sans-serif",color:"#1a1a1a",lineHeight:1.7},children:[(0,r.jsxs)("div",{style:{marginBottom:40},children:[(0,r.jsx)("h1",{style:{fontSize:28,fontWeight:700,marginBottom:8},children:"Server-to-Server Integration"}),(0,r.jsx)("p",{style:{color:"#666",fontSize:15},children:"Send events and purchases from your server or native app to Adverfly — no browser pixel required."})]}),(0,r.jsxs)(o,{title:"Endpoint",children:[(0,r.jsx)(l,{children:"POST https://b.adverfly.com/e\nContent-Type: application/json"}),(0,r.jsxs)("p",{style:{fontSize:14},children:["The same endpoint the browser pixel uses. One event per request, sent in real time: events are timestamped when they ",(0,r.jsx)("strong",{children:"arrive"}),", so a batch sent hours later lands on the wrong day and outside its session."]}),(0,r.jsxs)(p,{type:"info",children:[(0,r.jsx)("strong",{children:"Authentication"})," — none beyond ",(0,r.jsx)(c,{children:"store_id"}),". There is no API key, request signature or IP allowlist. Keep the call behind your own backend (proxy, event allowlist, validation, rate limiting)."]})]}),(0,r.jsxs)(o,{title:"Required Fields",children:[(0,r.jsx)(d,{headers:["Field","Type","Description"],rows:[["store_id","number","Your Adverfly workspace ID"],["event_type","string",'"event" for visits and funnel steps (pageview, add_to_cart, initiated_checkout), "conversion" for end goals (purchase, lead)'],["name","string",'Event name, e.g. "pageview", "add_to_cart", "purchase"'],["is_s2s","boolean","Always true for server-to-server requests"],["ip","string","The end customer's IP address, as its own top-level field. Never your server's IP"]]}),(0,r.jsxs)(p,{type:"warning",children:[(0,r.jsx)("strong",{children:"ip"})," — requests with ",(0,r.jsx)(c,{children:"is_s2s: true"}
1)," and no ",(0,r.jsx)(c,{children:"ip"})," are rejected. The IP is used for visitor matching and forwarded to ad platforms (e.g. Meta CAPI) as the customer","'","s IP. Do not put it into ",(0,r.jsx)(c,{children:"properties"}),"."]})]}),(0,r.jsxs)(o,{title:"Recommended Fields",children:[(0,r.jsx)(d,{headers:["Field","Type","Description"],rows:[["keys","string[]","Stable visitor identifiers (see Keys). Without keys, visitors can only be matched by IP"],["parameters","string",'The landing query string of the visit, e.g. "?utm_source=facebook&fbclid=…". This is what assigns the channel and campaign. Send it on the first event of a visit (web: the landing pageview; app: the app open / deep-link event)'],["properties","object","Click IDs (see Click IDs) and any custom fields you want to filter or break down by"],["hostname","string",'A fixed host for this source, e.g. "www.myshop.com" or "app.myshop.com" for an app. Tell us a new host so your reports include it'],["pathname","string",'Page or screen path, e.g. "/products/sneakers"'],["referrer","string","Referring URL, if known"],["store_currency","string",'Store currency, e.g. "EUR"'],["store_timezone","string",'Store timezone, e.g. "Europe/Berlin"']]}),(0,r.jsxs)(p,{type:"info",children:[(0,r.jsx)("strong",{children:"User agent"})," — read from the request","'","s ",(0,r.jsx)(c,{children:"User-Agent"})," header, not from the body. Forward the customer","'","s device or browser user agent in that header, otherwise your server","'","s is stored and forwarded."]}),(0,r.jsxs)(p,{type:"info",children:[(0,r.jsx)("strong",{children:"Missing values"})," — omit the field entirely. No empty strings, no ",(0,r.jsx)(c,{children:"null"}),", no placeholders."]})]}),(0,r.jsxs)(o,{title:"Keys — Visitor Identification",children:[(0,r.jsx)("p",{style:{fontSize:14},children:"An array of plain-text strings. Send every stable identifier you have; several of the same kind are fine. Adverfly hashes each key (SHA-256) before storage."}),(0,r.jsx)(d,{headers:["Source","Recommended keys"],rows:[["Web (Shopify)","Shopify client ID (event.clientId), _ga cookie, _fbp cookie"],["Native app","A stable install / visitor ID on every event, plus the shop's customer ID once the user is logged in (a Shopify customer GID is fine)"]]}),(0,r.jsxs)(p,{type:"warning",children:[(0,r.jsx)("strong",{children:"Start every key with a short namespace"})," such as ",(0,r.jsx)(c,{children:"app:"})," or ",(0,r.jsx)(c,{children:"cus:"}),". The first 4 characters of a key are stored readable (the rest is hashed), so never start a key with personal data such as an email address."]}),(0,r.jsxs)("ul",{style:{margin:"12px 0 0",paddingLeft:20,fontSize:14},children:[(0,r.jsxs)("li",{style:{marginBottom:6},children:[(0,r.jsx)("strong",{children:"Stitching is automatic"}),": when one request carries a key we already know, every other key in that request is linked to the same visitor. After login, send the install ID and the customer ID together once."]}),(0,r.jsx)("li",{style:{marginBottom:6},children:"A key stays linked to its visitor for 28 days, and the link is reset after a purchase — the same as for the browser pixel."})]})]}),(0,r.jsxs)(o,{title:"Click IDs",children:[(0,r.jsxs)("p",{style:{fontSize:14},children:["Send the click IDs you have as ",(0,r.jsx)(c,{children:"properties"})," on ",(0,r.jsx)("strong",{children:"every"})," event. They are forwarded to the ad platforms from there."]}),(0,r.jsx)(l,{children:JSON.stringify({properties:{_fbc:"fb.1.1727600000000.IwAR2xYz...",_fbp:"fb.1.1727600000000.123456789",gclid:"Cj0KCQjw9...",gbraid:"0AAAAADx...",wbraid:"CjkKEQjw...",ttclid:"E.C.P.CqgBkTg...",msclkid:"1a2b3c4d5e6f7a8b9c0d...",sclid:"7f3e2a1b-...",epik:"dj0yJnU9...",tblci:"GiDk3m...",obclid:"00a1b2c3..."}},null,2)}),(0,r.jsx)(d,{headers:["Key","Platform"],rows:[["_fbc","Meta click ID, format fb.1.<timestamp_ms>.<fbclid>"],["_fbp","Meta browser ID"],["gclid / gbraid / wbraid","Google Ads"],["ttclid","TikTok"],["msclkid","Microsoft Ads"],["sclid","Snapchat"],["epik","Pinterest"],["tblci","Taboola"],["obclid","Outbrain"]]}),(0,r.jsxs)(p,{type:"warning",children:[(0,r.jsx)("strong",{children:"Meta needs _fbc, not a bare fbclid."})," Build it as ",(0,r.jsx)(c,{children:"fb.1.<timestamp_ms>.<fbclid>"})," from the fbclid of the landing URL. A bare ",(0,r.jsx)(c,{children:"fbclid"})," in properties is stored but not forwarded to Meta. The raw query string still belongs in ",(0,r.jsx)(c,{children:"parameters"})," for the channel assignment."]}),(0,r.jsxs)(p,{type:"info",children:["The older ",(0,r.jsx)(c,{children:"entry_meta.key"})," / ",(0,r.jsx)(c,{children:"entry_meta.value"})," arrays are still accepted and merged into ",(0,r.jsx)(c,{children:"properties"})," on our side. Use one format, not both."]})]}),(0,r.jsxs)(o,{title:"Purchases",children:[(0,r.jsx)(d,{headers:["Field","Type","Description"],rows:[["transaction_id","string",'Required. The order ID exactly as your shop sync delivers it to Adverfly. Shopify: the numeric order ID as a string, e.g. "6123456789012" — not the GID, not the order name. Plain text recommended (see Hashing)'],["transaction_currency","string","Required. Order currency (converted to the store currency)"],["transaction_gross_revenue","number","Recommended. Order total in cents (€99.00 = 9900). Your best estimate is fine"],["customer_id","string","Recommended. The customer's email (hashed server-side). Drives new / returning detection and LTV"],["is_new_customer","number","Optional. 1 = new, 0 = returning. Detected automatically when omitted"],["transaction_shipping_costs, transaction_tax","number","Optional, in cents"],["transaction_discount_code, transaction_city, transaction_country_code","string","Optional"],["transaction_items","array","Optional line items (see the example below)"]]}),(0,r.jsxs)("ul",{style:{margin:"12px 0 0",paddingLeft:20,fontSize:14},children:[(0,r.jsxs)("li",{style:{marginBottom:6},children:[(0,r.jsx)("strong",{children:"Matching with your order sync"}),": the purchase event is joined to the synced order on ",(0,r.jsx)(c,{children:"transaction_id"}),". The synced order provides the money (totals, shipping, tax, refunds), the event provides the attribution. That only works when both carry the same ID."]}),(0,r.jsxs)("li",{style:{marginBottom:6},children:[(0,r.jsx)("strong",{children:"One purchase per order"}),": a second purchase with an ID we already have is answered with ",(0,r.jsx)(c,{children:"400 Transaction ID already exists"})," — for example when the web checkout pixel already reported that order. Treat it as success and do not retry."]}),(0,r.jsxs)("li",{style:{marginBottom:6},children:["A purchase without ",(0,r.jsx)(c,{children:"transaction_id"})," gets a random ID and can never be matched to an order."]})]})]}),(0,r.jsx)(o,{title:'Example: app open / landing ("pageview")',children:(0,r.jsx)(l,{children:JSON.stringify({store_id:123456,is_s2s:!0,ip:"185.32.100.42",event_type:"event",name:"pageview",hostname:"app.myshop.com",pathname:"/products/sneakers",store_currency:"EUR",store_timezone:"Europe/Berlin",keys:["app:3f9c2e1a-7b4d-4c8e-9a1f-2d6b8e0c4a7f","cus:gid://shopify/Customer/7234567890123"],parameters:"?utm_source=facebook&utm_campaign=autumn&fbclid=IwAR2xYz...",properties:{_fbc:"fb.1.1727600000000.IwAR2xYz...",platform:"ios",app_version:"3.4.0"}},null,2)})}),(0,r.jsx)(o,{title:'Example: "add_to_cart"',children:(0,r.jsx)(l,{children:JSON.stringify({store_id:123456,is_s2s:!0,ip:"185.32.100.42",event_type:"event",name:"add_to_cart",hostname:"app.myshop.com",pathname:"/products/sneakers",store_currency:"EUR",store_timezone:"Europe/Berlin",keys:["app:3f9c2e1a-7b4d-4c8e-9a1f-2d6b8e0c4a7f"],properties:{_fbc:"fb.1.1727600000000.IwAR2xYz..."}},null,2)})}),(0,r.jsx)(o,{title:'Example: "purchase"',children:(0,r.jsx)(l,{children:JSON.stringify({store_id:123456,is_s2s:!0,ip:"185.32.100.42",event_type:"conversion",name:"purchase",hostname:"app.myshop.com",pathname:"/checkout/thank-you",store_currency:"EUR",store_timezone:"Europe/Berlin",keys:["app:3f9c2e1a-7b4d-4c8e-9a1f-2d6b8e0c4a7f","cus:gid://shopify/Customer/7234567890123"],transaction_id:"6123456789012",transaction_currency:"EUR",transaction_gross_revenue:9900,customer_id:"[email protected]",transaction_items:[{transaction_item_id:"SKU-001",transaction_item_name:"Sneaker",transaction_item_price:4950,transaction_item_quantity:2}],properties:{_fbc:"fb.1.1727600000000.IwAR2xYz..."}},null,2)})}),(0,r.jsx)(o,{title:"Hashing",children:(0,r.jsx)(d,{headers:["Field","What happens"],rows:[["keys","Hashed server-side (SHA-256); the first 4 characters stay readable. Send plain text"],["customer_id","Lower-cased, whitespace removed, then hashed (SHA-256). Plain text, or a SHA-256 hex of that normalised value"],["transaction_id","Stored as sent. Plain text is recommended: only a plain ID picks up the order totals from your shop sync and is deduplicated against the browser pixel. A SHA-256 hex of the plain ID is accepted and still recognised as the same order, but the event's own revenue is used"],["ip","Used for matching and forwarded to ad platforms as the customer's IP"]]})}),(0,r.jsx)(o,{title:"Responses and Retries",children:(0,r.jsx)(d,{headers:["Status","Meaning","What to do"],rows:[["200","Event accepted","—"],["400 Transaction ID already exists","This order was already reported","Treat as success, do not retry"],["400 (any other message)","Validation error, e.g. a missing required field","Fix the payload; retrying the same request will fail again"],["429 / 502 / 503 / 504","Rejected before processing","Retry with backoff"],["500 / timeout","May already have been stored","Do not retry events — only purchases are deduplicated (by transaction_id), every other event would be counted twice"]]})}),(0,r.jsx)(o,{title:"Consent",children:(0,r.jsx)("p",{style:{fontSize:14},children:"Adverfly does not check consent server-side; sending an event means you have the legal basis for it. Apply the same rule as for your website tracking. Click IDs and anything that is forwarded to ad platforms typically require marketing consent."})}),(0,r.jsx)("p",{style:{marginTop:48,color:"#999",fontSize:13,textAlign:"center"},children:"Need help? Contact us at [email protected]"})]})]})}function o(e){let{title:t,children:n}=e;return(0,r.jsxs)("div",{style:{marginBottom:36},children:[(0,r.jsx)("h2",{style:{fontSize:18,fontWeight:600,marginBottom:12,paddingBottom:8,borderBottom:"1px solid #e5e5e5"},children:t}),(0,r.jsx)("div",{children:n})]})}function d(e){let{headers:t,rows:n}=e;return(0,r.jsx)("div",{style:{overflowX:"auto"},children:(0,r.jsxs)("table",{style:{width:"100%",borderCollapse:"collapse",marginTop:8,fontSize:14},children:[(0,r.jsx)("thead",{children:(0,r.jsx)("tr",{style:{borderBottom:"2px s
1olid #e5e5e5",textAlign:"left"},children:t.map((e,t)=>(0,r.jsx)("th",{style:{padding:"8px 12px",fontWeight:600},children:e},t))})}),(0,r.jsx)("tbody",{children:n.map((e,t)=>(0,r.jsx)("tr",{style:{borderBottom:"1px solid #f0f0f0"},children:e.map((e,t)=>(0,r.jsx)("td",{style:{padding:"8px 12px",color:0===t?"#1a1a1a":"#555",fontWeight:0===t?500:400},children:0===t?(0,r.jsx)(c,{children:e}):e},t))},t))})]})})}function l(e){let{children:t}=e;return(0,r.jsx)("pre",{style:{background:"#1a1a1a",color:"#e5e5e5",padding:"16px 20px",borderRadius:8,fontSize:13,fontFamily:"'SF Mono', 'Fira Code', monospace",overflowX:"auto",marginTop:8,lineHeight:1.5,whiteSpace:"pre-wrap",wordBreak:"break-word"},children:t})}function c(e){let{children:t}=e;return(0,r.jsx)("code",{style:{background:"#f5f5f5",padding:"2px 6px",borderRadius:4,fontSize:13,fontFamily:"'SF Mono', 'Fira Code', monospace"},children:t})}function p(e){let{type:t,children:n}=e,i={warning:{bg:"#fef9e7",border:"#f0d000",icon:"⚠"},info:{bg:"#eef6ff",border:"#3b82f6",icon:"ℹ"}}[t];return(0,r.jsxs)("div",{style:{marginTop:12,padding:"12px 16px",background:i.bg,borderLeft:"3px solid ".concat(i.border),borderRadius:"0 6px 6px 0",fontSize:14},children:[(0,r.jsx)("span",{style:{marginRight:6},children:i.icon}),n]})}}},function(e){e.O(0,[2888,9774,179],function(){return e(e.s=19726)}),_N_E=e.O()}]);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.