A backend service that connects Webflow sites with Veil Mail for form submissions, Memberships sync, and embeddable signup forms — with automatic PII protection and CASL/GDPR compliance.
Use this if you run a Webflow site and want to route form submissions to a real email platform instead of Webflow's built-in email (which is limited) or manually exporting CSV lists. Veil Mail adds automatic PII scanning, CASL consent tracking for marketing sends, audience management, and embeddable signup forms that Webflow doesn't provide natively.
Related: Veil Mail product · Node.js SDK · Signup forms docs
- Form Integration - Automatically sync Webflow form submissions to Veil Mail audiences
- Member Sync - Sync Webflow Memberships users to Veil Mail
- Embeddable Forms - Generate customizable signup forms to embed anywhere
- Webhook Processing - Real-time sync via Webflow webhooks
- Bun 1.1+
- PostgreSQL database
- Webflow account with API access
- Veil Mail account
cd integrations/webflow
bun installCreate a .env file:
# Server
PORT=3001
APP_URL=https://your-webflow-integration.com
DASHBOARD_URL=https://app.veilmail.xyz
# Database
DATABASE_URL=postgresql://user:password@localhost:5432/veil_webflow
# Webflow OAuth
WEBFLOW_CLIENT_ID=your_client_id
WEBFLOW_CLIENT_SECRET=your_client_secret
WEBFLOW_WEBHOOK_SECRET=your_webhook_secret
# Security
JWT_SECRET=your-jwt-secret-keybun run db:generate
bun run db:pushbun run dev- Go to Webflow Dashboard > Integrations > Apps
- Click "Build an app"
- Configure:
- App Name: Veil Mail
- Redirect URI:
{APP_URL}/auth/callback - Scopes:
sites:read,forms:read,forms:write
In your Webflow app settings, add webhooks:
| Trigger | URL |
|---|---|
| Form submission | {APP_URL}/webhooks/form-submission |
| Membership user added | {APP_URL}/webhooks/membership |
| Method | Endpoint | Description |
|---|---|---|
| GET | /auth/connect |
Start OAuth flow |
| GET | /auth/callback |
OAuth callback |
| POST | /auth/disconnect/:siteId |
Disconnect site |
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/sites |
List connected sites |
| GET | /api/sites/:siteId |
Get site details |
| PATCH | /api/sites/:siteId |
Update site settings |
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/sites/:siteId/forms |
List forms |
| POST | /api/sites/:siteId/forms |
Configure form |
| GET | /api/sites/:siteId/submissions |
List submissions |
| POST | /api/sites/:siteId/submissions/retry |
Retry failed syncs |
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/embed-forms |
List embed forms |
| POST | /api/embed-forms |
Create embed form |
| PATCH | /api/embed-forms/:formId |
Update embed form |
| DELETE | /api/embed-forms/:formId |
Delete embed form |
| GET | /embed/form/:formId |
Render embed form |
| GET | /embed/script/:formId |
Get embed script |
| POST | /embed/submit/:formId |
Submit embed form |
<div id="veil-mail-form-{formId}"></div>
<script src="https://your-integration.com/embed/script/{formId}"></script><iframe
src="https://your-integration.com/embed/form/{formId}"
style="width: 100%; min-height: 300px; border: none;"
></iframe># Install Fly CLI
brew install flyctl
# Create app
fly launch
# Set secrets
fly secrets set WEBFLOW_CLIENT_ID=xxx
fly secrets set WEBFLOW_CLIENT_SECRET=xxx
fly secrets set DATABASE_URL=xxx
fly secrets set JWT_SECRET=xxx
# Deploy
fly deployFROM oven/bun:1.2-alpine
WORKDIR /app
COPY package.json bun.lock ./
RUN bun install --frozen-lockfile
COPY . .
RUN bun run build
CMD ["bun", "start"]src/
├── server.ts # Express server setup
├── routes/
│ ├── auth.ts # OAuth flow
│ ├── webhooks.ts # Webflow webhooks
│ ├── embed.ts # Embeddable forms
│ └── api.ts # Management API
├── services/
│ └── veil.ts # Veil Mail API client
└── prisma/
└── schema.prisma # Database schema
MIT - Copyright (c) 2025-present Resonia Inc