Skip to content

ew1lexa/WebFlow-Sender

Repository files navigation

WebFlow Sender

High-throughput email delivery engine powered by Webflow's form infrastructure

Instead of relying on traditional ESPs (Mailchimp, SendGrid, etc.), the system programmatically updates form settings, publishes the site, and triggers form submissions via the Webflow Designer API — turning any Webflow site into a fully controllable email sender.

Built with a modern dark/light themed SPA dashboard for managing accounts, templates, settings, and real-time mailing analytics.

Warning

This tool is provided for educational and authorized testing purposes only. The author is not responsible for any misuse. Always comply with applicable laws and platform terms of service.


Table of Contents


Key Features

Engine

  • Automated Webflow form settings update → site publish → form trigger pipeline
  • Per-recipient template uniquification (each email gets its own spintax resolution, HTML fingerprint, and variable substitution)
  • Automatic retry with exponential backoff on 429 rate limits (15s → 30s → 60s, up to 3 attempts)
  • Configurable batch delays and inter-message pauses

Multi-Account

  • Unlimited Webflow account profiles with independent session_id / xsrf_token
  • Per-account proxy support (SOCKS5, HTTP) with built-in connectivity test via api.ipify.org
  • Per-account sender name, subject, template content, and redirect URL

Template System

  • 7 production-ready templates: Depop, eBay, Poshmark, Vinted, Mercari, StockX, Inbox Warming
  • Custom templates manager: create, edit, clone, duplicate, and delete templates from UI
  • Per-template metadata: icon, accent color, sender name, subject, and HTML body
  • Spintax processor with nested syntax support and MSO conditional protection
  • 11 dynamic variables: {email}, {username}, {first_name}, {last_name}, {order_id}, {redirect}, {date}, {time}, {random_price}, {tracking_number}, {item_name}
  • HTML uniquification layer: random comments between </tr> tags, data-mid attributes, invisible preheader blocks

Dashboard (SPA)

  • Five-tab interface: Accounts, Template, Settings, Send, Analytics
  • Dark / Light theme with animated circular ripple transition
  • Enhanced UI motion system: page transitions, card/button/input animations, modal transitions, and count-up stats
  • Auto-configuration from Webflow URL — paste a link, get Site ID, domain, and all API endpoints filled automatically
  • Code / Preview editor for HTML templates with live Shadow DOM preview (inline + fullscreen)
  • Custom template modal with drag-and-drop HTML import and live Code/Preview switch
  • Real-time progress tracking with elapsed timer, speed, ETA, and per-email logs
  • 14-day analytics chart, top accounts ranking, historical log viewer
  • Drag-and-drop .txt file import for recipient lists
  • Full export / import of accounts, settings, and config as a single JSON
  • Sound notifications on all UI events (toasts) and completion
  • Custom cursor with magnetic hover effect, click burst particles, and trailing particles
  • Accent color system with presets + advanced custom picker (HSV canvas + HEX/RGB controls) applied globally
  • Accent-aware wallpaper/background, cursor particles, custom themed scrollbars, text selection colors, and collapsible UI sections
  • Keyboard shortcuts: Ctrl+S (save), Ctrl+Enter (start sending), Esc (close modals)

Architecture

┌────────────────────────────────────────────────────────────┐
│                     Browser (SPA)                          │
│  index.html + script.js                                    │
│  Tabs: Accounts │ Template │ Settings │ Send │ Analytics   │
└──────────────────────┬─────────────────────────────────────┘
                       │  REST API (JSON)
                       ▼
┌──────────────────────────────────────────────────────────────┐
│                   Flask Backend (app.py)                     │
│                                                              │
│  ┌──────────────┐  ┌──────────────┐  ┌───────────────────┐   │
│  │  Accounts    │  │  Settings    │  │  Analytics        │   │
│  │  CRUD + Sync │  │  Load/Save   │  │  Record + Query   │   │
│  └──────────────┘  └──────────────┘  └───────────────────┘   │
│                                                              │
│  ┌──────────────────────────────────────────────────────┐    │
│  │  Mailing Thread (per session)                        │    │
│  │  progress_data + stop_flag + logging                 │    │
│  └───────────────────────┬──────────────────────────────┘    │
└──────────────────────────┼───────────────────────────────────┘
                           │
                           ▼
