A couple of years ago, Speechify discovered an article from Flo on how they created their own funnel builder. It was a no-code solution PMs could use to create multiple experiments, conditions and structures.
Tired of manually modifying funnels and spending weeks on each experiment, we wanted something similar.
Back then, companies like FunnelFox were just getting started, so making something in-house sounded reasonable. I still met with the founder of FunnelFox to see what they offered (and steal some ideas, sorry), but quickly decided to stick to our own thing. I’m glad we did.
Two years in, we have an amazing builder that serves funnels across web, iOS and Android. At the time of writing, 20 different quizzes are getting traffic.
Building such a thing from scratch gave me a lot of exposure to how web funnels work and what their benefits are. So when it came to promoting Emery, my choice was simple. And while I only have a single funnel and no builder, applying this knowledge helps me get customers at half the price of the big guys.
Nowadays, whenever I consult for companies on web funnels/attribution, I find myself explaining the same things again and again.
With this article, I want to share some nuances, technical or otherwise, that are often overlooked.
But first, let’s agree on the terminology I’m going to use.
App2App – users click on an ad and are sent directly to the app store.
Web2App – users are first sent to a weblink, then quickly redirected to the app store. Sounds awkward, but it’s a trick used by many companies to help with attribution. Deserves a separate article though.
Web2Web – users start their journey on the web, complete the payment, and can then be sent to the app – either the store or web version.
This naming is the cleanest I’ve seen so far, as it covers both critical checkpoints – where the user journey begins and where the payment happens.
This article is dedicated to web2web funnels for B2C SaaS. Mostly for Meta, but some of it is relevant to other ad platforms.
The funnel in this context means a quiz – a series of questions and promo screens before presenting users with a paywall.
Now, with terminology out of the way, let’s see what people usually miss when creating their first web2web funnel.
On Meta, purchase campaigns only
Many B2C apps offer a free trial and copy that offering into their first web funnel.
However, it doesn’t work with Meta ads. Meta is too good when it comes to optimising to your signals. The algorithm always takes the path of least resistance. If you ask it to bring users who activate a trial, it’ll do just that. However, most of them won’t convert. There is a certain group of people who start trials across many apps, but never pay. And that’s who you’re targeting in this case. Doesn’t matter if you ask for a credit card or not.
It’s especially true for web2web funnels. On app2app funnels, downloading an app acts as a natural filter for a low-intent audience. People who end up going through your in-app funnel are already motivated enough to pay. Besides, app campaigns are much slower to learn and adjust to a cheaper audience.
Adjust prices
The nature of Meta traffic is very different from, let’s say, Google or organic.
Most Meta ad purchases are highly emotional. Which is great, as it makes high intent optional for a sale. And bad, because you can’t expect high retention from such an audience. So you have to restructure your unit economics depending on your circumstances.
Usually, I see companies do two things.
Setting much higher prices to make the ad spend back.
And giving a discount for the first period to add urgency for emotional buyers.
It’s always a trade-off between how much you can make and how quickly. With a cold, emotional audience, speed is the deciding factor.
Offer higher prices with refund guarantees
In case of Emery, a bootstrapped project, I offer a lifetime option.
The trade is simple – as I’m scaling my ads, a quick return of spend is more important than long-term revenue. It lets me recycle money as quickly as possible, without investments or loans. And on days when someone purchases lifetime, I make the ad spend back on day 1. Results? $14k made in July while spending only $8k on ads. Not counting all the subscription renewals, just day 1 revenue.
And a web funnel is the only one that allows this. Selling a $149 option to a cold audience requires a money-back guarantee, which is not really possible if payments are controlled by the stores.
Setup CAPI and deduplication
Tracking ad performance is getting more difficult every year. Pixels are getting blocked by ad blockers and browsers. Various region-specific limitations are getting applied too.
To ensure high data quality, you need CAPI in place, where you duplicate all your key funnel events by sending them server to server. But you should be very careful and ensure proper deduplication. You don’t want to count double conversions every time someone makes a purchase. It varies from ad platform to ad platform, but they all support deduplication IDs (shout-out to Google, which managed to name them differently in different places, very helpful).
And one last thing: critical server events shouldn’t be a proxy for your client events. They should really happen on the server side – e.g. a Stripe webhook on a successful purchase. I’ve seen some bots that trigger client-side events manually (especially if Audience Network/Display Network is enabled in your ad account). You want to send data as clean as possible.
The funnel must be placed on the main domain
That’s my main problem with a lot of third-party funnel builders – they all offer custom subdomains, but I’m yet to see one that lets you create funnels under your main domain name.
Why is it important?
Whenever you add the pixel to your website, Meta tracks all visitors. And it reasonably assumes that people who already visited your website are much warmer. So, whenever you create a new campaign, it tries to go for that warm audience first and brings cheap conversions.
If your funnel is placed on a separate domain, you lose this signal. Having the same pixel on two domains doesn’t solve it. Meta structures data at the domain level.
Even if you’re a small business and Meta is your first acquisition channel, it matters. Try running some ads and you’ll see people searching for your company on Google and ending up on your website.
In my case, I place everything under one domain name – the website, the app itself and my funnel.
Set up audiences right away
One thing you want to avoid from the very beginning is to keep showing ads to people who already purchased. The main spender on Meta is ecommerce. For them, it makes total sense showing different ads to the same people again and again. But for a subscription-based business, it’s a waste.
So, make sure to create a custom audience of purchasers. Even based on Meta purchase events, which can be done in a few clicks in Ads Manager. And use it as an exclusion list across all campaigns.
Meta funnel must be optimised for small screens
Most of the time, Meta opens your website inside an in-app browser. It comes with an extra top bar and doesn’t render fullscreen. As a result, you get much less vertical space. So, all content and design should be optimised to fit into a window smaller than the regular device screen. Take your mobile design and shrink the window by 200 pixels – that’s how much space you have.
Sounds small, but I keep seeing companies squeezing in too much content that doesn’t fit vertically.
The first screen should open instantly
Again, we’re talking about a cold audience. They are not really motivated to wait for your pages to load. The quicker you engage the user, the more chances you have.
Difficult to achieve though.
Making a funnel that loads fast and has instant transitions between screens is not technically possible. You either load screens one by one and make interactions slow. Or you load all screens right away and sacrifice the initial loading speed.
In my case, I’m trying to have the best of both worlds. The very first screen is a static HTML page that loads instantly. And while the user reads the initial content and answers the first question, I load the rest of the funnel in the background. If they click too fast, they’ll see a short loader, but the rest of the journey will be instant.
Make it look nice
That was a surprise for me.
Obsessed with copy, I thought of it as the main lever. Until I added a few simple animations and it turned out to be the most successful experiment.
Which makes sense if you think it through.
People clicking on ads don’t know anything about your product. Their funnel journey is the introduction. They form an opinion on the product by how your funnel looks, how nice it is, how smooth it is.
Copy is still important, but don’t disregard the visual part.
Important note here. Don’t add animations for the sake of it. Do it strategically – e.g. draw user attention to a specific element, presenting information piece by piece. You are designing a thing that should guide user attention and how they consume your content.
Checklist
These are the technical basics. At some point, I’ll finally go through my notes and publish a piece on the creative side of high-converting funnels too. In terms of content, sales mechanics and so on. But for now, I want you to have a quick checklist covering the basics.
So, here you go:
Does your first screen open instantly? Or does it show a loader instead?
Does it look nice? Do you have animations? Do they actually serve some purpose?
Does your content fit into 650 pixels vertically?
Do you have pixel + CAPI set up? Is deduplication set up correctly (you can check in Events Manager)?
Do you have a custom audience of purchasers? Is it used as an exclusion across all campaigns?
Is your funnel placed on your main domain?
Do you use trials or direct purchases on Meta web funnels?
Do you offer a very expensive plan for the 10-15% of people who always buy the best?


