Custom domain

On the Pro plan and above, FormNode can serve all of your workspace's customer portals and embedded forms under your own domain — for example forms.yourcompany.com instead of app.formnode.io. Setup is CNAME plus a one-time TXT record; certificates are issued and renewed automatically by Cloudflare for SaaS.

What changes when you set this upEvery form URL, portal URL, and embed script under your workspace starts resolving on your domain. Existing FormNode-domain URLs keep working — both addresses serve the same content, so you don't have to migrate links you've already shared.

Setup

1. Pick a hostname

Use a subdomain, not your apex. Common choices: forms.yourcompany.com, portal.yourcompany.com, intake.yourcompany.com. The apex is reserved for your main marketing site and shouldn't be repurposed for forms.

2. Add the domain in FormNode

From the dashboard, open Settings → Custom domain. Enter the hostname you picked and click Add domain. FormNode submits the hostname to Cloudflare for SaaS, which issues two DNS records you need to create in your DNS provider. FormNode also creates a dedicated Cloudflare Turnstile widget for that hostname so public form spam protection works on the custom domain without using one of the shared app.formnode.io widget hostname slots.

3. Create the CNAME

In your DNS provider (Cloudflare, Route 53, GoDaddy, whatever), add a CNAME record pointing your hostname at cname.formnode.io:

forms.yourcompany.com  CNAME  cname.formnode.io.

If you use Cloudflare for DNS on the same domain, set the proxy state to DNS only (gray cloud) for this record. Cloudflare for SaaS handles the orange-cloud layer on its end — adding a second proxy on your side breaks certificate provisioning.

4. Create the verification TXT record

FormNode shows you a TXT record value when you add the domain. Add it to your DNS:

_cf-custom-hostname.forms.yourcompany.com  TXT  "verify=abc123def456..."

This proves to Cloudflare you control the hostname. Once the record propagates, the verification status flips and a TLS certificate is issued automatically.

5. Wait for verification

DNS propagation typically takes 5–15 minutes; certificate issuance is usually under five minutes after DNS verifies. The Custom domain settings page polls and shows the live status — PendingActive.

Once active, open https://forms.yourcompany.com/p/{org-slug} in a browser. You should see the customer portal with a valid lock icon.

Form submissions on the custom domain use that domain's dedicated Turnstile site key. If a custom-domain form shows a Cloudflare "Unable to connect to website" widget error, click Verify Status in settings so FormNode can retry the Turnstile widget provisioning step.

What gets served on the custom domain

Every FormNode URL under your workspace becomes available on your domain:

  • Customer portals: forms.yourcompany.com/p/{org-slug}
  • Direct form links: forms.yourcompany.com/f/{form-id}
  • Embed script: forms.yourcompany.com/embed.js
  • Approval pages (when an approver clicks the email button)

The dashboard, login, and API endpoints stay on app.formnode.io— those are workspace-private surfaces and aren't mirrored to the custom domain.

White-label (Business plan)

On the Business plan, the custom domain plus the white-label setting strips the "Powered by FormNode" footer from portals and emails. Combined with custom SMTP, your customers see a portal that reads as your product end-to-end.

Removing or changing the domain

From the same Custom domain settings page, click Remove domain. FormNode releases the hostname from Cloudflare for SaaS and reverts portal URLs to app.formnode.io. The original FormNode URLs were always valid, so existing email links and embeds keep working — only the custom-domain URLs stop resolving.

FormNode also deletes the dedicated Turnstile widget for that custom domain. After removal, you can free up the DNS records (CNAME and TXT) at your DNS provider, or leave them for a future re-add.

Troubleshooting

Status stays on "Pending" for hours

Either the CNAME or TXT didn't propagate. Check from a few external DNS checkers (e.g., dig from a non-Cloudflare resolver) — the records should resolve to cname.formnode.io and the verification value FormNode showed you. If your DNS provider has a long minimum TTL (some still default to 1 hour), the propagation just takes that long the first time.

Cert is invalid or browser shows a warning

Almost always caused by Cloudflare proxying the CNAME on your side (orange cloud) when it should be gray. Switch the record to DNS-only and wait a few minutes for the SaaS-side cert to provision against an unproxied target.

Embed script fails to load on the custom domain

The script reference must use the same domain you're embedding from — if your site is on yourcompany.com and you set up forms.yourcompany.com, embed using https://forms.yourcompany.com/embed.js, not app.formnode.io/embed.js. Same-domain embedding avoids third-party-cookie restrictions in Safari and modern Chrome.

Turnstile says "Unable to connect to website"

The hostname is not authorized for the Turnstile site key currently rendered on the page. Open Settings → Custom domain and click Verify Status. FormNode will create or repair the dedicated Turnstile widget for that hostname.