Ad platform
The Snapchat Conversions API accepts events long after the swipe, which is the only way a deal your sales team closed in week five reaches the ad account that produced it. Attribi records the Snapchat click ID on landing, keeps it attached to the lead, and sends a SIGN_UP event when the lead arrives and a PURCHASE event with the deal value when it closes. It runs server side, so no browser has to be alive for the conversion to count.
No credit card required · 5-minute setup
Events are sent from Attribi to Snapchat, not from the browser. The closed-won event carries the deal value and currency your CRM recorded, so Snapchat reporting can show revenue rather than lead counts.
Attribi sets the mapping, so nothing has to be configured. Worth knowing before you plan reporting: Snapchat has no distinct qualified event, so form fills and qualified leads both arrive as SIGN_UP. Closed won is the one that arrives separately, as PURCHASE with a value.
Email and phone are SHA-256 hashed before they leave Attribi, so Snapchat can match a person even when the click ID never reached your CRM record.
Cost, clicks, and impressions land daily from your Snapchat ad account, so closed revenue is compared with the spend that generated it instead of a manual estimate.
The Snapchat click identifier ScCid is captured on the landing page and stored with the visitor, so it is still available when the deal closes weeks later.
Authorize Snapchat from the Connections page and pick the ad account. Attribi handles the Conversions API credentials, so there is no token to generate or store yourself.
Snapchat registers a standard event the first time it receives one, so Attribi activates each stage by sending a single synthetic event with a hashed dummy email. Expect to see SIGN_UP and PURCHASE appear on the Snapchat side, and remember SIGN_UP covers two of the three stages.
After that, your CRM is the trigger. Qualifying a lead sends its SIGN_UP event and closing the deal sends PURCHASE with the revenue attached. Nobody has to export a conversions file again.
This article is about the wire: the exact fields, and the one clock Snapchat runs that no other platform does.
Attribi sends two events to the Snapchat Conversions API: SIGN_UP when a lead arrives or is qualified, and PURCHASE with the deal value when it closes. Each carries the ScCid click ID when the landing page had one, plus SHA-256 hashed email and phone. Snapchat accepts events up to seven days old, so timing matters here more than anywhere else.
The Snapchat Conversions API is Snapchat's server-side endpoint for conversion events: a JSON array posted to https://tr.snapchat.com/v3/{pixel_id}/events, authenticated by an access token in the query string, each event naming a standard event, a time, an identifier, an action source and the match keys for one person (verified 2026-10-12 on Snapchat's Using the API page). Attribi builds one event per stage transition and sends it from its own servers. The table lists every field it fills, read from lib/snapchat-conversions.ts and lib/snapchat-lead-push.ts on 2026-10-12.
| Field | Lead (form submit) | Qualified | Closed won |
|---|---|---|---|
event_name | SIGN_UP | SIGN_UP | PURCHASE |
event_time | time of the submit | the qualified timestamp | closed_won_at from your CRM |
event_id | mta-lead-{visitor_id}-{unix time} | mta-qualified-{lead id} | mta-closed_won-{lead id} |
action_source | WEB | WEB | OFFLINE |
event_source_url | first landing page in the journey | not sent | not sent |
user_data.sc_click_id | ScCid, if captured | same | same |
user_data.em | SHA-256 of the trimmed, lowercased email | same | same |
user_data.ph | SHA-256 of the phone digits | same | same |
user_data.client_ip_address and client_user_agent | from the submit request | not sent | not sent |
custom_data.value | 0 | the qualified value, 0 if none | the closed-won value |
custom_data.currency | USD | the CRM currency, USD if blank | the CRM currency, USD if blank |
custom_data.content_category | not sent | qualified_lead | not sent |
The qualified and closed-won events never carry event_source_url, because they report something that happened in your CRM, not on a page. The lead event sends IP and user agent because it fires inside the form request. And content_category is the only thing separating a qualified SIGN_UP from a plain one; Ads Manager does not show it as a column.
When someone swipes up on a Snapchat ad, Snapchat appends &ScCid= to the destination URL. Snapchat's Conversions API guide calls that value the Click ID and accepts it in the sc_click_id field, or extracts it itself from a full event_source_url (verified 2026-10-12).
Attribi's tracker does no URL parsing in the browser. It sends the full landing URL to /api/track, and the server resolves the click ID from an ordered list of eleven parameters in lib/click-id-platforms.ts. ScCid is the eighth entry, stored on the touchpoint with click_id_platform = 'snapchat'.
From there the value rides inside the lead's touchpoint snapshot. When the deal closes weeks later, the upload library takes the first touchpoint whose platform is snapchat, not the first click overall, so a Google-then-Snapchat visitor still gets the Snapchat ID on the Snapchat event.
One checkable error on several integration pages elsewhere: there is no _scclid cookie in Snapchat's documentation. The Snap Pixel's cookie is _scid, which the Conversions API accepts in a separate sc_cookie1 field that Attribi does not send (verified 2026-10-12, same page). Its match rests on sc_click_id, em and ph. Without Attribi's script, the click ID can still arrive through your CRM, in a hidden form field writing mta_clickid and mta_clickid_type = ScCid; the pixel-less attribution page covers that.
Snapchat's parameter reference lists its standard events (verified 2026-10-12): PURCHASE, SAVE, START_CHECKOUT, ADD_CART, VIEW_CONTENT, ADD_BILLING, SIGN_UP, SEARCH, PAGE_VIEW, SUBSCRIBE, AD_CLICK, AD_VIEW, COMPLETE_TUTORIAL, LEVEL_COMPLETE, INVITE, LOGIN, SHARE, RESERVE, ACHIEVEMENT_UNLOCKED, ADD_TO_WISHLIST, SPENT_CREDITS, RATE, START_TRIAL, LIST_VIEW, APP_INSTALL, APP_OPEN, and CUSTOM_EVENT_1 through CUSTOM_EVENT_5. There is no LEAD. Snapchat's nearest standard event for an enquiry is SIGN_UP, and that is what Attribi uses.
So a viewing request, a brochure download and a sales-qualified enquiry all arrive as SIGN_UP. Attribi does not use the CUSTOM_EVENT slots for the qualified stage; the mapping is hardcoded, not a picker. Today it is SIGN_UP twice, PURCHASE once, reported by Snapchat as conversion_sign_ups and conversion_purchases.
Both, but you only type one. The Pixel ID is the required field in the Snapchat modal on the Connections page; it goes into the URL of every event, and the Activate button refuses to run without it. The token comes from OAuth: the connect flow asks for the snapchat-marketing-api and snapchat-offline-conversions-api scopes, and the tokens are stored encrypted.
Snapchat offers a second route that Attribi does not use: a static Conversions API token from the Business Details page of Ads Manager, which Snapchat's Get Started page says does not expire (verified 2026-10-12). Attribi's OAuth access token, per Snapchat's authentication reference, lives 3,600 seconds (verified 2026-10-12); Attribi refreshes it during the daily spend fetch and runs a refresh job for tokens near expiry. An authorisation error on a lead's Snapchat tile means reconnect from the Connections page.
Snapchat deduplicates on the event identifier within a 48-hour window: the Pixel's client_dedup_id must equal the Conversions API's event_id, and the event names must match. For PURCHASE there is a second, 30-day fallback on the Pixel's transaction_id against the API's order_id (verified 2026-10-12 on Snapchat's deduplication page).
Attribi's qualified and closed-won events use deterministic IDs, mta-qualified-{lead id} and mta-closed_won-{lead id}, so a retry of the same stage for the same lead is the same event to Snapchat. The lead event's ID includes a timestamp, so a repeat form submit is a new event on both sides.
What Attribi cannot do is deduplicate against a SIGN_UP your own Snap Pixel fires on the thank-you page, because it never sees your client_dedup_id. If your Pixel already tracks the form as SIGN_UP, you have two SIGN_UPs per enquiry; drop the Pixel's, or read the Attribi-side counts as the deduplicated truth. PURCHASE has no Pixel twin, so it is never double counted.
Snapchat's measurement reference states the defaults as 28 days post-swipe and 2 days post-view for engaged views (verified 2026-10-12). The options are swipe_up_attribution_window of 1, 7 or 28 days and view_attribution_window of none, 1 hour, 3 hours, 6 hours, 1 day, 7 days or 28 days; a 28-day view window needs a 28-day swipe window. The Business Help article on windows did not render for re-verification on 2026-10-12; the API reference is the source here.
The window is the lookback from the conversion to the ad interaction. The clock that bites is different: Snapchat's parameter reference says event_time cannot be more than 7 days in the past, while its Conversions API introduction says 37 days (both read 2026-10-12). Treat 7 as the operating bound. Attribi sets event_time to the moment your CRM recorded the close, and a CRM pull runs on a schedule, so a deal a sales rep backdates can be older than seven days by the time it uploads. Attribi records whatever Snapchat answers; an event Snapchat accepts and later discards as too old shows as uploaded in Attribi and as nothing in Ads Manager.
A 90-day sales cycle is fine as long as each stage uploads within a week of happening; a close on day 40 after the swipe is matched by Attribi but not credited by Snapchat under the 28-day default. The guide to how platforms count conversions differently sets Google's and Meta's windows beside it.
Yes. lib/snapchat-spend.ts calls GET https://adsapi.snapchat.com/v1/adaccounts/{ad_account_id}/stats with granularity=DAY and fields=impressions,swipes,spend, divides spend by 1,000,000 to turn Snapchat's micro-currency into currency units, and upserts one row per day into ad_spend_daily with platform = 'snapchat_ads'. Snapchat's "swipes" land in Attribi's clicks column, in the ad account's currency.
The grain is the whole ad account per day; campaign_id, adgroup_id and ad_id are null, so Attribi's spend screens show Snapchat as one line. Snapchat's measurement reference says the ad-account stats entity guarantees only the spend metric, so impressions and swipes may come back empty and are stored as zero when they do, and that daily metrics are finalised 48 hours after the day ends in the ad account's timezone (verified 2026-10-12), which is why the newest two days can move after the daily fetch.
Every number in this section is illustrative; there is no client behind it. A Dubai developer runs a Snapchat campaign for an off-plan launch at 20,000 AED a week, UAE-wide, 18 to 34. Over four weeks it produces 3,200 swipes and 410 enquiry forms, so 410 SIGN_UP events with value: 0. Attribi matches 388 on sc_click_id; the rest match on hashed phone only.
Sales qualifies 61 over the next three weeks, each a second SIGN_UP with content_category: qualified_lead, so Ads Manager shows 471 sign-ups while Attribi shows 410 leads and 61 qualified. Nine deals close in weeks five to nine at an average 1.4 million AED, each a PURCHASE with value and currency: AED. Snapchat's 28-day swipe window credits the six whose swipe fell inside it; Attribi shows all nine against the 80,000 AED spent, because it reads the CRM, not the window.
The phone detail matters. Say seven of the 22 phone-only matches were typed as 050 123 4567. Attribi hashes digits as typed, so those go out as 0501234567, while Snapchat's parameter reference wants the country code with the leading zero removed, 971501234567 (verified 2026-10-12). They cannot match. That is gap G77 in Attribi's open items: collect phones in international format, +971 50 123 4567, and the hash is right on every platform.
content_category differs, and Ads Manager does not split on it. Qualified counts live in Attribi.action_source WEB and no event_source_url, a field Snapchat marks required for website events. A rejected qualified SIGN_UP shows as an error on the lead's Snapchat tile; the closed-won PURCHASE is unaffected.mta_clickid field or the match falls back to email and phone.sc_cookie1, no lead_id, no Snapchat Lead Generation form ingestion.Does Snapchat accept a conversion for a deal that closed three weeks ago? Not reliably. The parameter reference puts the limit at seven days in the past, the introduction page at 37; Attribi sends the CRM's close time, so a backdated close is the case to watch. Within a week of the real transition, the event is inside the stricter bound.
Why does the first SIGN_UP carry a value of zero? Because nothing is known yet. Snapchat requires value and currency on PURCHASE and accepts them on other events; Attribi sends 0 and USD on the lead event so the field is present and never invented. The real value arrives on PURCHASE in your CRM's currency.
Will Attribi's SIGN_UP double count with the one my Snap Pixel fires? It can. Snapchat deduplicates only when the Pixel's client_dedup_id equals the API's event_id within 48 hours, and Attribi has no way to know your Pixel's ID. Stop the Pixel's SIGN_UP on the thank-you page if you want Ads Manager to show one event per enquiry.
Do I need to generate a Conversions API token in Business Details? No. Attribi authorises through Snapchat OAuth with the offline-conversions scope and refreshes its own token. The static token is for direct integrations that would otherwise run the OAuth flow themselves.
Why does the Snapchat spend show no campaign names? Attribi requests account-level daily stats, which Snapchat returns without a campaign dimension. Per-campaign spend would need per-campaign stats calls, which this integration does not make today.
Can Attribi read enquiries from a Snapchat Lead Generation form? No. Those leads carry a Snapchat lead_id and never touch a landing page, so there is no ScCid and no form submit to capture. Point the ad at a page with your form on it instead.
Snapchat will take your CRM outcomes, but it holds you to a seven-day clock and a two-event vocabulary, and it cannot match a phone typed without its country code. Fix the phone format on your forms first. Then connect Snapchat, paste the Pixel ID, press Activate, and send one real enquiry through a tracked page. If the lead shows sc_click_id as its match method, the rest follows from your CRM. Every new workspace starts with 30 days on the Pro plan, no card required, so the first PURCHASE can land before you choose a plan.
Stages Attribi supports for Snapchat Ads.
Ad platform
Send offline conversions from your CRM to the TikTok Events API: form fills, qualified leads, and closed deals with revenue, matched by ttclid or hashed email.
Ad platform
Meta Conversions API for CRM: send qualified leads and closed-won revenue from your CRM to Meta server side, with hashed email, phone, and Instant Form lead IDs.
Data source
Shopify multi-touch attribution: paid orders reach Attribi straight from your store with their real total, then upload to your ad platforms as revenue.
SIGN_UP for a form fill and for a qualified lead, and PURCHASE with the deal value and currency when the deal is closed won. Snapchat does not offer a separate mid-funnel event, so the first two stages share SIGN_UP and are distinguished by the data Attribi attaches, not by the event name you see in Snapchat Ads Manager.
No, and this is worth knowing before you build reporting around it. Form fills and qualified leads both arrive as SIGN_UP, so Snapchat counts them together. The stage-by-stage split, including how many form fills a campaign turned into qualified leads, is visible in Attribi. What Snapchat sees separately is the closed-won PURCHASE event with its revenue.
The conversion is still uploaded using hashed email and phone from your CRM record. Snapchat matches on those identifiers when no click ID is present. Matching is less precise than with a click ID, which applies to every offline upload on every platform.
Yes, daily. Cost, clicks, and impressions are pulled from your Snapchat ad account and stored per campaign and day, so return on ad spend is calculated against real spend for the days the revenue was booked.
Not for the CRM-driven events. Attribi sends those server side through the Conversions API from its own infrastructure. What Attribi does need on the site is its own tracking script, which is what captures ScCid and the rest of the visit history. Without it there is no ScCid, so matching relies on hashed email and phone from your CRM, and qualified plus closed-won outcomes are the ones that upload.
No. Attribi has no Power BI or BigQuery connector and no public API, so a live Snapchat Ads feed into a warehouse or BI tool needs a reporting connector built for that. What Attribi offers is a CSV download from the Reports and Leads pages, and the reverse direction: CRM outcomes sent back into Snapchat through the Conversions API.
Updated
Sign up and connect it from the Connections page.
Start FreeNo credit card · Free up to 500 visitors a month