┌──────────────────────────────────────────────────────────────┐
│              WebflowMailer (webflow_mailer.py)               │
│                                                              │
│  For each recipient:                                         │
│    1. process_spintax(template)     — resolve [a|b|c]        │
│    2. uniquify_html(template)       — fingerprint HTML       │
│    3. _substitute_variables(tmpl)   — inject {email}, etc.   │
│    4. update_form_settings()        — POST form config       │
│    5. publish_site()                — POST publish           │
│    6. wait_for_publish()            — poll task status       │
│    7. trigger_form_submission()     — POST form submit       │
│    8. sleep(batch_delay)                                     │
└──────────────────────────────────────────────────────────────┘
                           │
                           ▼
                   Webflow Designer API
          (form settings, publish, form submit)

Tech Stack

Layer Technology
Backend Python 3.10+, Flask 3.x
HTTP Client requests (with optional requests[socks] for SOCKS5 proxies)
Frontend Vanilla JavaScript (ES6+), HTML5, CSS3
Typography Google Fonts (Inter)
Data Storage JSON files (config, cookies, accounts, settings, analytics)
External API Webflow Designer API (form settings, site publish, form submission)

Getting Started

Prerequisites

  • Python 3.10 or higher
  • A Webflow account with Designer access
  • A Webflow site with a form element configured

Installation

git clone https://github.com/ew1lexa/WebFlow-Sender.git
cd WebFlow-Sender
pip install -r requirements.txt

For SOCKS5 proxy support:

pip install "requests[socks]"

Run

python app.py

Open http://localhost:5000 in your browser.

All config files (config.json, cookies.json, settings.json, analytics.json) and data directories (accounts/, logs/) are created automatically on first launch — no manual setup required.


Configuration

