{"_id":"@amboras-dev/google-ads","_rev":"4-b26c8890d3186422972a90b5f2c302b7","name":"@amboras-dev/google-ads","dist-tags":{"latest":"1.1.3"},"versions":{"1.1.0":{"name":"@amboras-dev/google-ads","version":"1.1.0","_id":"@amboras-dev/google-ads@1.1.0","maintainers":[{"name":"amboras-vaibhav","email":"vaibhav@amboras.com"},{"name":"azaanatamboras","email":"azaan@amboras.com"},{"name":"syazah","email":"thesyazah@gmail.com"}],"dist":{"shasum":"b5819d2df4731329c506b5ed823da61cb9cdc48b","tarball":"https://registry.npmjs.org/@amboras-dev/google-ads/-/google-ads-1.1.0.tgz","fileCount":14,"integrity":"sha512-/YMpo8JbW8jm51cgSRW05AyyYLF/2BJFv+lODaFgfoGa5s0eSH99NOSuSPFp/bzKQ3itk+ZNA0ocXhum1j0Qag==","signatures":[{"sig":"MEQCIH7CFAsJBqqNqyCKdBB395cnoNndNCu8MCdNkTsJe/cUAiBGQpg9ho1+8TGcuSkp79haaJtWSUgaT4fA4AmsFM72Lg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":127285},"main":"dist/index.js","_from":"file:amboras-dev-google-ads-1.1.0.tgz","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./package.json":"./package.json","./slot-components":{"types":"./dist/slot-components/index.d.ts","import":"./dist/slot-components/index.mjs","require":"./dist/slot-components/index.js"}},"scripts":{"build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"syazah","email":"thesyazah@gmail.com"},"_resolved":"/tmp/ed0811fe65dcaa983adb730a6ced6c04/amboras-dev-google-ads-1.1.0.tgz","_integrity":"sha512-/YMpo8JbW8jm51cgSRW05AyyYLF/2BJFv+lODaFgfoGa5s0eSH99NOSuSPFp/bzKQ3itk+ZNA0ocXhum1j0Qag==","_npmVersion":"10.8.2","description":"Google Ads (gtag.js conversion tracking + Enhanced Conversions + Consent Mode) hooks for Amboras storefronts","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.0.0","@types/node":"^20.0.0","@types/react":"^18.0.0"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/google-ads_1.1.0_1782279030908_0.27264177354325847","host":"s3://npm-registry-packages-npm-production"}},"1.1.1":{"name":"@amboras-dev/google-ads","version":"1.1.1","_id":"@amboras-dev/google-ads@1.1.1","maintainers":[{"name":"amboras-vaibhav","email":"vaibhav@amboras.com"},{"name":"azaanatamboras","email":"azaan@amboras.com"},{"name":"syazah","email":"thesyazah@gmail.com"}],"dist":{"shasum":"8033dcd09e391b7c78b1b99ef4d8d0bdfacbe51c","tarball":"https://registry.npmjs.org/@amboras-dev/google-ads/-/google-ads-1.1.1.tgz","fileCount":14,"integrity":"sha512-ZJghR1a1xmhtH4wEtXKqV79+TXuva7LWfR/PhKhemfPd+2wV8Qlmu64kCMvwHuAxA/XRgd1STix2TISTyNvnUg==","signatures":[{"sig":"MEYCIQCrimYIJJCLVQTCeJYvQ5wq+MucC3rk/Y84WPHg+j6E5gIhAM0spaI7Lkl/rQZ/xG/cBruzcIoembwDyHfo+c+JdOO7","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":127569},"main":"dist/index.js","_from":"file:amboras-dev-google-ads-1.1.1.tgz","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./package.json":"./package.json","./slot-components":{"types":"./dist/slot-components/index.d.ts","import":"./dist/slot-components/index.mjs","require":"./dist/slot-components/index.js"}},"scripts":{"build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"syazah","email":"thesyazah@gmail.com"},"_resolved":"/tmp/08d64a96b2fcf076959469d3da6508a2/amboras-dev-google-ads-1.1.1.tgz","_integrity":"sha512-ZJghR1a1xmhtH4wEtXKqV79+TXuva7LWfR/PhKhemfPd+2wV8Qlmu64kCMvwHuAxA/XRgd1STix2TISTyNvnUg==","_npmVersion":"10.8.2","description":"Google Ads (gtag.js conversion tracking + Enhanced Conversions + Consent Mode) hooks for Amboras storefronts","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.0.0","@types/node":"^20.0.0","@types/react":"^18.0.0"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/google-ads_1.1.1_1782322923959_0.8907814781619985","host":"s3://npm-registry-packages-npm-production"}},"1.1.2":{"name":"@amboras-dev/google-ads","version":"1.1.2","_id":"@amboras-dev/google-ads@1.1.2","maintainers":[{"name":"amboras-vaibhav","email":"vaibhav@amboras.com"},{"name":"azaanatamboras","email":"azaan@amboras.com"},{"name":"syazah","email":"thesyazah@gmail.com"}],"dist":{"shasum":"e97630887db4bfab943b9111f77a5d9bf2814aca","tarball":"https://registry.npmjs.org/@amboras-dev/google-ads/-/google-ads-1.1.2.tgz","fileCount":14,"integrity":"sha512-yKd9XTJkI+mIJlEDtft6lV6HWsDF5blb8eHzPxzx7C3gBp3pcsrxh/rcGXVjhtcZv7zXYXQajg3wXwEHt/GuaQ==","signatures":[{"sig":"MEQCIBL8+XV3/jpQjlQaBzLt8g86AhpQUyQMKoGkLilnGSj0AiBOoGNLV5+Aw/b3MtNmlo5NG4csz7PUD5+Lp+13YYat3Q==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":128305},"main":"dist/index.js","_from":"file:amboras-dev-google-ads-1.1.2.tgz","types":"dist/index.d.ts","module":"dist/index.mjs","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./package.json":"./package.json","./slot-components":{"types":"./dist/slot-components/index.d.ts","import":"./dist/slot-components/index.mjs","require":"./dist/slot-components/index.js"}},"scripts":{"build":"tsup","typecheck":"tsc --noEmit"},"_npmUser":{"name":"syazah","email":"thesyazah@gmail.com"},"_resolved":"/tmp/0b74c0116930268eea2094848c72ba26/amboras-dev-google-ads-1.1.2.tgz","_integrity":"sha512-yKd9XTJkI+mIJlEDtft6lV6HWsDF5blb8eHzPxzx7C3gBp3pcsrxh/rcGXVjhtcZv7zXYXQajg3wXwEHt/GuaQ==","_npmVersion":"10.8.2","description":"Google Ads (gtag.js conversion tracking + Enhanced Conversions + Consent Mode) hooks for Amboras storefronts","directories":{},"_nodeVersion":"20.20.2","publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"tsup":"^8.0.0","typescript":"^5.0.0","@types/node":"^20.0.0","@types/react":"^18.0.0"},"peerDependencies":{"react":">=18"},"_npmOperationalInternal":{"tmp":"tmp/google-ads_1.1.2_1782371913902_0.3879411741740355","host":"s3://npm-registry-packages-npm-production"}},"1.1.3":{"name":"@amboras-dev/google-ads","version":"1.1.3","description":"Google Ads (gtag.js conversion tracking + Enhanced Conversions + Consent Mode) hooks for Amboras storefronts","main":"dist/index.js","module":"dist/index.mjs","types":"dist/index.d.ts","exports":{".":{"types":"./dist/index.d.ts","import":"./dist/index.mjs","require":"./dist/index.js"},"./slot-components":{"types":"./dist/slot-components/index.d.ts","import":"./dist/slot-components/index.mjs","require":"./dist/slot-components/index.js"},"./package.json":"./package.json"},"peerDependencies":{"react":">=18"},"devDependencies":{"tsup":"^8.0.0","typescript":"^5.0.0","@types/react":"^18.0.0","@types/node":"^20.0.0"},"publishConfig":{"access":"public"},"scripts":{"build":"tsup","typecheck":"tsc --noEmit"},"_id":"@amboras-dev/google-ads@1.1.3","_integrity":"sha512-GCLTm/FCKUSMqYQnsjBbwIdvaKxl8wwnwTWD+ROlCPkJOXS/I0rF82gu9xMcj69KR2pcdTS89JMMKmEwQ03log==","_resolved":"/tmp/f0a3abefa6b95b3fad8ffff491966d68/amboras-dev-google-ads-1.1.3.tgz","_from":"file:amboras-dev-google-ads-1.1.3.tgz","_nodeVersion":"20.20.2","_npmVersion":"10.8.2","dist":{"integrity":"sha512-GCLTm/FCKUSMqYQnsjBbwIdvaKxl8wwnwTWD+ROlCPkJOXS/I0rF82gu9xMcj69KR2pcdTS89JMMKmEwQ03log==","shasum":"31ac422dead8cba0afed762a1b91c91db58d7770","tarball":"https://registry.npmjs.org/@amboras-dev/google-ads/-/google-ads-1.1.3.tgz","fileCount":14,"unpackedSize":128693,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIHUMTP0qGwTStlqn4ufyUDkuS8n4b0inwdbgdAil7MkQAiEAk7aK+vmNV3abnmvXtBFQu3QZXBHc1YQ+ESgQ596mhys="}]},"_npmUser":{"name":"syazah","email":"thesyazah@gmail.com"},"directories":{},"maintainers":[{"name":"amboras-vaibhav","email":"vaibhav@amboras.com"},{"name":"azaanatamboras","email":"azaan@amboras.com"},{"name":"syazah","email":"thesyazah@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/google-ads_1.1.3_1785335386557_0.5258347005819368"},"_hasShrinkwrap":false}},"time":{"created":"2026-06-24T05:30:30.792Z","modified":"2026-07-29T14:29:46.929Z","1.1.0":"2026-06-24T05:30:31.060Z","1.1.1":"2026-06-24T17:42:04.100Z","1.1.2":"2026-06-25T07:18:34.044Z","1.1.3":"2026-07-29T14:29:46.697Z"},"description":"Google Ads (gtag.js conversion tracking + Enhanced Conversions + Consent Mode) hooks for Amboras storefronts","maintainers":[{"name":"amboras-vaibhav","email":"vaibhav@amboras.com"},{"name":"azaanatamboras","email":"azaan@amboras.com"},{"name":"syazah","email":"thesyazah@gmail.com"}],"readme":"# @amboras-dev/google-ads\n\nGoogle Ads conversion tracking for Amboras storefronts — the Amboras equivalent of\nthe \"Google Ads Pixel by Nabu\" Shopify app. Fully client-side via Google's tag\n(`gtag.js`): conversion tracking, **Enhanced Conversions**, **Consent Mode v2**,\ndeterministic dedup, and accurate multi-currency conversion values.\n\n## Install\n\n```bash\npnpm add @amboras-dev/google-ads\n```\n\n## What's tracked\n\n| Stage | Event | Slot | Class |\n| --- | --- | --- | --- |\n| Load tag + Consent Mode | `page_view` | `rootProviders` | A (`GoogleAdsProvider`) |\n| Product view | `view_item` | `pdpAnalytics` | A (`GoogleAdsViewItem`) |\n| Add to cart | `add_to_cart` | `cartUpdate` | B (tracker template) |\n| Begin checkout | `begin_checkout` | `checkoutStart` | B (tracker template) |\n| Purchase | `purchase` | `checkoutComplete` | B (tracker template) |\n\nEach conversion fires `gtag('event', 'conversion', { send_to: 'AW-XXXX/<label>', value, currency, transaction_id, items })`.\nThe conversion id and per-action **conversion labels** come from the merchant's\nadmin settings, served by `GET /store/google-ads/config`.\n\n## Architecture\n\n- **`GoogleAdsProvider`** (Class A, `rootProviders`) — self-fetches config, sets\n  Consent Mode v2 from the `amboras_consent` cookie (updates live on\n  `amboras-consent-changed`), loads the AW- tag once (DOM-idempotent), enables\n  Enhanced Conversions, and stashes `{conversionId, labels, enhancedConversions}`\n  on `window.__amborasGoogleAds`.\n- **`GoogleAdsViewItem`** (Class A, `pdpAnalytics`) — fires `view_item`.\n- **Class B trackers** (add-to-cart / begin-checkout / purchase) read real\n  `cart.items` / `order` line items + customer email/phone from local React\n  scope, so values and item ids are correct (the slot context alone only exposes\n  `{cartId,itemCount,total,currency}`).\n\n## Multi-currency\n\nEvery event carries the buyer's real `currency_code` and a value scaled by that\ncurrency's own decimal count via `toMajorUnits(amount, currency)` (Intl-based) —\n**not** a blind `/100`. JPY/KRW (0-decimal) and KWD/BHD (3-decimal) are correct.\n\n## Enhanced Conversions & consent\n\n- First-party data (`email`, `phone_number`) is forwarded raw to\n  `gtag('set','user_data',…)`; Google's tag normalises + SHA-256 hashes it\n  client-side. Nothing sensitive leaves the browser unhashed and no server\n  relay is involved.\n- All conversions are gated on `amboras_consent.analytics`, and Consent Mode v2\n  signals (`ad_storage`, `ad_user_data`, `ad_personalization`,\n  `analytics_storage`) mirror that consent.\n\n## Programmatic API\n\n```ts\nimport { trackPurchase, cartItemsToItems } from '@amboras-dev/google-ads'\n\ntrackPurchase({\n  orderId: order.id,\n  items: cartItemsToItems(order.items, order.currency_code),\n  totalMinor: order.total, // minor units; converted per-currency\n  currency: order.currency_code,\n  email: order.email,\n})\n```\n","readmeFilename":"README.md"}