Custom Domains
Every project needs a custom domain to go live. Campaigns cannot be served without a verified domain connected to your project.
Common Domain Patterns
Most teams use a subdomain of their main domain:
| Domain | Use Case |
|---|---|
get.myapp.com | Acquisition funnels, landing pages |
quiz.myapp.com | Quiz-style onboarding flows |
sub.myapp.com | Subscription / paywall funnels |
start.myapp.com | General onboarding |
try.myapp.com | Free trial flows |
Setup
Open Domain Settings
Go to Project Settings > Domains and click Add Domain.
Insert image: The Project Settings page with the Domains tab selected, showing the “Add Domain” button and any existing domains listed.
Enter Your Domain
Type your domain (e.g., quiz.myapp.com) and click Add.
Insert image: The “Add Domain” dialog with a text input showing an example domain being entered.
Create a CNAME Record
In your DNS provider (Cloudflare, Namecheap, Route 53, etc.), create a CNAME record pointing your domain to AppFunnel:
| Type | Name | Target |
|---|---|---|
CNAME | quiz | cname.appfunnel.net |
Insert image: Example DNS configuration in a provider like Cloudflare, showing the CNAME record being added with the correct values.
Wait for Verification
AppFunnel checks the DNS record automatically. This usually takes a few minutes, but DNS propagation can take up to 24 hours.
Insert image: The Domains list showing a domain with a “Pending” verification status badge.
Domain Verified
Once verified, the domain status changes to Active. All campaigns in the project are now accessible at your custom domain.
Insert image: The Domains list showing a domain with a green “Active” status badge.
URL Structure
Once your domain is connected, campaigns are served at:
https://{domain}/f/{campaign-slug}
https://{domain}/f/{campaign-slug}/{page-slug}The first page of a funnel omits the page slug. Subsequent pages include it:
https://quiz.myapp.com/f/onboarding → First page
https://quiz.myapp.com/f/onboarding/experience → "experience" page
https://quiz.myapp.com/f/onboarding/paywall → "paywall" pageThe browser URL updates as the visitor navigates through the funnel.
Deep Linking
You can link a visitor directly to a specific page by passing their session ID as a query parameter:
https://quiz.myapp.com/f/onboarding/paywall?sid={sessionId}This is useful in email flows — for example, linking a user back to their paywall or a specific step in the funnel.
In integrations like Customer.io, the sessionId is automatically pushed to the user object, so you can use it directly in email templates.
Sessions are bound to a specific campaign. A session ID from one campaign cannot be used to access a different campaign’s funnel.
Behavior Without a Session
If a visitor lands on a page URL without a valid sid parameter and has no existing session cookie, a new session is created and they are redirected to the first page of the funnel. They cannot skip ahead without an active session.
Multiple Domains
You can add multiple custom domains to a single project. All campaigns are accessible from all verified domains.
Troubleshooting
| Issue | Solution |
|---|---|
| Domain stuck on “Pending” | Verify the CNAME record is correct in your DNS provider. DNS propagation can take up to 24 hours. |
| SSL certificate error | AppFunnel provisions SSL automatically after verification. Wait a few minutes after the domain becomes Active. |
| CNAME conflict | Some DNS providers don’t allow CNAME on the root domain (myapp.com). Use a subdomain instead. |