Lustr's paid channel runs on Instagram and Facebook. I own it end to end — the Meta Pixel and Conversions API integration that makes the data trustworthy, the creative that goes into the ads, the targeting and budget decisions in Meta Ads Manager, and the ROAS review that tells me which ads to kill and which to scale. The attribution infrastructure is what makes the rest possible: without server-side events, Meta's optimizer is flying blind on roughly a third of real conversions.
What it's built with.
Attribution
- Meta Pixel (browser-side)
- Meta Conversions API (server-side)
- Event Deduplication
- Stripe Webhook Integration
Paid Acquisition
- Meta Ads Manager
- Conversion-Objective Campaigns
- Custom & Lookalike Audiences
- ROAS Analysis
Privacy
- SHA-256 PII Hashing
- iOS ATT / Ad Blocker Resilience
The non-code parts.
How it works.
Why server-side CAPI, not just the Pixel
A browser-only pixel made sense in 2019. In 2026 it loses roughly 30–40% of real conversions before they ever reach Meta Events Manager: ad blockers strip the script, iOS App Tracking Transparency defaults to opt-out, and strict browsers block third-party requests. The result is that Meta's optimizer sees a deliberately degraded view of what's actually working and calibrates campaigns against phantom signals.
The Conversions API path fixes this at the source. The CAPI call fires from the Stripe payment webhook on the server — it never touches the customer's browser, so it's invisible to every client-side blocker. By the time the webhook fires, the purchase is a confirmed fact in the database, not a speculative client-side event. The two paths (Pixel + CAPI) report the same six events; Meta deduplicates via a shared event_id so no conversion is double-counted. The net effect is that the event feed Meta receives reflects what actually happened, not a filtered fraction of it.
Event taxonomy
Six events flow into Meta Events Manager. PageView fires on every page load and SPA route change — this is the baseline audience signal for retargeting. Lead fires when a contact form is submitted; CompleteRegistration fires when a new account clears email verification. The three heavier events: Schedule fires when a booking hold is confirmed (both Pixel and CAPI), Purchase fires when a Stripe checkout.session.completed webhook lands (both paths), and Subscribe fires when a membership activates (both paths).
The Pixel and CAPI paths fire the same event_name and the same event_id for Schedule, Purchase, and Subscribe — the shared ID is what lets Meta's deduplication logic collapse the two into one signal. The lighter events (PageView, Lead, CompleteRegistration) are Pixel-only; their success states are unambiguous on the client side and don't need the server path.
Campaigns and what the data enables
With a reliable conversion feed in place the campaign toolkit changes. Conversion-objective campaigns become viable — Meta's algorithm can hunt for people who look like recent Purchasers and Subscribers instead of just anyone who clicks on an ad. Retargeting Custom Audiences let me target real funnel exits: viewed the booking page but didn't book, started a contact form but didn't submit, booked once and went quiet. Lookalike Audiences seeded from the actual paying-customer list find new prospects who pattern-match against the existing book, geographically constrained to Edmonton and area.
Per-ad ROAS reporting closes the loop. Every campaign in Ads Manager shows cost per booking, cost per signup, and return on ad spend — attributed to specific creatives and audience sets. Killing underperforming ads becomes arithmetic, not intuition. And the brief for the next round of Figma creative is informed by which previous ad actually drove revenue.
Creative production and media buying are both mine. Ad assets are built in the same Figma library as print collateral, so the brand reads consistently whether a customer sees a promo flyer in their mailbox or a sponsored post in their feed.
The things I'm proudest of.
- ▹Built a dual-path attribution stack: browser-side Meta Pixel fires on every page and SPA route change, plus a server-side Conversions API call fires from the Stripe webhook after payment clears. Both report the same events with a shared deduplication ID so each conversion counts exactly once in Meta Events Manager.
- ▹Six events instrumented: PageView, Lead (contact form), CompleteRegistration (verified signup), Schedule (booking confirmed), Purchase (Stripe payment), Subscribe (membership activated). The three revenue events fire on both the Pixel and CAPI paths; the others are Pixel-only because their success states are fully confirmable client-side.
- ▹Server-side CAPI runs from the payment webhook, not the browser — it bypasses ad blockers, iOS App Tracking Transparency, and strict-mode browsers entirely. Pixel-only setups lose 30–40% of conversions in 2026; CAPI recovers them and gives Meta's optimizer an accurate signal to train against.
- ▹Own every Meta ad campaign on Instagram and Facebook end to end: Figma creative → Meta Business Manager → audience and budget → post-campaign ROAS review. Active campaigns run on a conversion objective, targeting Edmonton and area. Retargeting Custom Audiences catch warm funnel exits; Lookalike Audiences seeded from the real paying-customer list extend reach to new high-match prospects.
- ▹Customer privacy preserved: email and phone are SHA-256 hashed before transmission to Meta. Privacy policy updated to disclose Pixel and CAPI usage with opt-out controls.