Capture offline deals
How to send phone, email, and in-person deals as offline conversions to your ad platforms.
What is this about?
Many B2B and high-ticket stores close a large share of their revenue outside the Shopify checkout — via phone, email, or in-person meetings. Offline-deal tracking lets you capture these deals manually. ShopiPixel matches them against click IDs from up to 90 days of prior visits and reports them as offline conversions to Meta, Google Ads, Microsoft Ads, and more — so your campaign ROAS reflects the complete pipeline.
Prerequisites
- Enterprise plan: Offline-deal tracking is exclusively included in the Enterprise plan.
- At least one enabled ad platform: Meta, Google Ads, Microsoft Ads, TikTok, LinkedIn, Pinterest, Snapchat, Klaviyo, or Custom Webhook (GA4 is not supported).
- Active Web Pixel: Only if the Web Pixel runs in your theme can click IDs and lead submits be captured — both are required for later matching.
- Marketing consent in the shop: Per TDDDG § 25 the Web Pixel may only operate with
marketingAllowed=true(Shopify Customer Privacy). Without consent, neither click IDs nor LeadCaptures are stored.
Capture a deal
Open the app under Offline Deals (/app/deals) and click "Capture new deal". The form requires at least one identifier (email or phone), a value, and a close date.
Form fields at a glance:
- email and phone — at least one must be set. Both are normalized and SHA256-hashed for click-ID and LeadCapture matching.
- value (number) and currency (ISO-4217 code such as EUR, USD, CHF) — required so the platform can attribute revenue.
- dealClosedAt (ISO date) — time of deal closure. Checked against the per-platform lookback window.
- source (dropdown: Phone, Email, In-Person, Referral, Other) — used for internal reporting, not sent to the platforms.
- notes (free text, optional) — for your internal documentation only. Please do not include third-party personal data (Art. 5(1)(c) GDPR, data minimization).
You can find a screenshot of the form on the Features page.
Understanding match feedback
After saving, ShopiPixel shows a result icon per platform so you immediately see where the deal was accepted and where not.
- ✓ sent: Successfully sent to the platform API.
- ⚠ skipped_too_old:
dealClosedAtis outside the platform-specific lookback window. - ○ not_configured: The platform is not connected or not enabled.
- ✗ error: Temporary failure — retry is running automatically (BullMQ queue, up to 5 attempts).
- ⏳ pending: Dispatch currently running, result will update shortly.
Per-platform lookback windows
Each platform defines how far back it accepts offline conversions. ShopiPixel blocks all deals outside this window before sending — you will see <code>skipped_too_old</code>.
| Platform | Lookback window |
|---|---|
| Meta CAPI | 7-day hard limit |
| Google Ads | 90 days (UploadClickConversions + UploadCallConversions) |
| Microsoft Ads | 30 days (default goal window; configurable per shop goal up to 90 days) |
| TikTok | 180 days (Offline Event Sets) |
| 90-day hard limit | |
| 90 days (conservative; no explicitly documented limit) | |
| Snapchat | 7-day hard limit |
| Klaviyo | 365 days (Events API accepts ~1 year) |
| Custom Webhook | unlimited (customer-controlled) |
| Google Analytics 4 | not supported (Measurement Protocol is online-first; GA4 is skipped automatically) |
Common questions
- "Meta did not receive my deal." Check the 7-day limit. Meta CAPI rejects anything older. Alternative: Google Ads (90 days) or LinkedIn (90 days).
- "No match even though an email exists." For a deal to be attributed to a campaign, the platform needs either a click ID (gclid, fbclid, msclkid etc.) or a previous consent-based lead. ShopiPixel stores lead emails in the LeadCapture table for 90 days — only if the Web Pixel saw a
form_submittedevent with the same email within that window does matching succeed. - "Credential invalid." The refresh token of an OAuth platform (Google Ads, Microsoft Ads) has expired or was revoked. Open Settings > Tracking, click "Reconnect", and authorize again.
- "Platform shows 'not_configured'." The platform is either not enabled or has no credentials saved. Enable it in the tracking settings and save credentials.
Form-field naming tips (for automatic lead capture)
For the Web Pixel to automatically create LeadCapture entries for later matching, the email field must use one of the following names:
<input name="email" ...><input id="email" ...>
Other field names (such as contact-email, your_email) are not recognized by the Web Pixel — this is a restriction of the Shopify Web-Pixel sandbox. Adjust your form or capture leads manually via the app.
With offline-deal tracking the shop owner remains the controller as defined by Art. 4(7) GDPR. The legal basis for transmission to ad platforms is typically Art. 6(1)(f) GDPR (legitimate interest in effective marketing) — a complete privacy policy and, where necessary, a legitimate-interest assessment is required. Details on processing scope, sub-processors, and data-subject rights are in the privacy policy.