Quick Setup (Recommended)

  1. Open the dashboard → Settings tab
  2. Paste your Webflow site URL (e.g. https://your-site-xxxxx.webflow.io) into the Auto-configuration field
  3. Enter your Session ID and XSRF Token from browser DevTools
  4. Click Распознать — Site ID, Element ID, domain, and all API endpoints are filled automatically
  5. Click Сохранить всё

Manual Setup

All credentials are stored in config.json (gitignored, auto-created on first run).

Field Description Where to Find
site_id Webflow site identifier Auto-detected from URL or Designer URL
element_id Form element ID Auto-detected from Webflow API
page_id Page containing the form Same as site_id for single-page sites
session_id Session token DevTools → Network → Request Headers (x-session-id)
xsrf_token CSRF token DevTools → Network → Request Headers (x-xsrf-token)
domain Published site domain e.g. your-site.webflow.io
batch_delay Delay between emails (seconds) Set in UI or config
redirect_url Target URL for {redirect} variable Set in UI per-account

Tokens can also be managed through the dashboard UI (Settings tab) and are synced per-account.


Project Structure

WebFlow-Sender/
├── app.py                        # Flask app — routes, API, mailing orchestration
├── webflow_mailer.py             # Core engine — Webflow API, spintax, uniquification
├── requirements.txt              # Python dependencies
├── LICENSE                       # MIT License
├── README.md
│
├── static/
│   ├── script.js                 # Frontend logic (accounts, templates, sending, analytics)
│   └── Nota.mp3                  # Notification sound
│
├── templates/
│   ├── index.html                # SPA dashboard (single-page app)
│   ├── template.txt              # Base email template
│   ├── template_depop.txt        # Depop order confirmation
│   ├── template_ebay.txt         # eBay order confirmation
│   ├── template_poshmark.txt     # Poshmark sale notification
│   ├── template_vinted.txt       # Vinted order confirmation
│   ├── template_mercari.txt      # Mercari sale notification
│   ├── template_stockx.txt       # StockX order confirmation
│   └── template_inbox.txt        # Inbox warming notification
│
├── accounts/                     # Account profiles (gitignored, auto-created)
│   └── account_*.json
│
├── logs/                         # Daily log files (gitignored, auto-created)
│   └── YYYY-MM-DD.log
│
└── docs/screenshots/             # README screenshots
    ├── dark/                     #   Dark theme screenshots
    └── light/                    #   Light theme screenshots

Auto-created at runtime (gitignored):

  • config.json — engine configuration and credentials
  • cookies.json — Webflow designer session cookies
  • settings.json — user preferences (delays, order ID format)
  • analytics.json — mailing statistics

Template Engine

Spintax

Randomize content per email with bracket syntax:

Your [order|purchase|transaction] has been [confirmed|processed|completed].

Nested spintax is supported:

[Hello [friend|valued customer]|Hi there|Greetings]

MSO conditional blocks (<!--[if mso]>...<![endif]-->) are automatically excluded from spintax processing.

Dynamic Variables

Variable Output Example Description
{email} john.smith@gmail.com Recipient email address
{username} john.smith Local part of the email
{first_name} James Random first name
{last_name} Williams Random last name
{order_id} 48291057 Random order ID (format configurable)
{redirect} https://... Redirect URL from account settings
{date} Mar 18, 2026 Current date
{time} 14:30 Current time
{random_price} $149.99 Random price ($12.99–$299.99)
{tracking_number} 1Z9400827364... Random tracking number
{item_name} Jordan 1 Retro High OG Random product name

HTML Uniquification

Each email receives a unique HTML fingerprint to reduce spam filter correlation:

  • Random HTML comments inserted between </tr> tags
  • Unique data-mid attribute on the first <table>
  • Invisible preheader <div> with randomized content after <body>

Sending Modes

Mode 1 — Standard

One email per recipient. Pipeline: update form → publish → submit.

Mode 2 — Inbox Warming

Two emails per recipient: first an inbox warming template (generic notification), then the main template. The delay between the two is configurable via dual_mode_delay.

Both modes process recipients individually (not in batches) to ensure unique variable substitution per email.


API Reference

All endpoints are served by the Flask backend at http://localhost:5000.

Accounts
Method Endpoint Description
GET /api/accounts List all accounts
GET /api/accounts/get?filename=... Get single account
POST /api/accounts/save Create or update account
POST /api/accounts/delete Delete account
POST /api/accounts/delete-all Delete all accounts
POST /api/accounts/rename Rename account
POST /api/accounts/update-proxy Update account proxy
POST /api/accounts/update-field Update single field
POST /api/accounts/sync-config Sync tokens to config.json
Templates
Method Endpoint Description
GET /api/templates/list List available template files
GET /api/templates/load-file?filename=... Load template file content
GET /api/template/load?account=... Load account's current template
POST /api/template/save Save template to account
POST /api/template/set Bulk-set template (current / all accounts)
GET /api/template/set-logs Template set operation status
Sending
Method Endpoint Description
POST /api/send Start mailing (runs in background thread)
POST /api/stop Stop current mailing
GET /api/status Get mailing progress
Settings & Config
Method Endpoint Description
GET /api/settings/load Load user settings
POST /api/settings/save Save user settings
GET /api/config/load Load engine config
POST /api/config/save Save engine config
POST /api/config/parse-url Auto-detect site config from Webflow URL
GET /api/random-vars?account=... Generate preview variables
POST /api/redirect/set Set redirect URL for all accounts
POST /api/proxy/test Test proxy connectivity
Analytics & Logs
Method Endpoint Description
GET /api/analytics/data Get all analytics records
GET /api/logs/list List available log files
GET /api/logs/view?date=... View log file content

Screenshots

Accounts
Account management — multi-account profiles with proxy settings, export/import

Template Editor
Template editor — brand templates, Code/Preview toggle with Shadow DOM, sender name

Settings
Settings — auto-config from URL, authorization tokens, batch speed, anti-spam delays

Sending
Sending — mode selection, drag-and-drop recipients, live timer with ETA, collapsible error reference

Analytics
Analytics — 14-day delivery chart, top accounts, recent mailings with success/fail stats


License

MIT License — see LICENSE for details.


Built with Flask + Vanilla JS — no frameworks, no dependencies bloat

webflow · email-sender · bulk-mailer · flask · spintax · python · dark-theme · spa · anti-spam

About

Mass email engine powered by Webflow forms API — SPA dashboard, spintax, HTML uniquification, multi-account, dark/light theme

Topics

Resources

License

Contributing

Stars

Watchers

Forks

Packages

 
 
 

Contributors