Skip to main content

Custom Domains

Forms can be served from agency-owned domains like apply.example.gov.

Domain Hierarchy

  1. Form domain — Highest priority
  2. Workspace domain — Fallback
  3. App domain — Default

Workspace Domains

Apply a domain to all forms in a workspace:
  1. Go to Workspace SettingsCustom Domain
  2. Enter your domain (e.g., apply.example.gov)
  3. Add DNS records
  4. Verify ownership

Form Domains

Override workspace domain for a specific form:
  1. Go to Form SettingsCustom Domain
  2. Enter your domain
  3. Add DNS records
  4. Verify ownership

DNS Configuration

Add these records to your DNS provider:
TypeNameValue
CNAMEapplycname.vercel-dns.com
TXT_vercelverification-token

Verification

Domains go through verification:

Middleware Routing

Custom domains are resolved in middleware:
const host = request.headers.get("host");

// Check form-level domain
const form = await getFormByDomain(host);
if (form) return rewriteToForm(form);

// Check workspace-level domain
const workspace = await getWorkspaceByDomain(host);
if (workspace) return rewriteToWorkspace(workspace);

// Use default routing
return NextResponse.next();