Build a Custom Web2App Funnel With Code

No-code funnel builders are great until they're not.
A web2app funnel is a web-based onboarding and checkout flow that converts visitors into paying app subscribers — typically used by mobile apps to bypass App Store fees and own the entire conversion experience. These funnels handle everything from quiz-style onboarding to Stripe checkout to deep linking users into your app.
You start with a template, tweak the colors, swap the copy, and ship. It works. Then your designer hands you a mockup that doesn't fit the grid. Your growth team wants a checkout flow the builder doesn't support. You need conditional logic that goes beyond "if answer A, show page B." And suddenly you're fighting the tool instead of building the funnel.
If you've used FunnelFox, Web2wave, or any similar no-code funnel builder, you've probably hit this wall. The question becomes: do you keep hacking around limitations, or do you build it yourself?
The Problem With Building a Web2App Funnel From Scratch
Building your own web funnel sounds simple. It's just a few pages with a form and a checkout, right?
Then you start listing what you actually need:
- Stripe integration with subscription management, trials, and discount logic
- Session tracking that persists across page reloads and return visits
- Attribution capture for Meta fbp/fbc, Google gclid, TikTok ttclid, and UTM params
- Analytics events for every page view, checkout start, and purchase
- A/B testing infrastructure to experiment on different flows
- RevenueCat sync so your app knows who paid on the web
- Deep linking to get users from web checkout into your app
- Variable persistence so user responses survive refreshes and are available downstream
That's not a weekend project. That's months of infrastructure work before you write a single line of funnel UI code. And then you have to maintain it.
Build Custom Funnels With the Appfunnel Headless SDK
What if you could write your funnel pages in React, with complete design freedom, and have everything else handled for you?
That's what the Appfunnel Headless SDK does. You own the frontend. We handle the infrastructure.
Writing Funnel Pages in React
Regular React components. Each page is a .tsx file with whatever UI you want. Your design system, your animations, your layout. No templates, no drag-and-drop constraints.
import { definePage, useNavigation, useResponse } from '@appfunnel-dev/sdk'
export const page = definePage({
name: 'Goal Selection',
routes: [
{
to: 'plan-quiz',
when: { variable: 'answers.goal', equals: 'weight-loss' },
},
{ to: 'generic-plan' },
],
})
export default function GoalSelection() {
const [goal, setGoal] = useResponse<string>('goal')
const { goToNextPage } = useNavigation()
return (
<div className="flex flex-col items-center gap-6 p-8">
<h1 className="text-3xl font-bold">What's your goal?</h1>
{['weight-loss', 'muscle-gain', 'better-sleep'].map((option) => (
<button
key={option}
className={`w-full rounded-xl p-4 text-lg ${
goal === option
? 'bg-blue-600 text-white'
: 'bg-gray-100'
}`}
onClick={() => {
setGoal(option)
goToNextPage()
}}
>
{option.replace('-', ' ')}
</button>
))}
</div>
)
}That's a real page. It tracks the user's response, evaluates conditional routing, and moves to the next step. You didn't have to set up any state management, routing logic, or analytics instrumentation.
Built-in Payments, Analytics & Attribution
Behind the scenes, the SDK is doing everything you'd otherwise build yourself:
useProducts(): loads your products and pricing from the Appfunnel dashboard, with formatted prices, trial info, and currency handlingusePayment(): triggers Stripe checkout with trial support, 3D Secure, and subscription managementuseTracking(): fires analytics events to your connected integrations (Meta CAPI, GTM, Clarity)useNavigation(): handles conditional page routing with support for complex AND/OR logicuseUser(): manages user identity, email capture, and marketing consentuseTranslation(): i18n support with runtime locale switching
Session data, attribution parameters, and user responses are automatically persisted and synced to the backend. When a purchase completes, RevenueCat is updated automatically.
Deploy With the Appfunnel CLI
The Appfunnel CLI handles the full development lifecycle — from scaffolding a new project to deploying it to production with a single command.
# Scaffold a new project
appfunnel init my-funnel
# Start the dev server with hot reload
appfunnel dev
# Visualize your page routing
appfunnel routes
# Build and publish
appfunnel build && appfunnel publish --promoteYour funnel is deployed to Appfunnel's infrastructure and served from a CDN. No Vercel, no Netlify, no Docker. Just publish and it's live.
Headless SDK vs. No-Code Builder: When to Use Which
The no-code builder isn't going away. It's still the fastest way to get a funnel live. Here's how to decide:
| No-Code Builder | Headless SDK | |
|---|---|---|
| Setup time | Minutes | Hours |
| Design flexibility | Template-based | Unlimited (React) |
| Checkout customization | Standard flows | Full control |
| Programmatic logic | Basic conditionals | Any JavaScript |
| Version control | Visual editor only | Git-based |
| Team requirement | No developers needed | Frontend developer |
| Best for | Rapid validation | Production-grade custom funnels |
Use no-code when you're validating a concept quickly, your team doesn't have frontend developers, or the builder's components cover what you need.
Go headless when your design demands custom animations and branded components, your checkout flow needs multi-product bundles or conditional pricing, you need programmatic control with API calls and custom validation, or you want your funnels in version control.
Getting Started With the Appfunnel Headless SDK
Install the CLI, scaffold a project, and start building:
npm install -g appfunnel
appfunnel login
appfunnel init my-funnel
cd my-funnel && npm install
appfunnel devYour funnel runs locally at localhost:5173. Every page is a React component. Every interaction is a hook. When you're done, appfunnel publish puts it live.
The SDK handles payments, analytics, attribution, A/B testing, and RevenueCat sync. You just build the UI.
Ready to build your first custom web2app funnel? Run appfunnel init to
scaffold a starter template, check the SDK
documentation for a step-by-step
guide, or join our community if you have questions.
Frequently Asked Questions
What is a web2app funnel?
A web2app funnel is a web-based onboarding and payment flow that converts website visitors into paying app subscribers. Instead of relying on the App Store or Google Play for payments (and paying 15-30% commission), you handle checkout on the web via Stripe and then deep link users into your mobile app. The funnel typically includes quiz-style onboarding, a paywall, and Stripe checkout.
Can I use my own design system with the Headless SDK?
Yes. Every page is a standard React component. You can use Tailwind, CSS Modules, styled-components, or any other styling approach. The SDK provides hooks for data and navigation — it never touches your UI.
How does the Headless SDK handle payments?
The SDK integrates with Stripe through the usePayment() hook. It supports subscriptions, free trials, discount codes, and 3D Secure authentication. When a purchase completes, the SDK automatically syncs the transaction to RevenueCat so your app can unlock premium features immediately.
What's the difference between Appfunnel and FunnelFox or Web2wave?
FunnelFox and Web2wave are no-code funnel builders — you design funnels in a visual editor using pre-built templates. Appfunnel offers both a no-code builder and a Headless SDK. The Headless SDK lets you write funnels as React code with full design freedom, while Appfunnel handles payments, analytics, attribution, and deployment infrastructure.
Do I need to set up my own hosting?
No. When you run appfunnel publish, your funnel is deployed to Appfunnel's CDN-backed infrastructure. There's no need to configure Vercel, Netlify, AWS, or any other hosting provider.

