How we connected Facebook lead ads to our app (no Zapier)
Posted by
Latest Posts

I'm bootstrapping Sabi with my co-founder Stephen Diaz. This week we're starting paid Facebook ads, and before spending a dollar we wanted to answer one question: which ad produces not just trials, but engaged users and paying customers?
So we built the whole funnel into the app. Someone taps an ad, fills out a Facebook lead form, lands on a connect page, texts Sabi, and every step carries that ad's attribution into our database. No Zapier, no Make, no third-party glue.
Here's the map. I wanted to share it because it's a simple pattern any small team can copy.
The funnel
- Ad - A Facebook ad with our campaign and UTM structure.
- Lead form - The native Facebook lead form (name, email, phone). No landing page needed.
- Sync - The lead syncs into our database within seconds and becomes a pre-registered customer.
- Connect page - The thank-you page links to a page that opens iMessage with a preloaded greeting.
- First text - The moment the lead texts Sabi, they're activated and onboarding starts.
- Reporting - Trials, engagement, and purchases tie back to the exact ad.
When someone submits the lead form, Meta sends us a webhook (with a polling fallback in case the webhook misses). We create a pre-registered customer right away: name, email, phone, plus the full attribution. Campaign, ad set, ad, form, UTMs, and timestamp.
That gives us something we never had before: an organized view of everyone who raised their hand but hasn't started a conversation yet. Before this, a lead didn't exist in Sabi until they texted us, and we had no idea which ad found them.
The connect page
Publishing a static phone number is a trap. Linq, the platform we use to bridge iMessage, warned us that a widely shared number gets flagged as spam by Apple. So the lead never sees a raw number.
Instead, the thank-you page sends them to a connect page. On an iPhone it opens Messages with a friendly preloaded greeting, one tap. On desktop it shows a QR code that does the same thing. The page also captures any UTMs from the URL, so attribution survives even this hop.
There's a bonus here: when the user texts first, Apple treats the conversation as organic. No spam button, healthier phone lines.
Invisible ink in the first text
My favorite part. The preloaded greeting carries a unique key encoded in zero-width unicode characters. Invisible to the person, but our API sees it in the first inbound message.
That means we can tie the iMessage thread back to the exact ad, even if the person texts from a different number than the one on the form. We strip the marker before the AI ever sees the message, and from there the lead's pre-registered record becomes their real account. The attribution rides along from ad click to activated user.
Closing the loop with Meta
The last piece is reporting conversions back to Meta with the Conversions API, straight from the app. I wrote about that setup before; now it has a full funnel feeding it. Because every customer record knows its ad, we can send Meta the events that matter: not just leads, but trials started and purchases. That's the goal we're testing toward: Meta optimizing for the ads that produce paying customers, not cheap form fills.
Where we're at
We're a two-person team, and this whole funnel runs itself. A lead comes in, gets pre-registered with full attribution, gets a one-tap bridge into iMessage, and activates the moment they say hi.
We're testing the ads now. It's a work in progress, and I'll update this post with real campaign data and reports in the next week or two.
As always, if you have questions, send me a reply!