TODO
Google Ads conversion
Set NEXT_PUBLIC_GOOGLE_CONVERSION_ID and GOOGLE_CONVERSION_LABEL in your deploy env vars. The demo page saves a “demo_engaged” conversion to /api/demo/conversion today; once both env vars are set, the JS path calls gtag('event', 'conversion', { send_to: 'ID/LABEL' }) for real attribution.
NEXT_PUBLIC_GOOGLE_CONVERSION_ID
unset
GOOGLE_CONVERSION_LABEL
aQm0wbedlRKFw+dhr6Gsx9WcBVqzbHkGgmNk304tkrg=
Stub only
Until both env vars are set, conversions land in dataLayer + the DemoConversion table — no Google Ads upload.

Paste this snippet to install the real Google tag

<!-- Paste into src/components/custom/head-content.tsx (next/script)
     and replace the two placeholders with the real values from your
     Google Ads UI → Conversions → New conversion → 'Use Google Tag Manager? No'.
     Until then leave NEXT_PUBLIC_GOOGLE_CONVERSION_ID unset so the stub fires. -->
<script async src="https://www.googletagmanager.com/gtag/js?id=AW-XXXXXXXXX"></script>
<script>
  window.dataLayer = window.dataLayer || [];
  function gtag(){dataLayer.push(arguments);}
  gtag('js', new Date());
  gtag('config', 'AW-XXXXXXXXX');
</script>
<!-- The label aQm0wbedlRKFw+dhr6Gsx9WcBVqzbHkGgmNk304tkrg= is the conversion label printed by Google Ads. -->
Public API tokens
Mint a bearer token to let your team's internal services pull your tracked products from GET /api/v1/watched-products and receive signed webhook deliveries. The raw token AND the per-token HMAC signing secret are each shown once at creation — store both before dismissing the banner.

Your tokens

Webhooks fire regardless of the per-product email mute toggle on/settings/products — they're a separate push channel. Header contract: X-PriceSense-Signature: sha256=<hex>.