# EmailFlow AI > AI-native email marketing platform: audiences (lists, subscribers, segments), > campaigns, automations, AI email generation, sending domains, webhooks, and > analytics — all available over a scoped REST API. Authoritative resources: - OpenAPI 3.1 spec (machine-readable contract): http://127.0.0.1:8000/openapi/public-api-v1.json (YAML: http://127.0.0.1:8000/openapi/public-api-v1.yaml) - Human docs: http://127.0.0.1:8000/docs (developer section: http://127.0.0.1:8000/docs/api) - Full docs corpus for agents: http://127.0.0.1:8000/llms-full.txt - TypeScript SDK: @emailflow/sdk (sdk/typescript in the repository) - API base URL: http://127.0.0.1:8000/api/v1 ## Authentication Create scoped API keys under Account -> API (http://127.0.0.1:8000/rui/account/api). Keys look like `efa_` + 40 base62 characters and are shown ONCE at creation — only a sha256 hash is stored. Send the key on every request using either header form: Authorization: Bearer efa_your_key_here X-API-Key: efa_your_key_here Both forms are equivalent. Keys can expire and be revoked; a revoked or expired key returns 401 `INVALID_API_KEY`. ## Scopes Grant only what an integration needs. Broad scopes include their narrower scopes (the Includes column); granular scopes grant only themselves. A key missing the required scope gets 403 `INSUFFICIENT_PERMISSIONS`. Scope Grants Includes ----------- ---------------------------------------------------- ------------------------- all Everything, including admin endpoints every scope contacts Lists and subscribers; includes Audiences audiences audiences Read audience segments - emails Email content; includes Domains, Sends and Templates domains, sends, templates domains Sending domains - sends Campaigns and sending - templates Email templates - automations Automation workflows; includes Triggers triggers triggers Trigger automation runs - webhooks Webhook subscriptions - analytics Event analytics feed - usage Usage and quota meters - brand Brand profile - ## Idempotency Unsafe requests (POST/PATCH/PUT/DELETE) accept an optional `Idempotency-Key` header (any string up to 255 chars; UUIDs recommended). Within a 24-hour window, replaying the same key + identical payload returns the ORIGINAL response with `Idempotency-Replayed: true` instead of re-executing — e.g. a replayed `POST /emails/generate` returns the same `template_uid` without generating (or charging) twice. The same key with a DIFFERENT payload returns 409 `CONFLICT`, as does a concurrent in-flight request with the same key. 5xx responses are not recorded, so retries after a server error re-execute. ## Rate limits Per API key (legacy-token callers share a per-user bucket). Successful responses carry `X-RateLimit-Limit`, `X-RateLimit-Remaining`, and `X-RateLimit-Reset`; a 429 carries `Retry-After` (seconds) — honor it and retry with backoff. Class Limit Applies to --------- ------- ------------------------------------------------------------- api.read 100/min All read (GET) requests on resource endpoints. api.write 60/min Create, update, and delete requests on resource endpoints. api.batch 10/min Bulk subscriber import (sync and async) and batch operations. api.ai 20/min AI email generation and edit requests. api.sends 10/min Campaign run (send) triggers. Untagged legacy endpoints share an outer 60/min guard. ## Errors Every error is a uniform JSON envelope: {"error": {"code", "type", "message", "suggestion"?, "docs"?, "param"?, "details"?, "retryAfter"?}} Cross-tenant and unknown uids both return 404 `NOT_FOUND` — existence is never leaked. HTTP Code Type What to do ---- ------------------------ --------------------- --------------------------------------------------------------------------------------------------- 400 INVALID_REQUEST invalid_request_error Check the request method, path, and parameters against the API reference. 401 INVALID_API_KEY authentication_error Create a new key under Account -> API, or check that the key was copied in full. 403 INSUFFICIENT_PERMISSIONS permission_error Use a key whose scopes cover this endpoint, or create one under Account -> API. 404 NOT_FOUND invalid_request_error Check the identifier; the resource may have been deleted or may belong to another account. 422 VALIDATION_ERROR invalid_request_error Fix the fields listed in details and retry the request. 429 RATE_LIMITED rate_limit_error Slow down and retry after the number of seconds given in retryAfter. 409 IDEMPOTENCY_CONFLICT invalid_request_error Use a fresh Idempotency-Key for a different request body, or replay the identical body. 402 CREDITS_EXHAUSTED billing_error Upgrade your plan or wait for the next billing cycle to refresh your credits. 402 PLAN_LIMIT billing_error Upgrade your plan to raise this limit. 409 CONFLICT invalid_request_error The resource is in a state that does not allow this operation; fetch it again and check its status. 500 SERVER_ERROR api_error Retry later; if the problem persists, contact support with the request timestamp. ## Resources Base URL: http://127.0.0.1:8000/api/v1 — full request/response shapes live in the OpenAPI spec. ### Lists (`contacts`) CRUD at `/lists`; add custom fields with `POST /lists/{uid}/add-field`. Lists are the container every subscriber, segment, and automation hangs off. ### Subscribers (`contacts`) CRUD at `/subscribers` (+ `?list_uid=` filter); per-list status transitions under `/lists/{list_uid}/subscribers/...`; tag with `add-tag`/`remove-tag`. Custom-field values travel as UPPERCASE tag keys (e.g. `FIRST_NAME`). ### Bulk contacts (`contacts`) Up to 1,000 rows per call: `POST /lists/{uid}/subscribers/bulk` (sync upsert), `DELETE .../bulk` (bulk delete), `POST .../bulk/async` (import job; poll `GET /import-jobs/{uid}`). ### Segments (`contacts`) Condition-based audiences: `/lists/{uid}/segments` + `/segments/{uid}`; preview membership with `GET /segments/{uid}/subscribers`. Operators are validated against the live catalog (see the OpenAPI `SegmentCondition` schema). ### Campaigns (`campaigns`, send via `sends`) CRUD at `/campaigns`; `POST /campaigns/{uid}/run` queues the send (scope `sends`); `pause`/`resume`; CSV logs at `/campaigns/{uid}/{tracking,open,click,bounce,feedback,unsubscribe}-log/download`. ### AI email generation (`emails`) `POST /emails/generate` (prompt -> saved template + HTML, ~15-60s, send an Idempotency-Key) and `PATCH /emails/{template_uid}` (natural-language edit with checkpoint). Templates open in the visual builder afterwards. ### Templates (`templates`) Read-only: `GET /templates` (filter `search`, `source=gallery|ai|imported|api`), `GET /templates/{uid}?include=html`. ### Automations (`automations`) Graph CRUD at `/automations` (create from a validated graph OR an AI `prompt`); atomic batch edits via `PATCH` operations; `activate`/`deactivate`; fire per-contact runs with `POST /automations/{uid}/runs`; cancel via `PATCH /automation-runs/{uid}`. ### Sending domains (`domains`) `POST /domains` registers and returns the DNS records to publish; `POST /domains/{uid}/verify` re-checks DNS; deletion is blocked 409 while scheduled/sending campaigns use the domain. ### Webhooks (`webhooks`) `POST /webhooks` subscribes an https endpoint to events (secret returned once); deliveries are HMAC-signed (`X-EmailFlow-Signature: t=...,v1=...`), retried [30s, 5m, 30m], auto-disabled after 20 consecutive failures; `POST /webhooks/{uid}/test` pings synchronously. ### Brand (`brand`) Read-only `GET /brand`: company profile, colors, fonts, logo URL, and `crawl_status` to poll after a brand scan. ### Usage (`usage`) Read-only `GET /usage`: plan quota meters (used/limit/unlimited/granted) and credit snapshot (sends, AI tokens, verifications). ### Analytics (`analytics`) `GET /analytics/events`: unified feed of sent/failed/open/click/bounce/feedback/unsubscribe events, cursor-paginated, filterable by type/campaign/email/time range. ## Canonical examples Generate an email from a prompt: curl -X POST http://127.0.0.1:8000/api/v1/emails/generate \ -H "Authorization: Bearer efa_your_key_here" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: 1b9d6bcd-bbfd-4b2d-9b5d-ab8dfbbd4bed" \ -d '{"prompt": "Welcome email for a coffee subscription, warm tone"}' Create a segment of recently-engaged contacts: curl -X POST http://127.0.0.1:8000/api/v1/lists/LIST_UID/segments \ -H "X-API-Key: efa_your_key_here" \ -H "Content-Type: application/json" \ -d '{"name": "Engaged 30d", "matching": "all", "conditions": [{"type": "last_open_email", "operator": "last_open_email_less_than_days", "value": "30"}]}' Register a sending domain (then publish the returned DNS records and verify): curl -X POST http://127.0.0.1:8000/api/v1/domains \ -H "Authorization: Bearer efa_your_key_here" \ -H "Content-Type: application/json" \ -d '{"domain": "mail.example.com"}' Fire an automation for one contact: curl -X POST http://127.0.0.1:8000/api/v1/automations/AUTOMATION_UID/runs \ -H "Authorization: Bearer efa_your_key_here" \ -H "Content-Type: application/json" \ -d '{"email": "person@example.com"}' Register a webhook (store the returned secret — it is shown once): curl -X POST http://127.0.0.1:8000/api/v1/webhooks \ -H "Authorization: Bearer efa_your_key_here" \ -H "Content-Type: application/json" \ -d '{"url": "https://example.com/hooks/emailflow", "events": ["email.delivered", "contact.subscribed"]}' --- # EmailFlow AI — Full product documentation Generated from the public product documentation by `extract-support-docs.py --llms`; do not edit by hand. The concise API guide above is the live /llms.txt at generation time. # Getting Started ## Welcome Page URL: https://emailflow.ai/docs/welcome # Welcome to EmailFlow AI EmailFlow AI is an AI-first email marketing platform. Describe the email you want and the AI designs it on-brand in seconds — then you send campaigns, build automations, and track results, all in one place. Delivery runs on our managed Amazon SES infrastructure with 99%+ deliverability, while we also handle the AI, list verification, and analytics. These docs walk you through every part of the product, from your first AI-built email to advanced deliverability and automation. If you're brand new, start with the [Quickstart](https://emailflow.ai/docs/quickstart) — you'll have a campaign out the door in minutes. If you'd rather understand the building blocks first, read [Core concepts](https://emailflow.ai/docs/core-concepts). ![The AI Design Studio: a chat conversation on the left where the AI describes the edits it made, and a live preview of the branded email on the right](https://emailflow.ai/files/docs/builder-studio.png?v=380457e0) *Screenshot: The AI Design Studio — describe the email you want on the left, watch it take shape on the right.* ## What you can do - **Design with AI.** The [AI Design Studio](https://emailflow.ai/docs/ai-builder) turns a plain-English prompt into a complete, responsive email, then edits it conversationally — no drag-and-drop and no HTML required. - **Start from thousands of templates.** Browse a huge gallery of professionally designed layouts and customize any of them with AI. - **Send campaigns.** One-off newsletters, announcements, and [A/B tests](https://emailflow.ai/docs/campaign-ab-testing) with real-time reporting. - **Automate journeys.** Welcome series, abandoned-cart, and re-engagement flows on a [visual canvas](https://emailflow.ai/docs/automation-flow-editor) — or built for you by AI. - **Stay in the inbox.** DKIM domain authentication, verified senders, and [automatic email verification](https://emailflow.ai/docs/email-verification), all managed by us. ## Managed sending, zero server setup Every plan sends through our managed [Amazon SES infrastructure](https://emailflow.ai/docs/sending-amazon-ses) — no sending servers to connect, no AWS account, no API keys. The only setup is [verifying your sending domain](https://emailflow.ai/docs/sending-domains) with a few DNS records, and then your mail goes out DKIM-signed as you with 99%+ deliverability. Bounces, complaints, IP reputation, and contact verification are all handled automatically — included on every plan, including Free. ## How EmailFlow AI is organized The app groups everything into a few core areas: **Templates** (your designs and the gallery), **Campaigns** (one-time sends), **Automations** (ongoing flows), **Audience** (lists, subscribers, segments, and forms), and **Brand** (your logo, colors, voice, and the assets the AI uses). Account-level settings cover sending, deliverability, plans, and team members. > New here? The fastest path to value is to scan your website once in [Company & Brand scan](https://emailflow.ai/docs/brand-scan), then generate your first email in the [AI builder](https://emailflow.ai/docs/ai-text-to-email). ## Getting help Every page in these docs maps to a real area of the app. Use the left navigation to browse by topic, or the on-this-page list to jump within a guide. When you're ready, [create a free account](https://emailflow.ai/users/register) — the Free Forever plan needs no credit card — and follow along. Every paid plan also includes a 14-day free trial if you want to explore the higher limits first. --- ## Quickstart Page URL: https://emailflow.ai/docs/quickstart # Quickstart Go from sign-up to a sent (or scheduled) campaign in about ten minutes. This guide takes the fastest path: scan your brand, generate an email with AI, point it at a list, and send. ## 1. Create your account Head to [sign-up](https://emailflow.ai/users/register) and create an account. The **Free Forever** plan requires no credit card and includes a monthly allotment of AI tokens and sends, so you can build and ship straight away. Prefer to evaluate a paid tier? Every paid plan comes with a **14-day free trial** — a card is required to start one, but you are not charged until the trial ends, and you can cancel anytime before then. ![The EmailFlow AI dashboard after sign-up, showing list, campaign, and subscriber counts plus 7-day sending stats and a sending activity chart](https://emailflow.ai/files/docs/dashboard.png?v=d4b72e17) *Screenshot: Your dashboard right after sign-up — lists, campaigns, subscribers, and sending stats at a glance.* ## 2. Scan your brand (optional but recommended) Open [Company & Brand scan](https://emailflow.ai/docs/brand-scan) and enter your website URL. EmailFlow AI reads your site, then extracts your logo, color palette, fonts, and tone of voice into a reusable [brand profile](https://emailflow.ai/docs/brand-voice). Doing this once means every AI-generated email already looks like you. ## 3. Generate your first email Open the [AI text-to-email builder](https://emailflow.ai/docs/ai-text-to-email) and describe what you want in plain English — for example, “a spring product-launch announcement with a hero image and a single Shop Now button.” The AI returns a complete, responsive email. Refine it by chatting (“make the headline bolder,” “swap the hero for something brighter”), and use [Remix for My Brand](https://emailflow.ai/docs/remix-for-brand) to apply your colors, fonts, and voice in one click. > Every meaningful change creates a checkpoint, so you can revert to any earlier version without losing work. See [Editing with chat](https://emailflow.ai/docs/editing-with-chat). ## 4. Add your audience Create a [list](https://emailflow.ai/docs/lists) and [import your contacts](https://emailflow.ai/docs/subscribers) from a CSV or add them manually. New contacts are verified automatically as they're added or imported, so invalid and risky addresses are filtered before you ever send to them — at no extra charge. ## 5. Send or schedule 1. Create a [campaign](https://emailflow.ai/docs/campaign-create) and attach your AI-built email. 2. Choose [recipients](https://emailflow.ai/docs/campaign-recipients) (a whole list or a [segment](https://emailflow.ai/docs/segments)). 3. Write a subject line — or have [AI generate options](https://emailflow.ai/docs/campaign-subject) for you. 4. Send immediately or [schedule](https://emailflow.ai/docs/campaign-schedule) it for later. It's delivered through our managed Amazon SES infrastructure, signed as your verified domain. ## Where to go next Want to nurture contacts automatically? Build a flow in [Automations](https://emailflow.ai/docs/automations-overview). Want to maximize open and click rates? Set up an [A/B test](https://emailflow.ai/docs/campaign-ab-testing). To make sure you land in the inbox, finish [domain authentication](https://emailflow.ai/docs/sending-domains). --- ## Core concepts Page URL: https://emailflow.ai/docs/core-concepts # Core concepts A quick tour of the building blocks in EmailFlow AI and how they fit together. Understanding these five ideas — templates, audience, campaigns, automations, and brand — makes everything else in the product click. ## Templates and emails An **email** is the design you send: its layout, copy, images, and HTML. You can create one from a plain-English prompt in the [AI builder](https://emailflow.ai/docs/ai-text-to-email), start from the [template gallery](https://emailflow.ai/docs/template-gallery), or build it by hand. Your saved designs live in Templates and can be reused across campaigns and automations. Every email is responsive by default and previewed live as you edit. ![The EmailFlow AI dashboard with the navigation grouping the product into Design Studio, Campaigns, Automations, Brand Assets, Audience, Sending, and Integration sections](https://emailflow.ai/files/docs/dashboard.png?v=d4b72e17) *Screenshot: The app mirrors these concepts — Studio, Campaigns, Automations, Audience, and Sending in one nav.* ## Audience: lists, subscribers, and segments Your contacts are organized into [lists](https://emailflow.ai/docs/lists). Each contact is a [subscriber](https://emailflow.ai/docs/subscribers) with an email address and any [custom fields](https://emailflow.ai/docs/custom-fields) you define (first name, company, plan, and so on). A [segment](https://emailflow.ai/docs/segments) is a saved filter over a list — for example, “subscribers in Japan who opened the last campaign” — that you can target instead of the whole list. ## Campaigns vs. automations A [campaign](https://emailflow.ai/docs/campaigns-overview) is a one-time send: you pick an email, choose recipients, and send or schedule it. An [automation](https://emailflow.ai/docs/automations-overview) is an ongoing flow that reacts to events — a new subscriber, a birthday, a tag being added — and sends the right message at the right time, on its own. Use campaigns for newsletters and announcements; use automations for welcome series, re-engagement, and lifecycle journeys. ## Brand Your [brand profile](https://emailflow.ai/docs/brand-voice) stores your logo, colors, fonts, and tone of voice. The AI uses it to keep every email on-brand, and [Brand Assets](https://emailflow.ai/docs/brand-assets) gives the AI real images to work with. You can build this profile automatically by [scanning your website](https://emailflow.ai/docs/brand-scan). ## Sending and credits Sending is fully managed: every plan delivers through our [managed Amazon SES infrastructure](https://emailflow.ai/docs/sending-servers), and the only setup is [verifying your sending domain](https://emailflow.ai/docs/sending-domains). Three things are metered. **AI tokens** power the AI features (generation, remixing, brand scanning, subject lines) and reset each billing cycle; your **monthly email volume** covers campaign and automation sends and also resets each cycle; your **contact limit** caps how many people you can store. All are set by your [plan](https://emailflow.ai/docs/plans-quotas). See [AI credits & tokens](https://emailflow.ai/docs/ai-credits) for details. > A good mental model: **Brand** defines how things look and sound, **Audience** defines who you reach, **Templates** are what you send, and **Campaigns** and **Automations** are how and when you send them. --- ## Account setup Page URL: https://emailflow.ai/docs/account-setup # Account setup A short checklist to get your account ready for real sending. Most of it is one-time setup — the main step is verifying your sending domain, which takes a couple of minutes of DNS work. ## 1. Profile and company details From your account settings, add your company name, physical mailing address, and contact details. A valid postal address is more than a formality: anti-spam law (CAN-SPAM, CASL, and similar) requires a real address in commercial email, and EmailFlow AI uses it to populate the footer of your messages. Set your timezone too — it's used when you [schedule campaigns](https://emailflow.ai/docs/campaign-schedule). ## 2. Verify your sending domain This is the single most important step — and the only technical one. Open **Sending › Domains**, add the domain you send from, and publish the DNS records we generate (an ownership TXT record plus **DKIM** CNAME records). Once they resolve, click **Verify** and every email you send is authenticated as your domain on our [managed delivery infrastructure](https://emailflow.ai/docs/sending-servers). Full walkthrough: [Sending domains & DKIM](https://emailflow.ai/docs/sending-domains). ![The sending domain page for an unverified domain, listing the exact DNS TXT records to publish: a domain-identity record and a DKIM signature record, each with a copy button and a pending status](https://emailflow.ai/files/docs/domain-records.png?v=5d960112) *Screenshot: Add your domain and publish the DNS records we generate — each row has a copy button and live verification status.* > There are no sending servers to connect — every plan sends through our managed [Amazon SES infrastructure](https://emailflow.ai/docs/sending-amazon-ses) with 99%+ deliverability. ## 3. Choose your From address Pick the *From* name and address your recipients will see — any address at your verified domain works, no per-address verification needed. See [Verified senders](https://emailflow.ai/docs/verified-senders) for picking an identity that builds trust and keeps replies flowing to the right inbox. ## 4. Build your brand profile Run a one-time [brand scan](https://emailflow.ai/docs/brand-scan) so the AI learns your logo, colors, fonts, and voice. This makes every generated email look like yours from the first draft. You can refine the captured details anytime in [Brand Voice](https://emailflow.ai/docs/brand-voice). ## 5. Import your audience Create your first [list](https://emailflow.ai/docs/lists) and [import contacts](https://emailflow.ai/docs/subscribers). Imported and newly added contacts are verified automatically, so risky addresses are filtered before they can hurt your sender reputation — included in your plan at no extra charge. ## 6. Invite your team On plans that include multiple seats, invite teammates from [Users & roles](https://emailflow.ai/docs/users-roles) and assign each person the appropriate role. Your plan's seat count is listed under [Plans & quotas](https://emailflow.ai/docs/plans-quotas). Once these are in place you're ready to send confidently. Jump back to the [Quickstart](https://emailflow.ai/docs/quickstart) to ship your first campaign. --- # AI Design Studio ## Overview Page URL: https://emailflow.ai/docs/ai-builder # AI Design Studio The AI Design Studio is where emails come to life. Describe what you want in plain English and the AI builds a complete, responsive, on-brand email — then you refine it by chatting. There is no drag-and-drop and no HTML to hand-write. The Studio brings together everything you need to design an email in one screen: a conversation panel on one side and a live preview on the other. Whatever you ask for appears instantly, and every change is reversible. ![The AI Design Studio with the chat conversation on the left, where the AI summarizes each edit and offers revert-to-checkpoint links, and a live preview of the generated welcome email on the right](https://emailflow.ai/files/docs/builder-studio.png?v=380457e0) *Screenshot: The Studio in one screen: chat on the left, live preview on the right, checkpoints after every edit.* ## What's inside the Studio - **[Text-to-email builder](https://emailflow.ai/docs/ai-text-to-email).** Turn a prompt into a finished email in seconds. - **[Conversational editing](https://emailflow.ai/docs/editing-with-chat).** Refine copy, layout, colors, and structure by simply asking. - **[Code & preview](https://emailflow.ai/docs/code-preview).** See a live preview and, when you want it, the underlying HTML. - **[AI image remix](https://emailflow.ai/docs/ai-image-remix).** Regenerate or restyle any image in the design. - **[Remix for My Brand](https://emailflow.ai/docs/remix-for-brand).** Apply your colors, fonts, and voice in one click. - **[Template gallery](https://emailflow.ai/docs/template-gallery).** Start from thousands of professionally designed layouts. ## How it works Under the hood, the Studio is a pure-HTML editor driven by AI. You never leave plain language: you ask, the AI edits the email's HTML, and the preview updates. Because the output is standard, responsive HTML, it renders reliably across email clients and is ready to send as-is. ## Checkpoints and revert Every meaningful edit creates a checkpoint. If a change doesn't land the way you hoped, revert to any earlier version with one click — experiment freely without fear of losing a good draft. Read more in [Editing with chat](https://emailflow.ai/docs/editing-with-chat). > The AI features draw from your monthly [AI token](https://emailflow.ai/docs/ai-credits) allotment. Generating and editing emails, remixing images, and scanning your brand all use tokens, which reset each billing cycle. ## When to use the manual builder Prefer hands-on control over the markup? The [manual builder](https://emailflow.ai/docs/manual-builder) lets you edit content directly. Most people stay in the AI flow for speed and drop into code only for fine-tuning. ## Frequently asked questions **Do I need any design or coding skills?** No. The whole point of the Studio is that you describe what you want in plain English and the AI handles the design and the HTML. If you *do* know HTML, the [code view](https://emailflow.ai/docs/code-preview) is there when you want it. **Will my emails look right in every inbox?** Designs are built as standard, responsive, email-safe HTML and previewed live, so they render reliably across major clients and adapt to mobile and desktop screens. **What happens to my drafts?** Your work is saved as you go, and every meaningful edit creates a checkpoint you can return to. Finished designs live in your Templates, ready to attach to a [campaign](https://emailflow.ai/docs/campaign-create) or an [automation](https://emailflow.ai/docs/automations-overview). Nothing is sent until you choose to send it. --- ## AI text-to-email builder Page URL: https://emailflow.ai/docs/ai-text-to-email # AI text-to-email builder Describe the email you want and the AI designs a complete, responsive version in seconds. This is the fastest way to go from idea to a polished, send-ready email. ## Writing a good prompt The builder understands natural language, so write the way you'd brief a designer. The more intent you give, the closer the first draft lands. A strong prompt usually mentions: - **Purpose** — a product launch, newsletter, sale, event invite, or welcome email. - **Key content** — the headline, the offer, and the call to action you want. - **Tone** — playful, premium, urgent, or understated. - **Structure** — a hero image, feature grid, single button, and so on. > Example: “A spring product-launch announcement for our new running shoes. Bright hero image, three feature highlights, and one clear *Shop Now* button. Energetic but premium tone.” ## From prompt to email 1. Open the builder and type your prompt. 2. The AI generates a complete, responsive email with layout, copy, and placeholder or AI-generated imagery. 3. Review it in the [live preview](https://emailflow.ai/docs/code-preview). 4. Refine anything by [chatting](https://emailflow.ai/docs/editing-with-chat) — no need to start over. ![The AI Design Studio after generating an email from a prompt: the chat panel on the left explains what was built, and the live preview on the right shows the finished welcome email with headline, intro copy, perks list, and call-to-action button](https://emailflow.ai/files/docs/builder-studio.png?v=380457e0) *Screenshot: A finished generation — the AI explains what it built in chat while the preview shows the send-ready email.* ## Make it yours Once you have a draft, apply your identity with [Remix for My Brand](https://emailflow.ai/docs/remix-for-brand) to pull in your colors, fonts, and voice, and use [AI image remix](https://emailflow.ai/docs/ai-image-remix) to regenerate any visual that isn't quite right. If you'd rather not start from a blank prompt, browse the [template gallery](https://emailflow.ai/docs/template-gallery) and ask the AI to adapt a design you like. ## Token usage Generating and editing emails consumes [AI tokens](https://emailflow.ai/docs/ai-credits) from your monthly allotment. Larger, more complex emails and longer editing sessions use more tokens; the allotment resets every billing cycle and scales with your [plan](https://emailflow.ai/docs/plans-quotas). ## Iterate, don't restart The first draft is a starting point, not a final answer. The most effective way to work is to generate once, then refine in small steps. If the layout is close but the tone is off, ask for a tone change rather than regenerating the whole email. If one section is wrong, fix that section. This keeps the parts you like intact and steers the AI toward exactly what you want. ## Common use cases - **Newsletters** — a recurring update with multiple short sections and links. - **Product launches** — a bold hero, a few feature highlights, and one strong call to action. - **Promotions** — a time-bound offer with clear urgency and a single button. - **Welcome emails** — a warm introduction that sets expectations for what's coming next. Whatever you're sending, start from the goal and let the AI translate it into a polished, on-brand design. --- ## Editing with chat Page URL: https://emailflow.ai/docs/editing-with-chat # Editing with chat After the AI builds your email, you refine it the same way you created it — by talking to it. Ask for changes in plain English and watch the preview update. No menus, no markup. ## What you can ask for Conversational editing handles everything from tiny copy tweaks to structural changes. Common requests include: - “Make the headline shorter and punchier.” - “Change the button color to match my brand and label it *Get started*.” - “Add a three-column feature section under the hero.” - “Rewrite the body in a more casual tone.” - “Swap the hero image for something brighter.” Each instruction is applied to the current design, so you can iterate quickly without re-describing the whole email. ![A chat edit and its result side by side: the user asks for a customer testimonial section above the footer, the AI confirms the change, and the preview shows the new quote section it added to the product announcement email](https://emailflow.ai/files/docs/editing-chat.png?v=86e2fd2c) *Screenshot: Cause and effect: ask for a testimonial section in chat, and the preview shows exactly what the AI added.* ## Checkpoints and revert Every change you make is captured as a checkpoint. The Studio keeps a history of your versions, so if an edit goes the wrong way you can revert to any earlier point with a single click. This makes experimentation safe: try a bold idea, and if it doesn't work, roll it back instantly. > Think of checkpoints as save points in your design. You can always return to a version you liked, even after several rounds of edits. ## Targeted vs. broad edits You can be as specific or as open-ended as you like. Targeted edits (“change just the footer text”) keep the rest of the design untouched, while broad requests (“make the whole email feel more premium”) let the AI restyle multiple elements at once. If you need pixel-level control, switch to the [code view](https://emailflow.ai/docs/code-preview) and adjust the HTML directly. ## Tips for great results - Make one or two changes per message for predictable results. - Reference elements by what they are (“the hero,” “the second button”). - Run [Remix for My Brand](https://emailflow.ai/docs/remix-for-brand) after the structure is settled to lock in your identity. Conversational edits use [AI tokens](https://emailflow.ai/docs/ai-credits), so very long sessions consume more of your monthly allotment. ## Frequently asked questions **Can I undo a change I don't like?** Yes. Every edit creates a checkpoint, so you can revert to any earlier version with a single click — experiment without worry. **Why did the AI change something I didn't ask about?** Broad requests (“make it feel more premium”) intentionally touch multiple elements. If you want a surgical change, say exactly what to edit and what to leave alone. **Will editing break the responsive layout?** No — the AI keeps the email responsive as it edits. Use the [live preview](https://emailflow.ai/docs/code-preview) to confirm how it looks on mobile and desktop, and ask for adjustments if anything needs tuning. When the design is right, lock in your identity with [Remix for My Brand](https://emailflow.ai/docs/remix-for-brand). --- ## Code & preview Page URL: https://emailflow.ai/docs/code-preview # Code & preview The Studio shows your email exactly as recipients will see it, and gives you direct access to the underlying HTML whenever you want it. You get the speed of AI with the control of code. ## Live preview As you generate and edit, a live preview renders your email in real time. Because every design is built as standard, responsive HTML, the preview reflects how the email behaves across screen sizes — so you can check that it looks right on both desktop and mobile before you send. Use it to sanity-check spacing, image choices, button placement, and overall hierarchy. ## The code view When you need precise control, open the code tab to see the email's HTML in a full syntax-highlighted editor. This is useful for: - Fine-tuning spacing, alignment, or inline styles. - Pasting in a snippet or adjusting a specific element by hand. - Auditing exactly what will be sent. Edits in the code view and edits via [chat](https://emailflow.ai/docs/editing-with-chat) stay in sync, so you can move between them freely — let the AI do the heavy lifting, then polish the markup yourself. ![The Code Editor tab in the Studio: syntax-highlighted email HTML with line numbers, plus Copy HTML, Export HTML File, and Apply Changes buttons, alongside the chat history](https://emailflow.ai/files/docs/code-view.png?v=060aa8b5) *Screenshot: The code view — the exact HTML that ships, with copy, export, and apply controls.* > The output is portable, email-safe HTML. There's no proprietary block format to wrestle with, so what you see in the code view is what gets delivered. ## Responsive by default Designs are built to adapt to the recipient's device without extra work from you. The preview helps you confirm that hero images scale, columns stack on small screens, and buttons stay tappable. If something doesn't adapt the way you want, ask the AI to adjust it or tweak the HTML directly. ## Previewing before you send Before launching a [campaign](https://emailflow.ai/docs/campaign-create), give the email one final review in the preview and, where supported, send yourself a test. Pair this with [a strong subject line](https://emailflow.ai/docs/campaign-subject) and clean [recipient targeting](https://emailflow.ai/docs/segments) for the best results. ## Tips for using the code view - **Make small, deliberate edits.** The preview updates as you go, so change one thing and confirm it before moving on. - **Keep styles inline.** Email clients ignore much external CSS, so inline styles render most reliably. - **Let the AI do the heavy lifting.** Use chat to build or restructure sections, then hand-tune the details in code. - **Check both screen sizes.** Toggle between desktop and mobile in the preview before you finalize. ## When you're done Once the preview looks right at every size, your email is ready to use. Attach it to a [campaign](https://emailflow.ai/docs/campaign-create) or an [automation](https://emailflow.ai/docs/automations-overview), pair it with a strong [subject line](https://emailflow.ai/docs/campaign-subject), and send with confidence — what you previewed is exactly what your recipients receive. --- ## AI image remix Page URL: https://emailflow.ai/docs/ai-image-remix # AI image remix Don't settle for a stock photo that's almost right. AI image remix lets you regenerate or restyle any image in your email until it fits the message — without leaving the Studio or opening a separate design tool. ## What it does Pick an image in your design and describe how you want it to change. The AI generates a new version based on your instruction — a different season, a new color treatment, a fresh composition, or a completely different subject. The remixed image drops straight back into the email in place of the original. ![The AI Image Remix popover open over an image in the email: a prompt asking for the same scene tinted to brand navy with the company wordmark added, an include-original-as-reference checkbox, and a Generate Image button](https://emailflow.ai/files/image-remix.png?v=516d702e) *Screenshot: Select an image, describe the change, and Generate — the remix drops straight back into the design.* ## How to remix an image 1. Select the image you want to change in the builder. 2. Describe the result you're after — for example, “same product on a sunlit beach instead of a studio backdrop.” 3. Review the generated options and keep the one you like. 4. Continue editing, or revert to the original from your [checkpoints](https://emailflow.ai/docs/editing-with-chat) if you change your mind. ## Great prompts for images - Be specific about subject, setting, mood, and color. - Mention the format you need (wide hero, square, product close-up). - Reference your brand palette so visuals stay consistent — or run [Remix for My Brand](https://emailflow.ai/docs/remix-for-brand) afterward. > Want every image to match your identity automatically? Combine image remix with [Brand Assets](https://emailflow.ai/docs/brand-assets) so the AI works from visuals that already belong to your brand. ## Token usage Image generation is one of the more compute-intensive AI features, so each remix draws from your monthly [AI token](https://emailflow.ai/docs/ai-credits) allotment. If you're iterating heavily on visuals, keep an eye on your remaining tokens — they reset every billing cycle and scale with your [plan](https://emailflow.ai/docs/plans-quotas). ## Getting the result you want Image generation rewards clear, descriptive prompts. If the first result isn't right, refine your description rather than repeating it — add detail about the lighting, angle, or background, or call out what to remove. Small, specific adjustments steer the AI far better than vague retries. ## Frequently asked questions **Can I get my original image back?** Yes. Remixing is non-destructive — your earlier versions are preserved as [checkpoints](https://emailflow.ai/docs/editing-with-chat), so you can always revert. **Will remixed images stay on-brand?** Mention your brand colors and style in the prompt, draw on your [brand assets](https://emailflow.ai/docs/brand-assets), or run [Remix for My Brand](https://emailflow.ai/docs/remix-for-brand) afterward to align the whole email at once. --- ## Remix for My Brand Page URL: https://emailflow.ai/docs/remix-for-brand # Remix for My Brand One click takes any email — an AI draft, a gallery template, or something you've been editing — and rebuilds it in your brand's colors, fonts, and voice. It's the fastest way to make a generic design unmistakably yours. ## What it changes Remix for My Brand reads your [brand profile](https://emailflow.ai/docs/brand-voice) and applies it across the whole email: - **Colors** — backgrounds, buttons, and accents shift to your palette. - **Typography** — headings and body text adopt your brand fonts. - **Voice** — copy is adjusted toward your tone, whether that's playful, premium, or plainspoken. - **Imagery** — the design leans on your [brand assets](https://emailflow.ai/docs/brand-assets) where it makes sense. ![A remix conversation in the Studio: the user asks to remix the template to match their brand, and the AI lists every change it made — brand navy and gold colors, the company logo, and rewritten copy — beside the rebranded email preview](https://emailflow.ai/files/docs/remix-brand.png?v=d3a1c180) *Screenshot: One remix request — the AI reports each color, logo, and copy change as the preview turns on-brand.* ## Set up your brand first Remix is only as good as your brand profile, so build one before you use it. The quickest route is a one-time [website scan](https://emailflow.ai/docs/brand-scan), which captures your logo, colors, fonts, and voice automatically. You can fine-tune anything it captured in [Brand Voice](https://emailflow.ai/docs/brand-voice). > Workflow tip: get the structure right first with [chat editing](https://emailflow.ai/docs/editing-with-chat), then run Remix for My Brand to lock in your identity in a single step. ## When to use it Reach for Remix for My Brand whenever you start from something that isn't yet on-brand — a [gallery template](https://emailflow.ai/docs/template-gallery), a quick AI draft, or an email shared by a teammate. Because it restyles the existing design rather than rebuilding from scratch, your layout and content stay intact while the look and tone snap into place. ## Token usage Each remix uses [AI tokens](https://emailflow.ai/docs/ai-credits) from your monthly allotment, since it rewrites styling and copy across the email. The allotment resets every billing cycle and scales with your [plan](https://emailflow.ai/docs/plans-quotas). ## A typical workflow 1. Start from a [gallery template](https://emailflow.ai/docs/template-gallery) or an [AI draft](https://emailflow.ai/docs/ai-text-to-email). 2. Get the structure and content right with [chat editing](https://emailflow.ai/docs/editing-with-chat). 3. Click Remix for My Brand to apply your colors, fonts, and voice in one pass. 4. Fine-tune any remaining details, then send. ## Frequently asked questions **Does it change my layout?** No — Remix restyles the existing design rather than rebuilding it, so your structure and content stay put while the look and tone update. **What if I haven't set up my brand yet?** Run a quick [website scan](https://emailflow.ai/docs/brand-scan) first; it captures your logo, colors, fonts, and voice automatically so Remix has something to work from. --- ## Template gallery Page URL: https://emailflow.ai/docs/template-gallery # Template gallery Don't want to start from a blank prompt? Browse 12,000+ professionally designed email templates, preview any of them live, and make one yours in a click — then customize it with AI. ## Browsing the gallery The gallery is a fast, visual grid you can scroll endlessly — new designs load automatically as you go, so there's no clicking through pages. Each card shows a true-to-life preview of the email, so you can judge the layout at a glance. The selection spans newsletters, product launches, sales and promotions, welcome emails, events, and more. ![The template gallery: a grid of real email designs — newsletters, product launches, and referral campaigns — each card showing a live preview of the full email](https://emailflow.ai/files/docs/template-gallery.png?v=034e5882) *Screenshot: The gallery grid — every card is a real, fully designed email you can open and remix.* ## Preview before you commit Hover or tap a template to reveal quick actions, and open a full live preview to see exactly how the email is built — rendered the same way a recipient would see it. This lets you evaluate spacing, imagery, and structure before you bring a design into your account. > You can browse a large sample of the gallery on the public [Templates](https://emailflow.ai/templates) page before you even sign up. ## From template to your email 1. Find a template you like and open its preview. 2. Use it to start a new email in the [AI Design Studio](https://emailflow.ai/docs/ai-builder). 3. Run [Remix for My Brand](https://emailflow.ai/docs/remix-for-brand) to apply your colors, fonts, and voice. 4. Adjust copy and images with [chat](https://emailflow.ai/docs/editing-with-chat) or [image remix](https://emailflow.ai/docs/ai-image-remix). ## Templates vs. AI generation Templates and the [text-to-email builder](https://emailflow.ai/docs/ai-text-to-email) are complementary. Start from a template when you've seen a layout you love; start from a prompt when you have a specific idea in mind. Either way, you finish in the same Studio with the same AI editing tools at hand. ## Choosing the right template With so many designs to choose from, start from your goal. Picking a layout whose structure already matches your message — a hero-led launch, a multi-section newsletter, a single-offer promo — means less editing later. Look for the right *shape* first; colors, copy, and images are all easy to change once the design is in the Studio. ## Frequently asked questions **Are templates responsive?** Yes — every template is built as responsive, email-safe HTML and adapts to mobile and desktop. **Will a template look generic?** Not after you make it yours. Run [Remix for My Brand](https://emailflow.ai/docs/remix-for-brand) to apply your identity, and swap visuals with [image remix](https://emailflow.ai/docs/ai-image-remix), and even a popular template becomes unmistakably yours. --- ## Manual builder Page URL: https://emailflow.ai/docs/manual-builder # Manual builder Sometimes you want to put your hands directly on the design. The manual builder gives you full control over your email's content and HTML, so you can fine-tune exactly what you need while still keeping the AI tools one click away. ## When to go manual The AI flow is the fastest path for most emails, but hands-on editing shines when you want to: - Adjust precise spacing, alignment, or inline styles. - Paste in an existing HTML snippet or block you've used before. - Make a single small change without describing it to the AI. - Audit and clean up the exact markup that will be sent. ## Editing directly The manual builder works on the same standard, responsive HTML that the AI produces, shown in a syntax-highlighted [code view](https://emailflow.ai/docs/code-preview) alongside the live preview. Make a change and the preview updates so you can confirm the result immediately. Because there's no proprietary block format, what you edit is exactly what gets delivered. ![Hands-on editing in the syntax-highlighted code editor: the email's full HTML with line numbers and Apply Changes, Copy HTML, and Export HTML File controls](https://emailflow.ai/files/docs/code-view.png?v=060aa8b5) *Screenshot: Direct HTML editing — standard, portable markup with apply, copy, and export controls.* > Manual and AI editing aren't separate worlds. Build the bulk of the email with [AI](https://emailflow.ai/docs/ai-text-to-email), then drop into the code view for the finishing touches — they stay in sync. ## Staying email-safe Email clients are notoriously inconsistent, so the safest designs use simple, well-supported HTML and inline styles. If you're editing by hand, lean on the live [preview](https://emailflow.ai/docs/code-preview) to catch layout issues early, and keep images and buttons resilient on small screens. When in doubt, ask the AI to clean up or restructure a section for you. ## Combine with the rest of the Studio Even in manual mode you can call on [image remix](https://emailflow.ai/docs/ai-image-remix) to refresh visuals and [Remix for My Brand](https://emailflow.ai/docs/remix-for-brand) to re-apply your identity after structural changes. When the design is ready, attach it to a [campaign](https://emailflow.ai/docs/campaign-create) or an [automation](https://emailflow.ai/docs/automations-overview). ## Frequently asked questions **Do I lose AI help if I edit by hand?** Not at all. Manual edits and AI edits work on the same email and stay in sync, so you can switch between them at any time. **Is hand-written HTML safe to send?** Yes, as long as you stick to simple, well-supported markup and inline styles. Use the live [preview](https://emailflow.ai/docs/code-preview) to catch rendering issues before you send. **When should I prefer the AI flow?** For most emails, start with [AI generation](https://emailflow.ai/docs/ai-text-to-email) — it's faster and produces clean, responsive HTML. Reach for the manual builder when you need precise control over a specific detail the AI got *almost* right. --- # Campaigns ## Overview Page URL: https://emailflow.ai/docs/campaigns-overview # Campaigns overview A campaign is a one-time email send: you choose an email, pick who receives it, and send it now or schedule it for later. Campaigns are how you ship newsletters, announcements, and promotions — with real-time reporting on everything that happens after you hit send. ## Campaigns vs. automations Use a **campaign** for a single, deliberate send to a list or segment. Use an [automation](https://emailflow.ai/docs/automations-overview) when you want messages to go out continuously in response to events (a new subscriber, a birthday, a tag). If you find yourself sending the same email to everyone who joins a list, that's a sign it belongs in an automation. ![The Campaigns page: a searchable, filterable table of campaigns with status, delivered, open-rate, and click-rate columns, plus quick-action cards for templates, audience, and automations](https://emailflow.ai/files/docs/campaigns-list.png?v=6c761743) *Screenshot: The Campaigns home — every send with its status and results, one Create campaign button away.* ## The lifecycle of a campaign 1. **[Create](https://emailflow.ai/docs/campaign-create)** the campaign and attach an email built in the [AI Design Studio](https://emailflow.ai/docs/ai-builder). 2. **[Choose recipients](https://emailflow.ai/docs/campaign-recipients)** — a whole list or a targeted [segment](https://emailflow.ai/docs/segments). 3. **[Set the subject](https://emailflow.ai/docs/campaign-subject)**, or generate options with AI. 4. Optionally set up an **[A/B test](https://emailflow.ai/docs/campaign-ab-testing)** to find the best version. 5. **[Send or schedule](https://emailflow.ai/docs/campaign-schedule)** — it's delivered through our managed Amazon SES infrastructure. 6. **[Review reports](https://emailflow.ai/docs/campaign-reports)** as opens, clicks, and bounces roll in. ## Sending is handled for you Once you've [verified your sending domain](https://emailflow.ai/docs/sending-domains), EmailFlow AI delivers your campaign through our [managed Amazon SES infrastructure](https://emailflow.ai/docs/sending-servers), signs it with DKIM as your domain, and processes bounces and complaints automatically. Recipients are drawn from your verified contacts, and risky addresses are filtered by [automatic verification](https://emailflow.ai/docs/email-verification) before the send. > Every plan includes a generous monthly email volume alongside its contact cap — see [Plans & quotas](https://emailflow.ai/docs/plans-quotas) for the per-tier numbers. ## What you can measure After a campaign goes out, the [reports](https://emailflow.ai/docs/campaign-reports) show opens, clicks, bounces, unsubscribes, and link-level engagement in real time — so you can learn what resonated and apply it to the next send. ## Best practices for campaigns - **Target a [segment](https://emailflow.ai/docs/segments), not always the whole list.** Relevance lifts engagement and protects your reputation. - **Lead with a strong [subject line](https://emailflow.ai/docs/campaign-subject).** It's the single biggest driver of opens. - **Test before you commit.** An [A/B test](https://emailflow.ai/docs/campaign-ab-testing) finds the winning version and sends it to the rest automatically. - **Send at the right time.** Use [scheduling](https://emailflow.ai/docs/campaign-schedule) to reach your audience when they're most likely to be in their inbox. ## After you send The work isn't over at send time. Open your [reports](https://emailflow.ai/docs/campaign-reports) to see opens, clicks, and bounces as they arrive, learn which links earned attention, and turn those insights into sharper segments and stronger follow-ups next time. --- ## Create a campaign Page URL: https://emailflow.ai/docs/campaign-create # Create a campaign Creating a campaign takes a few minutes: name it, attach an email, point it at an audience, and set a subject. Here's how each step works and what to get right before you send. ## 1. Name and basics Give the campaign a clear internal name (recipients never see it) so you can find it later in your reports — for example, “March Newsletter” or “Spring Sale — Day 1.” Set the *From* name and address — [any address at your verified sending domain](https://emailflow.ai/docs/verified-senders) works — and a reply-to address if it differs. ![Step 2 of the campaign wizard: campaign name, email subject with an AI Generate button, From name, and From email fields, beside advanced settings for open tracking, click tracking, and DKIM signing](https://emailflow.ai/files/docs/campaign-setup.png?v=a8956629) *Screenshot: The setup step — name, subject (with AI Generate), sender identity, and tracking options in one pass.* ## 2. Attach your email Choose the email this campaign will send. You can build a fresh one in the [AI Design Studio](https://emailflow.ai/docs/ai-text-to-email), reuse a saved design, or start from the [template gallery](https://emailflow.ai/docs/template-gallery). Run [Remix for My Brand](https://emailflow.ai/docs/remix-for-brand) first if you want it on-brand from the start. ## 3. Choose recipients Select the [list](https://emailflow.ai/docs/lists) or [segment](https://emailflow.ai/docs/segments) to send to. Targeting a segment — rather than an entire list — usually lifts engagement and protects your sender reputation. See [Recipients](https://emailflow.ai/docs/campaign-recipients) for details. ## 4. Write the subject Your [subject line](https://emailflow.ai/docs/campaign-subject) is the single biggest driver of open rate. Write your own or have the AI generate several options to choose from. > Pre-send checklist: email looks right in the [preview](https://emailflow.ai/docs/code-preview), your From address is at an [authenticated domain](https://emailflow.ai/docs/sending-domains), recipients are correct, and the subject is set. ## 5. Review and send Do a final review, then [send or schedule](https://emailflow.ai/docs/campaign-schedule) the campaign. Want to optimize before committing the whole list? Set up an [A/B test](https://emailflow.ai/docs/campaign-ab-testing) so EmailFlow AI can find the winning version for you and send it to everyone else automatically. ## Frequently asked questions **Can I send a test to myself first?** Always preview your email in the [live preview](https://emailflow.ai/docs/code-preview) and, where supported, send yourself a test before launching to your full audience. **What if I picked the wrong list?** You choose recipients before sending, so review the selected [list or segment](https://emailflow.ai/docs/campaign-recipients) carefully on the review step — nothing goes out until you confirm. **Do I need to set up sending?** There are no servers to connect — every plan sends through our [managed delivery infrastructure](https://emailflow.ai/docs/sending-servers). Just [verify your sending domain](https://emailflow.ai/docs/sending-domains) once (a few DNS records) and you're ready to send or [schedule](https://emailflow.ai/docs/campaign-schedule). --- ## Recipients Page URL: https://emailflow.ai/docs/campaign-recipients # Recipients Who you send to matters as much as what you send. EmailFlow AI lets you target an entire list or a precise segment, and it automatically keeps risky and duplicate addresses out of the send. ## Lists and segments The simplest option is to send to a whole [list](https://emailflow.ai/docs/lists). For sharper targeting, send to a [segment](https://emailflow.ai/docs/segments) — a saved filter such as “subscribers who opened the last campaign” or “contacts in the EU on the Pro plan.” Segments typically improve open and click rates because the message is more relevant to who receives it. ![The Choose your recipients step of the campaign wizard: a mailing list picker set to a list, an optional segment dropdown beside it, and an Add another list button](https://emailflow.ai/files/docs/campaign-recipients.png?v=e0f782c5) *Screenshot: Pick a list, optionally narrow it with a segment, and stack more lists if you need them.* ## Clean recipients by default Before a campaign goes out, EmailFlow AI works from your verified contacts. Thanks to [automatic verification](https://emailflow.ai/docs/email-verification), addresses that are invalid or high-risk are filtered out, and unsubscribed or suppressed contacts are never included. This protects your sender reputation and improves deliverability — and it's handled for you at no extra charge. > You don't need to scrub your list manually. Verification runs as contacts are imported or added, and again as a safeguard before sending. ## Targeting tips - Prefer engaged segments over “everyone” for promotions — it lifts results and lowers complaints. - Use [custom fields](https://emailflow.ai/docs/custom-fields) (location, plan, interests) to build precise segments. - Suppress recent recipients if you're sending frequently, to avoid fatigue. ## Quotas The number of contacts you can store — and your monthly email volume — are set by your [plan](https://emailflow.ai/docs/plans-quotas). Every email a campaign delivers counts toward that monthly volume, so a send to a 2,000-contact segment uses 2,000 emails. If adding recipients would exceed your contact limit, or a send would exceed your remaining volume, you'll see a clear prompt before anything goes out — you're never charged automatically. Higher tiers raise both limits. ## Frequently asked questions **Do I have to clean my list before sending?** No. [Automatic verification](https://emailflow.ai/docs/email-verification) filters invalid and risky addresses as contacts are added and again before a send, so your list stays healthy without manual scrubbing. **Will unsubscribed people get my email?** Never. Unsubscribed and suppressed contacts are excluded from every send automatically, keeping you compliant. **Can I exclude people who got my last email?** Yes — build a [segment](https://emailflow.ai/docs/segments) based on recent engagement or sends to avoid fatiguing your most-contacted subscribers, which keeps complaints low and engagement high. --- ## Subject & AI subject lines Page URL: https://emailflow.ai/docs/campaign-subject # Subject & AI subject lines The subject line is the first thing a recipient sees and the biggest lever on your open rate. Write your own, or let EmailFlow AI generate a set of options tailored to your email's content. ## AI-generated subject lines Rather than staring at a blank field, ask the AI for ideas. It reads your email and proposes several subject-line options in different styles — curiosity-driven, benefit-led, urgent, or playful. Pick the one you like, edit it, or regenerate for more. It's the fastest way to break writer's block and test different angles. ![The campaign setup step with the email subject field and its AI Generate button highlighted next to the campaign name and sender fields](https://emailflow.ai/files/docs/campaign-setup.png?v=a8956629) *Screenshot: The subject field lives on the campaign setup step — AI Generate is one click away.* > Generating subject lines uses a small amount of your [AI token](https://emailflow.ai/docs/ai-credits) allotment — far less than building a full email. ## What makes a strong subject - **Be specific.** “Your March report is ready” beats “Newsletter.” - **Keep it short.** Many inboxes truncate after ~40–50 characters, especially on mobile. - **Front-load value.** Put the most compelling word first. - **Match the content.** Misleading subjects spike unsubscribes and complaints. ## Preview text The preview (or preheader) text is the snippet shown next to or under the subject in most inboxes. Treat it as a second subject line: use it to extend the hook rather than repeat it. A strong subject plus complementary preview text noticeably improves opens. ## Test it with A/B Not sure which subject will win? Don't guess — run an [A/B test](https://emailflow.ai/docs/campaign-ab-testing). Send competing subject lines to a slice of your audience, let EmailFlow AI measure open rates, and have it automatically send the winner to everyone else. ## Subject-line mistakes to avoid - **Clickbait.** Over-promising spikes opens but tanks trust and drives unsubscribes and spam complaints. - **ALL CAPS and excessive punctuation.** They look spammy and can hurt deliverability. - **Vague subjects.** “An update” gives no reason to open; be concrete. - **Ignoring the preview text.** Leaving it empty wastes prime inbox real estate. ## Frequently asked questions **How long should a subject be?** Aim for around 40–50 characters so it isn't truncated on mobile, and front-load the most important words. **Do emojis help?** Used sparingly and on-brand, an emoji can add personality — but test it with [A/B testing](https://emailflow.ai/docs/campaign-ab-testing) rather than assuming, since results vary by audience. --- ## Schedule & send Page URL: https://emailflow.ai/docs/campaign-schedule # Schedule & send When everything's ready, you can send a campaign right away or schedule it for a future date and time. Either way, delivery runs through our managed Amazon SES infrastructure — EmailFlow AI handles the queueing and scheduling. ## Send now Choose *Send now* and EmailFlow AI begins delivering immediately. Messages are queued and sent at a pace that protects deliverability — we handle throttling and sending-rate management for you, so a large send won't trip spam filters. Your [plan's send rate](https://emailflow.ai/docs/plans-quotas) sets how quickly large campaigns go out. ![The Schedule step of the campaign wizard with two cards: Send now to start sending immediately after launch, and Schedule for later to pick a specific date and time](https://emailflow.ai/files/docs/campaign-schedule.png?v=21eb8d6a) *Screenshot: One choice at the schedule step: send the moment you launch, or pick the exact date and time.* ## Schedule for later Pick a date and time and the campaign will send automatically when it arrives. Scheduling is ideal for hitting the moment your audience is most likely to be in their inbox, or for preparing a send in advance. Times use the timezone in your [account settings](https://emailflow.ai/docs/account-setup), so confirm it's correct before scheduling. > Once your [domain is verified](https://emailflow.ai/docs/sending-domains), EmailFlow AI handles scheduling, queueing, and delivery through our managed infrastructure — no manual operation required. ## What happens at send time - Recipients are resolved from your chosen list or [segment](https://emailflow.ai/docs/segments). - [Verification](https://emailflow.ai/docs/email-verification) filters out invalid and risky addresses. - Unsubscribed and suppressed contacts are excluded automatically. - Each message is signed with DKIM as your domain and delivered through our managed infrastructure. - Opens, clicks, and bounces start flowing into your [reports](https://emailflow.ai/docs/campaign-reports) in real time. ## A/B sends If your campaign is an [A/B test](https://emailflow.ai/docs/campaign-ab-testing), EmailFlow AI first sends the variants to a test slice of your audience, waits for the window you set, then automatically delivers the winning version to everyone who hasn't been emailed yet — no manual step required. ## Frequently asked questions **Can I cancel or reschedule a scheduled campaign?** Yes — until a scheduled send begins, you can change its time or stop it entirely. **Why didn't everything send instantly?** Large sends are paced to protect deliverability. Your [plan's send rate](https://emailflow.ai/docs/plans-quotas) determines how quickly a big campaign is delivered — this throttling is deliberate and keeps you out of spam filters. **Do I need to keep my computer on?** No. Scheduling runs in the cloud, so your campaign sends at the chosen time whether or not you're online — just confirm your [account timezone](https://emailflow.ai/docs/account-setup) is correct. --- ## A/B testing Page URL: https://emailflow.ai/docs/campaign-ab-testing # A/B testing Stop guessing which email performs best. Create competing variants, send them to a slice of your audience, and let EmailFlow AI measure the results and automatically deliver the winner to everyone else. ## What you can test An A/B test compares two or more variants of the same campaign. Each variant is a full email, so they can differ in whatever you want to learn about: - **Subject line** — the most common test, and the biggest lever on open rate. - **Sender name** — does a person or the brand get more opens? - **Content** — different layouts, copy, images, or calls to action. You assign each variant a share of the test audience, and you can mark one as the control. ## How winner selection works Choose how the winner is decided and EmailFlow AI does the rest: - **By open rate** — best for subject-line and sender tests. - **By click rate** — best for content and call-to-action tests. - **Manual** — you review the results and pick the winner yourself. For automatic criteria, you set a **wait window** (anywhere from 1 to 720 hours). When the window closes, EmailFlow AI evaluates the variants and declares the winner. ## Testing on a subset You decide what portion of your audience receives the test — from a small sample up to the entire list. With a partial test (say, 20%), the variants go to the test slice first; the remaining contacts then receive the winning version automatically. Test the whole list when you simply want to split your audience evenly between variants. > For statistically meaningful results, test on a large enough sample and give the wait window enough time for opens and clicks to accumulate — a few hours at minimum, longer for smaller lists. ## Auto-sending the winner Once the winner is declared — automatically by your chosen criteria or manually by you — EmailFlow AI sends it to every remaining recipient who hasn't been emailed yet. You get the benefit of a controlled experiment without lifting a finger after setup. Results for every variant appear in your [campaign reports](https://emailflow.ai/docs/campaign-reports). ## Frequently asked questions **How many variants can I test?** Two or more. Most tests compare two versions for clear results, but you can add more when you have several distinct ideas to compare. **What if it's a tie or there's not enough data?** Give the test a long enough wait window and a large enough sample so opens and clicks can accumulate. For close calls, choose the *manual* criterion and review the numbers yourself before declaring a winner. **Does the winner reach everyone?** Yes — once the winner is decided, it's sent automatically to every remaining recipient who wasn't part of the test slice, so no one is left out. --- ## Reports & logs Page URL: https://emailflow.ai/docs/campaign-reports # Reports & logs Every send is measured. Campaign reports show opens, clicks, bounces, and unsubscribes in real time, with link-level detail and per-recipient logs — so you can see exactly what worked and act on it. ## Headline metrics - **Opens** — how many recipients opened the email, and your open rate. - **Clicks** — total and unique clicks, and your click-through rate. - **Bounces** — addresses that couldn't receive the message, split by hard and soft bounces. - **Unsubscribes & complaints** — opt-outs and spam reports, which help you protect list health. ## Link and engagement detail Drill into which links got the most clicks to learn what your audience actually cared about. This link-level breakdown is invaluable for deciding what to feature next time and where to place your primary call to action. ## Per-recipient logs Beyond the aggregate numbers, you can see activity at the individual level — who opened, who clicked, and what bounced. These logs are useful for troubleshooting deliverability questions and for building re-engagement [segments](https://emailflow.ai/docs/segments) from people who did (or didn't) engage. > Reports update live as events arrive, so you can watch a send's performance build in the minutes and hours after launch. ## Deliverability signals Bounces, complaints, and unsubscribes aren't just metrics — they're inputs to your sender reputation. EmailFlow AI processes bounces and complaints automatically and suppresses problem addresses, but watching these trends helps you keep lists clean and maintain strong [deliverability](https://emailflow.ai/docs/email-verification) over time. ## Turn results into your next send Use what you learn to sharpen the next campaign: refine your [segments](https://emailflow.ai/docs/segments), iterate on [subject lines](https://emailflow.ai/docs/campaign-subject), and feed winning ideas into your [automations](https://emailflow.ai/docs/automations-overview). For optimizing a single send, pair reports with [A/B testing](https://emailflow.ai/docs/campaign-ab-testing). ## Metrics worth watching over time - **Open rate** — a read on subject-line and sender appeal. - **Click-through rate** — how compelling your content and calls to action are. - **Bounce rate** — a signal of list health; rising bounces mean it's time to clean up. - **Unsubscribe and complaint rates** — early warnings of fatigue or irrelevance. ## Frequently asked questions **Why is my open rate approximate?** Opens rely on a tracking pixel that some inboxes block or pre-fetch, so treat opens as a trend rather than an exact count. Clicks are a more reliable engagement signal. **How do I improve weak numbers?** Tighten your [targeting](https://emailflow.ai/docs/segments), test [subject lines](https://emailflow.ai/docs/campaign-subject), and feed winning ideas into your [automations](https://emailflow.ai/docs/automations-overview). --- # Automations ## Overview Page URL: https://emailflow.ai/docs/automations-overview # Automations overview Automations send the right message at the right time, on their own. Build welcome series, birthday emails, re-engagement journeys, and cart-recovery flows once — then let them run for every contact who qualifies. ## How automations differ from campaigns A [campaign](https://emailflow.ai/docs/campaigns-overview) is a single send to a list. An automation is an ongoing flow that reacts to events: someone subscribes, a birthday arrives, a tag is added, a field changes. When a contact triggers the flow, they enter it and move through your steps automatically — no manual sending required. ![The Automations page: a table of workflows with status, trigger, email count, and created date, with search, status filters, and a New Automation button](https://emailflow.ai/files/docs/automations-list.png?v=7b1488f9) *Screenshot: The Automations home — each flow with its trigger, email count, and status, one click from the canvas.* ## The anatomy of a flow Every automation starts with a **trigger** (what enters a contact) and continues with a sequence of **nodes** (what happens next): sending emails, waiting, branching on behavior, updating contacts, and calling webhooks. You arrange these visually in the [flow editor](https://emailflow.ai/docs/automation-flow-editor). See [Triggers & nodes](https://emailflow.ai/docs/automation-triggers) for the full list. ## Common automations to build - **Welcome series** — greet new subscribers and introduce your brand over a few days. - **Birthday & anniversary** — send a timed message on a contact's special date. - **Re-engagement** — win back contacts who haven't opened in a while. - **Cart recovery** — remind WooCommerce shoppers who left items behind. - **Onboarding by behavior** — branch the journey based on who opens or clicks. > Short on time? Describe the journey you want and let [AI automation chat](https://emailflow.ai/docs/automation-ai-chat) assemble the flow for you, then tweak it on the canvas. ## Plan limits You can build as many automations as you like on every plan. Emails sent by automations count toward the same monthly email volume as your campaigns and go out through our managed delivery infrastructure. Track who's in each flow and how it's performing under [Contacts & reports](https://emailflow.ai/docs/automation-contacts). ## Frequently asked questions **How is an automation different from scheduling a campaign?** A scheduled campaign sends once at a set time. An automation runs continuously, reacting to each contact's behavior and timing, so every new subscriber gets the right message without you lifting a finger. **Can a contact be in more than one automation?** Yes. A contact can move through several flows at once — for example, a welcome series and a birthday flow — each triggered independently. **Do I have to build flows from scratch?** No. Describe the journey you want and let [AI automation chat](https://emailflow.ai/docs/automation-ai-chat) assemble it, then refine it on the [canvas](https://emailflow.ai/docs/automation-flow-editor). --- ## Visual flow editor Page URL: https://emailflow.ai/docs/automation-flow-editor # Visual flow editor The flow editor is a visual canvas where you assemble an automation by connecting nodes. Drag in steps, wire them together, and see the whole journey at a glance — no code required. ## Building on the canvas Every flow begins with a [trigger](https://emailflow.ai/docs/automation-triggers) node that defines who enters. From there you add nodes and connect them to form a path. Contacts flow from the trigger down through each connected step in order, waiting and branching exactly as you've laid out. ![A welcome flow on the visual canvas: a New subscriber joins trigger connected to a welcome email, a 3-day wait, a product catalog email, and a condition that branches into Yes and No paths with different follow-up emails](https://emailflow.ai/files/docs/automation-canvas.png?v=047f1575) *Screenshot: A complete welcome journey on the canvas — trigger, sends, a wait, and a Yes/No branch at a glance.* ## The building blocks You assemble flows from a small, powerful set of node types: - **Send** — deliver an email built in the [AI Design Studio](https://emailflow.ai/docs/ai-builder). - **Wait** — pause for a set duration before the next step. - **Wait until** — hold until a specific time or condition is met. - **Condition** — branch the flow into *Yes* and *No* paths based on whether a contact opened or clicked. - **Operation** — tag, untag, copy, move, or update a contact. - **Webhook** — notify an external system as a contact reaches a step. Full reference: [Triggers & nodes](https://emailflow.ai/docs/automation-triggers). ## Branching journeys Condition nodes are what make automations feel intelligent. Split contacts who opened your welcome email from those who didn't, and send each group a different follow-up. Because each branch is its own path, you can nest decisions to build genuinely personalized journeys. > Start simple. A trigger, one email, a wait, and a follow-up is a complete, effective flow — you can always add branches later. ## Reviewing and activating As you build, the canvas shows the structure of the journey so you can spot gaps before going live. When the flow is ready, activate it and contacts begin entering as they trigger it. Monitor progress and per-step results in [Contacts & reports](https://emailflow.ai/docs/automation-contacts). ## Design tips for flows - **Map the happy path first.** Build the main sequence, then add [condition](https://emailflow.ai/docs/automation-triggers) branches for edge cases. - **Give people room to breathe.** Use wait nodes so contacts aren't overwhelmed with back-to-back emails. - **Wire up both branches.** Every condition produces a Yes and a No path — decide what happens on each. - **Tag as you go.** Use operation nodes to label engaged contacts for later [segmentation](https://emailflow.ai/docs/segments). ## Activating and iterating Nothing sends until you activate the flow, so build and review with confidence. After it's live, watch per-step results in [Contacts & reports](https://emailflow.ai/docs/automation-contacts) and return to the canvas to refine timing, copy, or branching as you learn what works. --- ## Triggers & nodes Page URL: https://emailflow.ai/docs/automation-triggers # Triggers & nodes This is the complete reference for what can start an automation and what can happen inside one. A flow is a trigger plus a sequence of nodes you connect on the [canvas](https://emailflow.ai/docs/automation-flow-editor). ## Triggers: what enters a contact A trigger defines the event that drops a contact into the flow. EmailFlow AI supports these triggers: - **Welcome new subscriber** — when someone joins a list. - **Say goodbye** — when a contact unsubscribes. - **Happy birthday** — on a contact's birthday. - **Subscriber added on a date** — based on when a contact was added. - **Specific date** — a one-time scheduled date. - **Weekly recurring** and **Monthly recurring** — on a repeating schedule. - **Tag added** and **Tag removed** — when a contact's tags change. - **Attribute update** — when a custom field value changes. - **API** — triggered programmatically from your own systems. - **WooCommerce abandoned cart** — when a shopper leaves items behind. ![The trigger settings panel for a New subscriber joins trigger, explaining that subscribers enter the workflow the moment they confirm their subscription, with a Change button to pick a different trigger](https://emailflow.ai/files/docs/automation-trigger.png?v=d2410852) *Screenshot: Click any trigger node to open its settings — each trigger explains exactly when contacts enter.* ## Nodes: what happens next Once a contact enters, they move through the nodes you connect: - **Send** — deliver an email. - **Wait** — pause for a duration (minutes, hours, or days). - **Wait until** — hold until a specific time or condition. - **Condition** — branch on whether the contact *opened* or *clicked*, into *Yes* and *No* paths. - **Operation** — modify the contact (see below). - **Webhook** — send data to an external URL. ## Operations Operation nodes act on the contact without sending an email. You can **tag** or **remove a tag**, **copy** or **move** the contact to another list, or **update** a custom field. These are perfect for organizing your audience as they progress — for example, tagging everyone who clicks so you can [segment](https://emailflow.ai/docs/segments) them later. > Condition nodes only produce two outcomes — *Yes* and *No* — so every contact always has a defined path. Wire up both branches for the journeys you care about. ## Putting it together A typical welcome flow: trigger on *new subscriber*, send a welcome email, *wait* two days, branch on whether they *opened* it, then send a tailored follow-up to each path and *tag* the engaged group. Build it visually in the [flow editor](https://emailflow.ai/docs/automation-flow-editor) or describe it to [AI automation chat](https://emailflow.ai/docs/automation-ai-chat). --- ## AI automation chat Page URL: https://emailflow.ai/docs/automation-ai-chat # AI automation chat Describe the journey you want in plain English and AI automation chat builds the flow for you — triggers, emails, waits, and branches included. It's the fastest way to stand up a sophisticated automation. ## Build a flow by describing it Instead of dragging every node onto the [canvas](https://emailflow.ai/docs/automation-flow-editor), just say what you're trying to achieve — for example, “Welcome new subscribers with an intro email, wait two days, and if they didn't open it, send a reminder.” The AI assembles the corresponding trigger and nodes, ready for you to review. ![The AI automation assistant beside the flow canvas: the chat lists each step it planned — condition windows, Yes and No branches with a discount email and a friendly reminder — while the canvas shows the assembled welcome flow with trigger, sends, wait, and branch nodes](https://emailflow.ai/files/automation-ai.png?v=ddbb01ea) *Screenshot: Describe the journey and the AI assembles it — the chat explains each step as the canvas fills in.* ## Edit and refine in conversation The flow isn't fixed once it's built. Keep chatting to adjust it: “add a 3-day wait before the last email,” “tag everyone who clicks,” or “split the path for people on the Pro plan.” The AI updates the flow in place, so you shape the journey through dialogue rather than manual wiring. > Changed your mind? You can revert AI edits to an earlier version of the flow, so experimenting with structure is always safe. ## You stay in control AI automation chat and the visual editor work on the same flow, so you can move between them freely. Let the AI scaffold the structure, then fine-tune individual nodes by hand — or vice versa. Nothing goes live until you activate the automation yourself. ## Tips for great flows - State the trigger, the emails, the timing, and any branches in your request. - Build incrementally — start with the happy path, then add conditions. - Review the generated [triggers and nodes](https://emailflow.ai/docs/automation-triggers) before activating. ## Token usage Building and editing flows with AI uses your monthly [AI token](https://emailflow.ai/docs/ai-credits) allotment, like the other AI features. The allotment resets each billing cycle and scales with your [plan](https://emailflow.ai/docs/plans-quotas). ## Example prompts - “Welcome new subscribers, wait a day, then send a getting-started tip.” - “If a contact clicks the offer, tag them *interested* and send a follow-up; if not, wait three days and try a different angle.” - “Send a birthday email each year with a discount code.” ## Frequently asked questions **Can I edit what the AI built?** Absolutely. Keep chatting to adjust the flow, or open the [visual editor](https://emailflow.ai/docs/automation-flow-editor) and change nodes by hand — both work on the same flow. **What if the AI gets it wrong?** You can revert AI changes to an earlier version, and nothing goes live until you activate the automation yourself, so you're always in control. --- ## Contacts & reports Page URL: https://emailflow.ai/docs/automation-contacts # Contacts & reports Once an automation is live, you can see who's in it, where they are in the journey, and how each step is performing — so you can prove the flow's value and improve it over time. ## Who's in the flow As contacts trigger an automation, they enter and progress through your connected nodes. The automation tracks each contact's position, so you can see who is currently waiting, who has moved down a particular branch, and who has completed the journey. This visibility is especially useful for branching flows, where different contacts take different paths. ## Per-step performance Each **Send** node reports its own results — opens, clicks, and bounces — just like a [campaign](https://emailflow.ai/docs/campaign-reports). Because you can see results step by step, it's easy to spot exactly where a journey loses people and which message drives the most engagement. > Reading per-node numbers is the quickest way to optimize: if a follow-up underperforms, adjust its timing, subject, or content and watch the next cohort respond. ## Using tags and fields Automations can label contacts as they progress using [operation nodes](https://emailflow.ai/docs/automation-triggers) — tagging engaged contacts, updating a field, or moving someone to another list. Those changes feed straight back into your [segments](https://emailflow.ai/docs/segments), so an automation can quietly build the audiences you'll target in future campaigns. ## Keeping flows healthy - Review per-step reports periodically and prune steps that don't earn their place. - Watch bounce and unsubscribe trends — automations send continuously, so issues compound. - Automation sends share your plan's [monthly email volume](https://emailflow.ai/docs/plans-quotas) with campaigns; your contact limit applies as usual. To change the structure of a live flow, head back to the [visual editor](https://emailflow.ai/docs/automation-flow-editor) or ask [AI automation chat](https://emailflow.ai/docs/automation-ai-chat) to adjust it. ## Frequently asked questions **Can I see exactly where a contact is in a flow?** Yes — the automation tracks each contact's position, so you can tell who's waiting, who took which branch, and who has finished. **Do automation emails count against a sending limit?** Yes — automation emails count toward your plan's [monthly email volume](https://emailflow.ai/docs/plans-quotas), the same meter as campaigns. The allotment resets every billing cycle. **How do I improve a flow that's underperforming?** Read the per-step numbers to find where engagement drops, then adjust that message's timing, subject, or content — or rethink a branch — in the [editor](https://emailflow.ai/docs/automation-flow-editor). --- # Audience ## Lists Page URL: https://emailflow.ai/docs/lists # Lists A list is a collection of contacts you can send to. Lists are the foundation of your audience — you import contacts into them, build segments on top of them, and target them with campaigns and automations. ## What a list is for Think of a list as a group of people who share a relationship with you — newsletter subscribers, customers, or event attendees. Most accounts need only a handful of well-organized lists. Within a list you can target specific groups using [segments](https://emailflow.ai/docs/segments) rather than creating a separate list for every audience slice. ![A list overview page: subscriber count, average open rate, click rate, subscribe and unsubscribe rates, unconfirmed and blacklisted counts, with tabs for settings, subscribers, segments, forms, and list fields](https://emailflow.ai/files/docs/list-overview.png?v=108a69cb) *Screenshot: Each list has its own overview — growth, engagement rates, and tabs for everything the list owns.* ## Creating and organizing lists Create a list, give it a clear name, and you're ready to [add contacts](https://emailflow.ai/docs/subscribers). Keep your structure simple: - Use a few broad lists (for example, “Newsletter” and “Customers”). - Differentiate audiences with [segments](https://emailflow.ai/docs/segments) and [custom fields](https://emailflow.ai/docs/custom-fields), not dozens of lists. - Reserve separate lists for genuinely separate audiences with different consent. ## Consent and list health Only add contacts who have agreed to hear from you. Clean, permission-based lists are the single biggest factor in deliverability. EmailFlow AI helps by running [automatic verification](https://emailflow.ai/docs/email-verification) on contacts as they're added, filtering invalid and risky addresses before they can damage your sender reputation. > Grow lists the right way with a signup [form](https://emailflow.ai/docs/forms) — new subscribers land directly in the list you choose and can kick off a welcome [automation](https://emailflow.ai/docs/automations-overview). ## List limits Your [plan](https://emailflow.ai/docs/plans-quotas) sets how many lists and contacts you can keep, and how many subscribers a single list may hold. If you approach a limit you'll see a clear prompt; higher tiers raise these allowances substantially. To learn how individual contacts work, continue to [Subscribers & import](https://emailflow.ai/docs/subscribers). ## Frequently asked questions **Should I make a new list for every audience?** Usually not. A few broad lists plus [segments](https://emailflow.ai/docs/segments) and [custom fields](https://emailflow.ai/docs/custom-fields) are easier to manage than many overlapping lists — and they avoid emailing the same person twice. **Can the same contact be on two lists?** Yes. Reserve separate lists for genuinely separate audiences with different consent; otherwise lean on segments within one list. **What keeps a list healthy?** Permission-based growth through [forms](https://emailflow.ai/docs/forms), automatic [verification](https://emailflow.ai/docs/email-verification), and automatic suppression of unsubscribes and bounces — all handled for you. --- ## Subscribers & import Page URL: https://emailflow.ai/docs/subscribers # Subscribers & import A subscriber is a single contact in a list: an email address plus any details you store about them. You can add subscribers one at a time, import them in bulk from a file, or collect them through a form — and every new contact is verified automatically. ## Adding contacts There are three ways contacts enter a list: - **Manually** — add a single contact with their email and any [custom fields](https://emailflow.ai/docs/custom-fields). - **By import** — upload a CSV to add many contacts at once. - **Via a form** — let people [subscribe themselves](https://emailflow.ai/docs/forms). ![The subscriber table for a list: each row shows email, first and last name, date added, a Subscribed status badge, and a verification column, with status filters and search above](https://emailflow.ai/files/docs/subscribers.png?v=189f9201) *Screenshot: The subscriber table — status badges, verification state, filters, and search across every contact.* ## Importing from a CSV 1. Prepare a CSV with an email column and any extra columns you want to keep (first name, company, and so on). 2. Choose the destination [list](https://emailflow.ai/docs/lists) and upload the file. 3. Map your columns to the matching [fields](https://emailflow.ai/docs/custom-fields) so data lands in the right place. 4. Run the import — contacts are added and verification begins automatically. ![The CSV import wizard: a four-step sidebar (Upload CSV, Map fields, Settings, Import) with a drag-and-drop upload area and a Download sample CSV link](https://emailflow.ai/files/docs/import-wizard.png?v=58f955fb) *Screenshot: The import wizard — drop in a CSV, map columns to fields, choose duplicate handling, and run it.* > You don't need a separate list-cleaning tool. As contacts are imported or added, [automatic verification](https://emailflow.ai/docs/email-verification) filters out invalid and high-risk addresses — included in your plan at no extra charge. ## Subscriber status Contacts carry a status that controls whether they can be emailed — for example, subscribed, unsubscribed, or suppressed after a hard bounce or complaint. Unsubscribed and suppressed contacts are automatically excluded from sends, so you stay compliant without manual effort. ## Keeping data useful The richer your contact data, the sharper your targeting. Store attributes in [custom fields](https://emailflow.ai/docs/custom-fields) and you can build precise [segments](https://emailflow.ai/docs/segments) — by location, plan, interests, or behavior — for more relevant campaigns. Your [plan](https://emailflow.ai/docs/plans-quotas) sets how many contacts you can store in total and per list. ## Import tips - **Use a header row.** Clear column names make mapping to [fields](https://emailflow.ai/docs/custom-fields) quick and accurate. - **Import only permission-based contacts.** Uploading purchased or scraped lists harms deliverability and breaks anti-spam rules. - **Keep values consistent.** Standardize things like country names so your [segments](https://emailflow.ai/docs/segments) stay reliable. ## Frequently asked questions **What happens to duplicate or invalid rows?** Duplicates are reconciled to a single contact, and [automatic verification](https://emailflow.ai/docs/email-verification) filters out invalid and risky addresses — so a messy import still lands clean. **Can I add more details later?** Yes. You can update a contact's fields anytime, manually or through an [automation](https://emailflow.ai/docs/automations-overview). --- ## Segments Page URL: https://emailflow.ai/docs/segments # Segments A segment is a saved filter over a list — a living group defined by rules rather than a fixed membership. Target segments instead of whole lists to send more relevant email, lift engagement, and protect your sender reputation. ## Why segment Sending everything to everyone trains recipients to ignore you and pushes mailbox providers to filter you. Segments fix this by letting you reach only the people a message is right for. The result is higher open and click rates, fewer unsubscribes, and better deliverability over time. ## How segments work You define one or more conditions, and the segment automatically includes every contact in the list who matches. Because it's rule-based, a segment updates itself as your data changes — new contacts who match are included, and contacts who no longer match drop out, with no manual upkeep. ![The segment editor: a segment with Match All logic and two conditions — email contains a company domain, and a custom Branch field equal to a specific value — each row with field, operator, and value dropdowns](https://emailflow.ai/files/docs/segment-edit.png?v=4879e41d) *Screenshot: Rule-based targeting — stack conditions on any field and the segment keeps itself up to date.* ## What you can segment on - **Custom fields** — location, plan, company, interests, or anything you store. See [Custom fields](https://emailflow.ai/docs/custom-fields). - **Engagement** — who opened or clicked recent campaigns (great for re-engagement). - **Status and dates** — when a contact was added, and their subscription state. - **Tags** — labels applied manually or by [automations](https://emailflow.ai/docs/automation-triggers). > Automations can build segments for you: tag everyone who clicks a campaign, then target the “clicked” tag in your next send. ## Using segments Select a segment as the [recipients](https://emailflow.ai/docs/campaign-recipients) of a campaign, or use it to decide who enters an [automation](https://emailflow.ai/docs/automations-overview). Your [plan](https://emailflow.ai/docs/plans-quotas) sets how many segments you can save per list. Combine thoughtful segmentation with strong [subject lines](https://emailflow.ai/docs/campaign-subject) for the best results. ## Segment ideas to steal - **Engaged readers** — opened or clicked in the last 30–90 days; your most responsive audience. - **Lapsed contacts** — no engagement recently; perfect for a re-engagement [automation](https://emailflow.ai/docs/automations-overview). - **New subscribers** — added in the last week; ideal for a welcome message. - **By attribute** — location, plan, or interest from your [custom fields](https://emailflow.ai/docs/custom-fields). ## Frequently asked questions **Do segments update automatically?** Yes. They're rule-based, so contacts join or leave a segment as their data and behavior change — no manual upkeep. **Is a segment the same as a list?** No. A [list](https://emailflow.ai/docs/lists) is the contacts themselves; a segment is a saved filter *over* a list. --- ## Forms Page URL: https://emailflow.ai/docs/forms # Forms Forms are how you grow your audience with permission. Publish a signup form, and new subscribers land directly in the list you choose — ready to receive a welcome email and enter your automations. ## Why use a form The healthiest lists are built from people who chose to join. A signup form captures that consent and the contact details you need, then adds the subscriber to the right [list](https://emailflow.ai/docs/lists) automatically. That means clean growth, accurate data, and a clear opt-in record. ![The form builder: a live popup preview with email, first name, last name, and a custom Branch field, beside a panel listing the bound list, its available fields, and a Load list defaults button](https://emailflow.ai/files/docs/form-builder.png?v=586470c5) *Screenshot: The form builder — a live preview of your popup with the bound list's fields one click away.* ## What you can collect At minimum a form collects an email address, but you can ask for more by adding fields that map to your [custom fields](https://emailflow.ai/docs/custom-fields) — first name, company, interests, or anything you segment on. Keep forms short: every extra field reduces sign-ups, so ask only for what you'll actually use. ## From signup to welcome 1. A visitor submits your form. 2. The contact is added to your chosen list with the data they provided. 3. [Verification](https://emailflow.ai/docs/email-verification) checks the address automatically. 4. A [welcome automation](https://emailflow.ai/docs/automations-overview) can greet them right away. > Pair a form with a *Welcome new subscriber* [trigger](https://emailflow.ai/docs/automation-triggers) so every new signup immediately receives a branded introduction — no manual sending required. ## Consent and compliance Forms make it easy to gather and document consent, which keeps you compliant with anti-spam regulations and improves deliverability. Be clear about what subscribers are signing up for, and they'll be more engaged when your email arrives. New contacts from forms count toward your [plan's](https://emailflow.ai/docs/plans-quotas) contact limits. ## Tips for higher sign-ups - **Keep it short.** Ask for an email and maybe a first name; every extra field lowers completion. - **Set expectations.** Tell people what they'll receive and how often. - **Deliver value fast.** Trigger a [welcome automation](https://emailflow.ai/docs/automations-overview) so new subscribers hear from you immediately. ## Frequently asked questions **Where do form sign-ups go?** Straight into the [list](https://emailflow.ai/docs/lists) you choose, with the details they provided mapped to your [custom fields](https://emailflow.ai/docs/custom-fields). **Are form contacts verified?** Yes — [automatic verification](https://emailflow.ai/docs/email-verification) checks each new address, so forms grow your list cleanly without manual cleanup. **Can I place a form on my own website?** Yes. Forms are built to be embedded wherever your audience already is — your homepage, a landing page, or a blog post — so the moment someone signs up they flow straight into your [list](https://emailflow.ai/docs/lists) and any welcome [automation](https://emailflow.ai/docs/automations-overview) you've set up. --- ## Custom fields Page URL: https://emailflow.ai/docs/custom-fields # Custom fields Custom fields are the extra pieces of information you store about each contact — first name, company, location, plan, or anything else. They power personalization and precise segmentation, turning a flat list into a rich, targetable audience. ## What custom fields are for Every contact has an email address, but the details that make email feel personal live in custom fields. Capture them at [import](https://emailflow.ai/docs/subscribers), through a [form](https://emailflow.ai/docs/forms), or via an [automation](https://emailflow.ai/docs/automations-overview), and you can use them everywhere downstream. ![The Manage list fields page: the required Email field plus First name, Last name, and a custom Branch dropdown field, each showing its type and a copyable merge tag like SUBSCRIBER_BRANCH](https://emailflow.ai/files/docs/custom-fields.png?v=66231acb) *Screenshot: List fields — built-in and custom fields side by side, each with its type and ready-to-use merge tag.* ## Two big payoffs - **Personalization** — greet contacts by name and reference details that matter to them, so emails read as one-to-one rather than mass mail. - **Segmentation** — build [segments](https://emailflow.ai/docs/segments) like “customers in Germany on the Pro plan” and send each group exactly the right message. ## Designing good fields Plan your fields around how you'll use them: - Store values you'll segment or personalize on — skip data you'll never act on. - Keep values consistent (for example, a fixed set of country names) so segments stay reliable. - Map import columns to the right field so data lands cleanly. > Automations can keep fields current: an [operation node](https://emailflow.ai/docs/automation-triggers) can update a field as contacts progress, and an *attribute update* trigger can start a flow when a value changes. ## Putting fields to work Once your fields are populated, reference them in your emails for personalization and combine them in [segments](https://emailflow.ai/docs/segments) for targeting. Well-structured custom fields are what let a single list serve many tailored campaigns — the heart of relevant, high-performing email. ## Examples of useful fields - **First name** — for friendly, personalized greetings. - **Location** — for regional offers, events, and timing. - **Plan or tier** — to tailor messaging to customers vs. prospects. - **Interests** — to send only the topics each subscriber cares about. ## Frequently asked questions **Can automations change field values?** Yes — an [operation node](https://emailflow.ai/docs/automation-triggers) can update a field as a contact progresses, and an *attribute update* trigger can even start a flow when a value changes. **How do fields relate to segments?** Fields are the raw data; [segments](https://emailflow.ai/docs/segments) are the filters you build on top of them. Well-structured fields make precise targeting possible. --- # Brand ## Brand Assets Page URL: https://emailflow.ai/docs/brand-assets # Brand Assets Brand Assets is your library of approved images — logos, product shots, lifestyle photos, and graphics — that the AI can draw on when it builds and edits your emails. Give the AI real visuals to work with and every design looks authentically yours. ## Why a managed asset library Generic stock imagery is the quickest way to make an email feel off-brand. By storing your own assets, you ensure the AI reaches for *your* product photos and graphics first — so a generated email looks like it came from your team, not a template. ![The Brand Assets library showing a grid of uploaded brand images — product photos, a logo badge, and AI-remixed seasonal graphics — with search, sort, and upload controls](https://emailflow.ai/files/docs/brand-assets.png?v=0dca1226) *Screenshot: The asset library — every image here is available to the AI when it designs your emails.* ## How the AI understands your assets When you add an image, EmailFlow AI analyzes it with vision AI to understand what it depicts — the subject, style, and colors. That understanding lets the builder pick the right asset for the right spot automatically: a product close-up for a feature block, a wide lifestyle shot for a hero, and so on. You're not just storing files; you're giving the AI context. > Upload a variety — logos on light and dark backgrounds, hero-ratio images, and square product shots — so the AI always has a good fit for each layout. ## Using assets across the Studio Your assets are available throughout the [AI Design Studio](https://emailflow.ai/docs/ai-builder). When you generate an email or run [Remix for My Brand](https://emailflow.ai/docs/remix-for-brand), the AI leans on your library to keep visuals on-brand. You can also combine assets with [AI image remix](https://emailflow.ai/docs/ai-image-remix) to restyle a base image while keeping your subject. ## Part of your brand profile Brand Assets work hand in hand with your [brand voice](https://emailflow.ai/docs/brand-voice) and colors. The fastest way to populate everything at once is a one-time [brand scan](https://emailflow.ai/docs/brand-scan), which captures your logo and visual identity straight from your website. Together, assets, colors, and voice make “on-brand” the default for every email you create. ## Frequently asked questions **Where do my brand assets get used?** Everywhere the AI designs for you — [email builds](https://emailflow.ai/docs/ai-builder), [Remix for My Brand](https://emailflow.ai/docs/remix-for-brand), and subject-line suggestions all draw on your colors, logo, and voice so output looks on-brand from the first draft. **Can I change them later?** Yes. Update your assets anytime and future AI generations pick up the changes immediately — existing emails stay exactly as you left them. **What if I don't have brand guidelines?** Run a [brand scan](https://emailflow.ai/docs/brand-scan) of your website and we'll extract sensible colors, logos, and tone for you to review and tweak. --- ## Company & Brand scan Page URL: https://emailflow.ai/docs/brand-scan # Company & Brand scan Point EmailFlow AI at your website and it builds your brand profile for you. In one step, the scan captures your logo, colors, fonts, and tone of voice — so every AI-generated email is on-brand from the very first draft. ## How the scan works 1. Enter your website URL. 2. EmailFlow AI reads your site — its pages, imagery, and styling. 3. It extracts your visual identity (logo, color palette, fonts) and analyzes the look and language to infer your [tone of voice](https://emailflow.ai/docs/brand-voice). 4. The results are saved as a reusable brand profile you can review and refine. ![A completed brand profile after a website scan: company logo, description, social links, and a six-swatch brand color palette with named roles like primary, accent, and background](https://emailflow.ai/files/docs/brand-scan.png?v=f60c9d65) *Screenshot: A finished scan — logo, company description, social links, and a named color palette, ready to refine or rescan.* ## What it captures - **Logo and imagery** — added to your [Brand Assets](https://emailflow.ai/docs/brand-assets). - **Colors** — your primary and accent palette for backgrounds, buttons, and highlights. - **Typography** — the fonts that represent your brand. - **Voice** — the tone and personality reflected on your site. > Run the scan once during [setup](https://emailflow.ai/docs/account-setup). From then on, generating and remixing emails automatically uses everything it learned. ## Built to be safe Because the scan reads third-party web content, EmailFlow AI is careful about what that content can influence. The text on your site is treated strictly as data for analysis — never as instructions to the AI — so a page can't hijack the scan or alter how the system behaves. You always remain in control of the resulting profile. ## Review and refine A scan gives you an excellent starting point, not a locked result. Open [Brand Voice](https://emailflow.ai/docs/brand-voice) to adjust the captured tone, swap colors, or curate which [assets](https://emailflow.ai/docs/brand-assets) the AI prefers. With your profile in place, [Remix for My Brand](https://emailflow.ai/docs/remix-for-brand) can make any email yours in a single click. ## Frequently asked questions **What does a scan pull in?** It reads your public website to extract brand signals — colors, logo, imagery, and tone of voice — and turns them into editable [brand assets](https://emailflow.ai/docs/brand-assets) you can review. **Is everything it finds final?** No. A scan is a fast starting point, not the last word. Review what it captured and adjust colors, swap the logo, or refine the [voice](https://emailflow.ai/docs/brand-voice) before you rely on it. **My site changed — can I rescan?** Yes. Re-run a scan whenever your branding evolves to refresh your assets in one step. --- ## Brand Voice Page URL: https://emailflow.ai/docs/brand-voice # Brand Voice Your brand voice is the personality behind your words — playful or polished, bold or understated. EmailFlow AI stores your voice alongside your colors and fonts and applies it whenever it writes or rewrites email copy, so your emails always sound like you. ## What brand voice controls Voice shapes the language in every AI-generated email: word choice, sentence rhythm, formality, and energy. When the AI drafts copy in the [builder](https://emailflow.ai/docs/ai-text-to-email) or rewrites it during [Remix for My Brand](https://emailflow.ai/docs/remix-for-brand), it follows your defined voice rather than a generic default. ## Setting your voice The quickest way to establish a voice is a [brand scan](https://emailflow.ai/docs/brand-scan), which infers tone from your website's language. From there you can refine it — describe how you want to sound, adjust the personality, and set guardrails for what to emphasize or avoid. Your saved voice becomes the standard the AI writes to. ![The Brand Voice settings page with fields for brand adjectives describing tone and personality, words and phrases the AI should avoid, and a writing sample to match your style](https://emailflow.ai/files/docs/brand-voice.png?v=3176d998) *Screenshot: Brand Voice settings — adjectives for tone, words to avoid, and a writing sample the AI matches.* > Be concrete when describing your voice. “Warm, direct, and lightly witty — short sentences, no jargon” guides the AI far better than “professional.” ## Part of one brand profile Voice doesn't work in isolation. Together with your [brand assets](https://emailflow.ai/docs/brand-assets) and color palette, it forms a single brand profile the AI consults every time it builds or edits an email. That's what makes “on-brand” the automatic result rather than something you fix by hand each time. ## Keeping it current As your brand evolves, update your voice so new emails reflect it. Re-running a [scan](https://emailflow.ai/docs/brand-scan) after a website refresh is an easy way to keep your profile aligned with how you present yourself today. With voice, assets, and colors set, every campaign and automation starts on-brand. ## Describing your voice well - **Use adjectives.** “Warm, plain-spoken, lightly witty” guides the AI far better than “professional.” - **Name a few do's and don'ts.** For example: contractions yes, jargon no. - **Point to an example.** A line you love gives the AI a concrete target to match. ## Frequently asked questions **Where does voice apply?** To AI-written copy across [email generation](https://emailflow.ai/docs/ai-text-to-email), [chat edits](https://emailflow.ai/docs/editing-with-chat), and subject-line ideas, so your messages sound consistently like you. **Can I override it for one email?** Yes — just tell the AI in chat to be more formal or playful for that piece; your saved voice remains the default. --- # Sending & Deliverability ## Sending domains & DKIM Page URL: https://emailflow.ai/docs/sending-domains # Sending domains & DKIM Verifying your sending domain is the one setup step between you and your first send. You add a few DNS records to prove you own your domain; our [managed delivery infrastructure](https://emailflow.ai/docs/sending-servers) then sends and DKIM-signs mail as you. ## Why authentication matters Mailbox providers (Gmail, Outlook, and the rest) trust mail far more when the sender proves they own the domain it comes from. Authentication is what separates legitimate senders from spoofers. Without it, even great email risks landing in spam; with it, your inbox placement improves immediately. ## What DKIM does **DKIM** (DomainKeys Identified Mail) attaches a cryptographic signature to every message. The receiving server checks that signature against a public key published in your domain's DNS to confirm the message is genuinely from you and wasn't tampered with in transit. EmailFlow AI generates the key and signs each message for you — you simply publish the record. ## DMARC (recommended) **DMARC** (Domain-based Message Authentication, Reporting & Conformance) tells receiving servers what to do with mail that fails SPF or DKIM, and protects your domain from spoofing. It's optional and never required to send, so we show it as a *recommended* row that doesn't affect your verified count. We suggest starting in monitoring mode — publish a TXT record at `_dmarc.yourdomain.com` with the value `v=DMARC1; p=none;`, which never affects delivery while you confirm everything looks right. You can tighten the policy to `quarantine` or `reject` later. See [Amazon SES's DMARC guide](https://docs.aws.amazon.com/ses/latest/dg/send-email-authentication-dmarc.html) for the full rollout. ## How to authenticate 1. Add your sending domain in your account settings. 2. EmailFlow AI generates the DNS records to add, including your DKIM record. 3. Copy them into your domain's DNS (at your registrar or DNS host). 4. Return and verify — once the records resolve, your domain is authenticated. ![A pending sending domain showing the DNS records to publish: a domain-identity TXT record and a DKIM signature TXT record, each with host, value, a copy button, and a pending status, plus a Verify DNS records button](https://emailflow.ai/files/docs/domain-records.png?v=5d960112) *Screenshot: The records table — copy each host and value into your DNS, then click Verify DNS records.* > Verifying your domain is the only setup step — we run the [sending infrastructure](https://emailflow.ai/docs/sending-servers). Publish the records, click Verify, and start sending. ## After authentication With your domain verified, every address at it is a usable [sender identity](https://emailflow.ai/docs/verified-senders) — no per-address verification needed. A [tracking domain](https://emailflow.ai/docs/tracking-domains) is reserved for you automatically as well — publish its recommended CNAME record so open and click links use your own domain too. We also recommend publishing the DMARC record above. Together these complete a professional, inbox-friendly sending setup. ## Frequently asked questions **Why do I need to verify a domain?** Verification (via DNS records like DKIM) proves you're authorized to send from your domain. It's what lets our infrastructure send as you — and it's what keeps your mail out of spam. **How long does it take?** Adding the DNS records takes a few minutes; DNS hosts may need a little time to publish them. Once they're detected, your domain is ready and you can send from [any address at it](https://emailflow.ai/docs/verified-senders). **Can I use a subdomain?** Yes — many senders use a dedicated subdomain (for example, mail.yourdomain.com) to keep marketing reputation separate from their primary domain. --- ## Verified senders Page URL: https://emailflow.ai/docs/verified-senders # Verified senders Your *From* identity — the name and email address recipients see — comes from your [verified sending domain](https://emailflow.ai/docs/sending-domains). Verify a domain once, and every address at that domain is a usable sender: `hello@`, `news@`, `team@`, whatever fits the message. There is no separate per-address verification step. ## How sender identities work Every email needs a *From* address, and mailbox providers only trust mail whose From domain is authenticated. On EmailFlow AI that authentication happens at the **domain** level: when your [sending domain](https://emailflow.ai/docs/sending-domains) verifies, DKIM and SPF are wired in for the whole domain, and any address at it becomes a valid, authenticated sender. This is simpler than verifying addresses one by one — and stronger, because the cryptographic proof covers everything you send. ## Choosing your From address 1. Verify your sending domain (a one-time DNS step — see [Sending domains & DKIM](https://emailflow.ai/docs/sending-domains)). 2. When you create a [campaign](https://emailflow.ai/docs/campaign-create) or automation email, enter any From address at that domain. 3. Set a reply-to address that a real person or team monitors. ![The campaign setup step with the From name and From email fields filled in with an address at the verified sending domain, alongside the subject and tracking options](https://emailflow.ai/files/docs/campaign-setup.png?v=a8956629) *Screenshot: Setting the From identity on a campaign — any address at your verified domain just works.* ## Choosing a good sender identity - Send from your verified domain, not a free mailbox like gmail.com — unauthenticated free-mail Froms are rejected or junked by modern mailbox providers. - Use a recognizable *From* name — your brand, or a person at your brand. - Pick a reply-to address that a real person or team actually monitors. > Consistency builds recognition. Keep your *From* name and address stable so subscribers learn to spot — and open — your email. ## Where it fits Your sender identity works together with [DKIM domain authentication](https://emailflow.ai/docs/sending-domains) and our [managed delivery infrastructure](https://emailflow.ai/docs/sending-servers). With your domain verified, your mail is signed as you, your identity is trusted, and delivery runs through warmed, monitored infrastructure — the recipe for landing in the inbox. ## Why domain-level senders matter - **Trust.** A recognizable From address on an authenticated domain improves opens and reduces spam reports. - **Deliverability.** Aligned, authenticated senders are far more likely to reach the inbox. - **Flexibility.** One domain verification unlocks every address at that domain — no waiting on per-address confirmations. ## Frequently asked questions **What's the difference between a sender and a domain?** The sender is the specific From identity on an email; your [sending domain](https://emailflow.ai/docs/sending-domains) is the authenticated domain that proves you're allowed to send as it. Verify the domain and every sender at it is covered. **Can I use more than one sender?** Yes — use as many addresses at your verified domain as you like (for example, support@ and newsletter@) and pick the right one per campaign. **Can I send from an unverified domain?** No. The From address on campaigns and automations must belong to a domain you have verified — that is what keeps your deliverability (and everyone else's) high. --- ## Sending servers Page URL: https://emailflow.ai/docs/sending-servers # Sending servers EmailFlow AI is a fully-managed sending platform. Every plan sends through our managed Amazon SES delivery infrastructure — there are no sending servers to set up, no third-party accounts to create, and no API keys to paste. You verify your sending domain once and start sending with 99%+ deliverability. ## Who runs the sending infrastructure? We do. Your campaigns and automations are delivered through our Amazon SES infrastructure — the same enterprise-grade delivery network trusted by the world's largest senders. We manage the IPs, the sending reputation, the warm-up, and the relationship with the provider, so you never have to think about MTAs, SMTP credentials, or vendor dashboards. EmailFlow AI provides everything end to end — the AI email builder, automations, lists, segments, contact verification, analytics, *and* the delivery itself. Plans are sized by [contacts, monthly email volume, and AI tokens](https://emailflow.ai/docs/plans-quotas). ## What you set up (it is just DNS) The only thing we need from you is proof that you own the domain you send from. Open **Sending › Domains**, add your domain, and publish the DNS records we generate — an ownership TXT record plus DKIM CNAME records. Once they propagate (usually minutes), click **Verify** and your domain is live. See [Sending domains & DKIM](https://emailflow.ai/docs/sending-domains) for the step-by-step guide. > No AWS account required. We run the Amazon SES infrastructure; you only verify your domain with a few DNS records. Read more in the [Amazon SES infrastructure](https://emailflow.ai/docs/sending-amazon-ses) guide. ## Deliverability, handled Because all delivery flows through infrastructure we operate, we take care of the parts that usually go wrong: DKIM and SPF authentication on your verified domain, automatic **bounce and complaint processing** (hard bounces and spam complaints are unsubscribed for you), warmed sending IPs, and continuous reputation monitoring. Pair your domain with a [custom tracking domain](https://emailflow.ai/docs/tracking-domains) so links are branded as you too. ## Email volume & rate guard Each plan includes a generous monthly email volume — from 5,000 emails a month on Free up to 10,000,000 a month on Enterprise — that resets every billing cycle. A light per-hour send-rate guard paces large bursts to protect deliverability for everyone; the vast majority of senders never touch it, and higher rates are available on request. ## Frequently asked questions **Do I need my own sending server or AWS account?** No. All plans send through our managed infrastructure. There is nothing to install, connect, or pay for separately. **Can I bring my own SMTP server or provider account?** No — and that is by design. Sending through our managed, warmed, monitored infrastructure is what guarantees the 99%+ deliverability on every plan, including Free. **What do I have to configure?** Just your sending domain: add it, publish the DNS records we give you, and verify. Everything else — signing, bounces, complaints, reputation — is automatic. --- ## Amazon SES infrastructure Page URL: https://emailflow.ai/docs/sending-amazon-ses # Amazon SES infrastructure EmailFlow AI delivers every email through our managed Amazon SES infrastructure — the same enterprise-grade delivery network behind many of the world's largest senders. You do not need an AWS account, IAM keys, or SES configuration of any kind: we operate the infrastructure, and you verify your domain on it with a few DNS records. ## How it works When you add a sending domain in EmailFlow AI, we register it on our Amazon SES account behind the scenes and hand you the DNS records SES requires: an ownership TXT record and DKIM CNAME records. Once you publish them and the domain verifies, every email you send is delivered by SES, **DKIM-signed as your domain**, with SPF alignment handled by our infrastructure. Your recipients see mail from you, sent over infrastructure we keep warm and reputable. ## What we manage for you - **Sending IPs & reputation** — warmed, monitored, and protected around the clock. - **DKIM & SPF authentication** — generated when you verify your domain; signing is automatic on every send. - **Bounce & complaint feedback** — SES notifies us instantly; hard bounces and spam complaints are unsubscribed automatically so your lists stay clean. - **Capacity & throughput** — account-level quotas, throttling, and scaling are our problem, not yours. > The result: 99%+ deliverability on every plan — including Free — without you ever opening an AWS console. ## Verify your domain The one step that is yours: prove you own your sending domain. Open **Sending › Domains**, add the domain you send from (for example `news.yourbrand.com` or `yourbrand.com`), and publish the DNS records shown. Verification usually completes within minutes of the records propagating. The full walkthrough is in [Sending domains & DKIM](https://emailflow.ai/docs/sending-domains). ## Why domain verification matters Mailbox providers like Gmail and Outlook require authenticated mail: DKIM proves the message really came from your domain, and SPF proves the sending server was authorized. Verifying your domain wires both into every send automatically. It also means you can use any From address at that domain — `hello@`, `news@`, `team@` — without verifying each one individually. ## Frequently asked questions **Do I need an AWS account?** No. The SES account is ours; you never interact with AWS directly. **Can I send before my domain is verified?** No — mailbox providers reject unauthenticated mail, so verification is required before your first campaign. It only takes a few minutes of DNS work. **Which From addresses can I use?** Any address at a domain you have verified. Verify `yourbrand.com` once and send as `hello@yourbrand.com`, `news@yourbrand.com`, and so on. **What happens to bounces and complaints?** They flow back from SES in real time and are handled automatically — affected addresses are unsubscribed and your reports show exactly what happened. --- ## Email verification Page URL: https://emailflow.ai/docs/email-verification # Email verification Email verification keeps your lists clean by filtering out invalid and risky addresses before you send to them. It runs automatically, it's managed entirely by us, and it's included in your plan at no extra charge — there's no separate verification service to buy or configure. ## Automatic and included You don't run a verification provider or pay per check. EmailFlow AI verifies contacts for you as part of your plan. Verification happens at the moments that matter most — when contacts are [imported or added](https://emailflow.ai/docs/subscribers), and again as a safeguard before a campaign goes out — so bad addresses are caught early and never reach your send. ## How verification works - **Format and DNS/MX checks** — addresses are validated for correct syntax and for a domain that can actually receive mail. - **Risk assessment** — invalid, undeliverable, and high-risk addresses are flagged. - **Result caching** — a verified result is cached for roughly 30 days, so the same address isn't re-checked needlessly. - **Resilient processing** — verification runs across resilient, redundant infrastructure with failover, so it keeps working reliably at volume. > Because verification is built in, you don't connect or maintain any verification server. We provide it as a managed service on every plan, at no extra charge. ## Why it matters Sending to invalid addresses drives up bounces, which mailbox providers read as a signal of a careless sender — hurting placement for everyone on your list. By stripping bad addresses before they're emailed, verification protects your sender reputation, improves deliverability, and stops you wasting sends on addresses that were never going to receive your mail. ## What you'll see Unverified or risky contacts are excluded from sends automatically, so your campaigns reach real inboxes. Combined with [domain authentication](https://emailflow.ai/docs/sending-domains) and our [managed delivery infrastructure](https://emailflow.ai/docs/sending-servers), automatic verification is a core part of keeping you in the inbox — with no effort on your part. ## Frequently asked questions **Do I pay extra for verification?** No. Automatic verification of the contacts in your plan is included at no additional charge — there's nothing to buy or configure. **Will it slow down my sends?** No. Recent results are cached for about 30 days, so addresses you've already checked don't need re-verifying, and sending stays fast. **What happens to invalid addresses?** Invalid and high-risk addresses are filtered out before delivery, so they never count against your sending reputation. This keeps bounce rates low and your [deliverability](https://emailflow.ai/docs/sending-servers) strong without any manual list cleaning. --- ## Tracking domains Page URL: https://emailflow.ai/docs/tracking-domains # Tracking domains A tracking domain makes the open- and click-tracking links in your emails use your own domain instead of a shared one. EmailFlow AI sets one up for you automatically when you add a sending domain — publishing a single CNAME record is all it takes to activate it. ## What tracking links are To measure opens and clicks, EmailFlow AI wraps the links in your email and includes a tracking pixel. When a recipient clicks, the request passes through a tracking URL before redirecting them to the real destination — that's how your [reports](https://emailflow.ai/docs/campaign-reports) know what was clicked. By default these URLs use EmailFlow AI's shared tracking domain; with a tracking domain of your own, every link carries your brand instead. ## Why use your own - **Branding** — links show your domain, which looks more trustworthy to recipients. - **Deliverability** — a self-branded tracking domain aligns with your authenticated sending domain. - **Reputation** — your link reputation is tied to your own domain rather than a shared one. ## How it works When you add and verify a [sending domain](https://emailflow.ai/docs/sending-domains) (say, `yourbrand.com`), EmailFlow AI automatically reserves the tracking hostname `track.yourbrand.com` for you. You'll find it as the *Click tracking (recommended)* record alongside your domain's other DNS records. ![The DNS records table for a sending domain, with the Click tracking (recommended) section listed below the domain-identity and DKIM records — all published from the same page](https://emailflow.ai/files/docs/domain-records.png?v=5d960112) *Screenshot: The tracking CNAME lives in the same DNS records table as your DKIM records — one page, one workflow.* 1. In your DNS host, add a CNAME record: `track.yourbrand.com` → `track.emailflow.ai`. 2. Click **Verify** on the domain records page (or wait — we re-check automatically). 3. Once verified, HTTPS is provisioned automatically and campaigns sent from that domain brand their links with it — no further action needed. > The CNAME must point *directly* at `track.emailflow.ai`. If your DNS host offers a proxy or CDN toggle (for example Cloudflare's orange cloud), turn it **off** for this record — proxying intercepts the secure connection and prevents the certificate from being issued. ## HTTPS, handled You never upload a certificate or run a server. The first time a tracking link on your domain is opened, EmailFlow AI's edge issues a TLS certificate for it automatically and renews it from then on. Your links are served over HTTPS from day one. ## At send time Once `track.yourbrand.com` is verified, any campaign sent from an address at `yourbrand.com` uses it automatically — the campaign wizard's tracking-domain setting defaults to *Automatic*. You can still pick a specific tracking domain per campaign under the wizard's advanced settings if you prefer. ## Where it fits A tracking domain complements [sending-domain authentication](https://emailflow.ai/docs/sending-domains) and [verified senders](https://emailflow.ai/docs/verified-senders). None of these require you to run a server — they're all DNS records you publish while EmailFlow AI handles the [infrastructure](https://emailflow.ai/docs/sending-servers). Together they present a fully-branded, trustworthy sender to mailbox providers. ## Frequently asked questions **Is a tracking domain required?** No — tracking works out of the box, and the CNAME record never blocks your domain verification or your sending. It's a recommended polish for brands that want every link to carry their name. **Do I have to create it somewhere?** No. The `track.` hostname is provisioned for you the moment you add a sending domain. You only publish the CNAME record at your DNS host. **What about the certificate?** Issued and renewed automatically — there is nothing to configure, upload, or renew. **My record won't verify.** Check that the CNAME points exactly at `track.emailflow.ai` and that any proxy/CDN toggle on the record is disabled (DNS-only). DNS changes can take a little while to publish. --- ## Blacklist Page URL: https://emailflow.ai/docs/blacklist # Blacklist The blacklist (or suppression list) is the set of addresses that should never receive your email — people who unsubscribed, hard-bounced, or complained. EmailFlow AI maintains it automatically so you stay compliant and protect your sender reputation. ## What gets suppressed - **Unsubscribes** — anyone who opts out is suppressed immediately and permanently. - **Hard bounces** — addresses that don't exist or can't receive mail. - **Spam complaints** — recipients who marked your mail as spam. Once an address is on the list, it's automatically excluded from every campaign and automation — you don't have to remember to remove it. ![The Blacklist page listing suppressed addresses with the reason each was blocked — a hard bounce and a spam complaint — plus search, sort, and Add email and Import buttons](https://emailflow.ai/files/docs/blacklist.png?v=7903ceaf) *Screenshot: The suppression list — every blocked address with the reason it can never be emailed again.* ## Why suppression matters Continuing to email people who opted out is both a deliverability problem and a legal one. Anti-spam laws require honoring unsubscribes promptly, and mailbox providers treat repeat sends to complainers or dead addresses as strong negative signals. Reliable suppression keeps you compliant and keeps your reputation intact. > Suppression is automatic and global across your account — an unsubscribe or complaint on one campaign protects every future send, with no manual cleanup. ## Working with deliverability tools The blacklist is one layer of a larger system. [Automatic verification](https://emailflow.ai/docs/email-verification) stops bad addresses from entering your sends in the first place, bounce and complaint handling feed the suppression list, and your [reports](https://emailflow.ai/docs/campaign-reports) surface the trends. Together they keep your lists clean without ongoing effort. ## Best practices Respect the signals the list represents: make unsubscribing easy, send relevant email to [engaged segments](https://emailflow.ai/docs/segments), and never try to re-add a suppressed contact. Clean sending habits, combined with EmailFlow AI's automatic suppression, are the foundation of long-term inbox placement. ## Frequently asked questions **How does an address end up suppressed?** Automatically — when someone unsubscribes, hard-bounces, or marks an email as spam, we add them to your suppression list so they're excluded from future sends. You can also add addresses yourself. **Does suppression protect me?** Yes. Continuing to email people who bounced or complained is one of the fastest ways to damage [deliverability](https://emailflow.ai/docs/sending-servers). Automatic suppression keeps those addresses out of your sends and your reputation intact. **Can I remove someone from the list?** You can manage entries, but re-adding a previously unsubscribed contact requires their renewed consent — never re-subscribe people who opted out. --- # Developer Platform ## API overview Page URL: https://emailflow.ai/docs/api # API overview EmailFlow AI ships a complete developer platform on every plan: a resource-oriented REST API with scoped keys, uniform errors, idempotency, and webhooks — plus a typed SDK, an OpenAPI 3.1 spec, and llms.txt guides for AI agents. The same endpoints the app itself uses. ## Base URL and versioning Every endpoint lives under the `/api/v1/` prefix on your EmailFlow AI host. The current major version is `v1`; new endpoints are added without breaking existing ones, and any breaking change would ship as a new version alongside `v1`. ``` https://emailflow.ai/api/v1/ ``` > Replace `emailflow.ai` with your own hostname on a self-hosted install (for example a local development server at `http://127.0.0.1:8000/api/v1/`). The examples in this section use the hosted base URL. > Machine-readable contracts: the full [OpenAPI 3.1 specification](https://emailflow.ai/openapi/public-api-v1.json) (also as [YAML](https://emailflow.ai/openapi/public-api-v1.yaml)), a concise agent guide at [/llms.txt](https://emailflow.ai/llms.txt), and the complete docs corpus at [/llms-full.txt](https://emailflow.ai/llms-full.txt). ## Quick start Create an API key under **Account → API** (the plaintext `efa_` key is shown once — copy it immediately), then make your first call: ``` # Verify the key curl https://emailflow.ai/api/v1/me \ -H "Authorization: Bearer efa_YOUR_KEY" # List your mailing lists curl https://emailflow.ai/api/v1/lists \ -H "Authorization: Bearer efa_YOUR_KEY" ``` Keys carry [scopes](https://emailflow.ai/docs/api-auth-keys) — grant each integration only what it needs. The pre-platform account-wide token also keeps working; see [the legacy token](https://emailflow.ai/docs/api-auth-keys). ## What's in this section | Page | Covers | | --- | --- | | [Auth & API keys](https://emailflow.ai/docs/api-auth-keys) | Scoped `efa_` keys, the scope table, the legacy token, identity endpoints, credential safety. | | [Errors](https://emailflow.ai/docs/api-errors) | The uniform error envelope, the closed code catalog, and how to handle each case. | | [Idempotency & rate limits](https://emailflow.ai/docs/api-idempotency-rate-limits) | Safe retries with `Idempotency-Key`; per-key rate limits and the standard headers. | | [Resource reference](https://emailflow.ai/docs/api-resources) | Lists, subscribers (single + bulk), segments, campaigns & logs, domains, templates, brand, usage, analytics events, notifications. | | [AI generation API](https://emailflow.ai/docs/api-ai-generation) | Generate and revise complete HTML emails from natural language — builder-compatible, brand-aware. | | [Automations API](https://emailflow.ai/docs/api-automations) | The canonical flow graph format, CRUD, AI composition, and per-contact runs. | | [Webhooks](https://emailflow.ai/docs/api-webhooks) | Signed event deliveries: the event catalog, signature verification, retries, auto-disable. | | [SDK, OpenAPI & llms.txt](https://emailflow.ai/docs/api-sdk-openapi) | The TypeScript SDK, the OpenAPI 3.1 document, and plain-text guides for AI agents. | ## Requests, responses, and status codes Send parameters as form fields or, where noted, a JSON body. Every response is JSON. Status codes follow REST conventions — the canonical statuses returned to scoped `efa_` keys: | Code | Meaning | | --- | --- | | 200 OK | Successful read, update, or action. | | 201 Created | Resource created. | | 202 Accepted | Work queued (for example an asynchronous bulk import). | | 400 / 422 | Malformed request / failed validation — details in the [error envelope](https://emailflow.ai/docs/api-errors). | | 401 Unauthorized | Missing, invalid, revoked, or expired credential. | | 402 Payment required | Plan quota reached or AI credits exhausted. | | 403 Forbidden | Credential valid, but the key lacks the required scope. | | 404 Not Found | The requested resource does not exist (or belongs to another account). | | 409 Conflict | Resource state forbids the operation, or an idempotency conflict. | | 429 Too many requests | [Rate limit](https://emailflow.ai/docs/api-idempotency-rate-limits) exceeded — wait `Retry-After` seconds. | | 500 Server error | Something went wrong on the server. | Legacy-token callers keep their original pre-platform status codes and body shapes — see [the envelope](https://emailflow.ai/docs/api-errors) for how the two coexist. **Pagination.** Index endpoints accept `page` and `per_page` (defaults vary by resource — 10 for lists and campaigns, 25 for subscribers). The analytics event feed uses cursor pagination instead (`meta.next_cursor`). The [SDK](https://emailflow.ai/docs/api-sdk-openapi) abstracts both behind async iterators. ## Usage analytics Every API request is measured automatically — no setup required. Under **Account → API → API usage** you get request volume per day, error rate, and p50/p95 latency for your traffic, switchable between 7-day and 30-day windows, plus tables breaking the same window down per API key (legacy-token traffic shows as “Legacy token”) and per route. ![The API usage dashboard on the Account API page: a requests-per-day bar chart with an error-rate line, a latency chart with p50 and p95 series, a 7-day or 30-day range picker, and breakdown tables per API key and per route](https://emailflow.ai/files/docs/api-usage.png?v=07daf56a) *Screenshot: Account → API → API usage — volume, error rate, and latency for your integrations.* Only the route *template* (for example `/api/v1/lists/{uid}`) is recorded — never the actual identifiers or emails in your request paths — and raw per-request analytics are retained for 30 days, after which only daily aggregates remain. ## Frequently asked questions **Do I need the API to use EmailFlow AI?** No — everything works from the app. The API is for teams who want to connect their own apps and systems and automate data flow. **Which credential should I use?** Scoped `efa_` keys, passed in the `Authorization: Bearer` header — one key per integration. The legacy account token (including its `?api_token=` query parameter) still works for existing clients but grants full access and may appear in logs. **How do I keep my keys safe?** Treat API keys like passwords: store them as secrets, never commit them to code or client-side bundles, use a separate key per integration, and revoke any key that is ever exposed from **Account → API**. **Are there rate limits?** Yes — per-minute limits by operation class, with an independent bucket per API key. See [rate limits](https://emailflow.ai/docs/api-idempotency-rate-limits) for the full matrix and headers. Your account's send and storage quotas apply on top — see [plans and quotas](https://emailflow.ai/docs/plans-quotas). **Can my AI coding agent use this?** Yes — point it at [/llms.txt](https://emailflow.ai/llms.txt) for a compact, always-current API guide, or the [OpenAPI spec](https://emailflow.ai/openapi/public-api-v1.json) for exact schemas. See [llms.txt](https://emailflow.ai/docs/api-sdk-openapi). --- ## Auth & API keys Page URL: https://emailflow.ai/docs/api-auth-keys # Auth & API keys Authenticate with scoped, named API keys — create as many as your plan allows, grant each one only the permissions it needs, and revoke any one of them without disturbing the others. The original account-wide token keeps working for existing integrations. ## Scoped API keys An API key is a credential of the form `efa_` followed by 40 random characters. Create keys under **Account → API**: give each one a name (so you can tell integrations apart), pick its scopes, and optionally set an expiry date. The plaintext key is shown **exactly once**, at creation — only a hash is stored, so copy it immediately and keep it in your secrets manager. The number of active keys is a plan quota. ![The Account API page showing the API keys table: each key with its name, scopes, masked prefix, last-used time, expiry, and a revoke action, plus a New API key button](https://emailflow.ai/files/docs/api-keys.png?v=699bbc38) *Screenshot: Account → API — named keys with scopes, last-used tracking, and one-click revocation.* Pass the key on every request in one of two headers — `Authorization: Bearer` is preferred: ``` # Preferred: bearer header curl https://emailflow.ai/api/v1/me \ -H "Authorization: Bearer efa_YOUR_KEY" # Alternative: X-API-Key header curl https://emailflow.ai/api/v1/me \ -H "X-API-Key: efa_YOUR_KEY" ``` A revoked or expired key returns `401` with an `INVALID_API_KEY` [error envelope](https://emailflow.ai/docs/api-errors). Each key records `last_used_at` (updated at most once a minute) so you can spot abandoned integrations before revoking them. ![The create API key modal with a name field, a checkbox grid of permission scopes such as contacts, emails, automations and webhooks, and an optional expiry date picker](https://emailflow.ai/files/docs/api-key-create.png?v=b3e7d4a5) *Screenshot: Creating a key — name it, grant only the scopes the integration needs, optionally set an expiry.* ## Scopes Scopes follow the principle of least privilege: grant only what an integration needs. Broad scopes *include* their narrower scopes — the “Includes” column below — while granular scopes grant only themselves. A key that lacks the required scope receives `403` `INSUFFICIENT_PERMISSIONS`, and the envelope names the missing scope so the fix is obvious. | Scope | Grants | Includes | | --- | --- | --- | | `all` | Everything, including admin endpoints | every scope | | `contacts` | Lists and subscribers; includes Audiences | audiences | | `audiences` | Read audience segments | — | | `emails` | Email content; includes Domains, Sends and Templates | domains, sends, templates | | `domains` | Sending domains | — | | `sends` | Campaigns and sending | — | | `templates` | Email templates | — | | `automations` | Automation workflows; includes Triggers | triggers | | `triggers` | Trigger automation runs | — | | `webhooks` | Webhook subscriptions | — | | `analytics` | Event analytics feed | — | | `usage` | Usage and quota meters | — | | `brand` | Brand profile | — | > API access is included on every plan, including Free. Use a separate key per integration so you can revoke one without disrupting the others, and prefer granular scopes over `all`. ## The legacy account token Before scoped keys, every account had a single token (visible under **Account → API → Legacy token**) with full access. It continues to work exactly as before — including the `?api_token=` query parameter — and keeps its original response shapes, so nothing you built against it breaks. New integrations should use scoped `efa_` keys instead: they are individually revocable, permission-scoped, and receive the [canonical error envelope](https://emailflow.ai/docs/api-errors). ``` # Legacy token — header or query parameter curl https://emailflow.ai/api/v1/me \ -H "Authorization: Bearer YOUR_LEGACY_TOKEN" curl "https://emailflow.ai/api/v1/me?api_token=YOUR_LEGACY_TOKEN" ``` If you only have an email and password (for example from a programmatic client), exchange them for the legacy token with `POST /user/login`: ``` # Get the legacy token from email + password curl -X POST https://emailflow.ai/api/v1/user/login \ -d email=you@example.com \ -d password=YOUR_PASSWORD # Response { "api_token": "9f2c1ab4e5..." } ``` ## Identity endpoints Endpoints for verifying a credential and reading the current account. `GET /me` is the canonical “is this key valid?” probe. | Method | Endpoint | Description | | --- | --- | --- | | POST | `/user/login` | Exchange email and password for the legacy API token. Public — no credential required. | | GET | `/me` | Return the authenticated user record. Use it to verify a key or token. | | GET | `/user/info` | Return the user profile: email, first and last name, and profile image URL. | | GET | `/dashboard` | Return account summary counts: campaigns, lists, and subscriber usage against quota. | | POST | `/login-token` | Generate a one-time URL that logs the user in when visited. | ## Keeping credentials safe Treat API keys like passwords: store them as secrets, never commit them to code or ship them in client-side bundles, use a separate key per integration, and revoke any key that is ever exposed from **Account → API**. Prefer the `Authorization` header over the legacy query parameter — query strings can end up in proxy and server logs. Setting an expiry on keys for short-lived projects means forgotten credentials shut themselves off. --- ## Errors Page URL: https://emailflow.ai/docs/api-errors # Errors Every error response carries a structured envelope with a machine-readable `code` from a closed catalog, so your client branches on `code` instead of parsing messages. Each entry also carries a human `message`, an actionable `suggestion`, and a `docs` link straight to the relevant row below. ## The envelope Requests authenticated with a scoped `efa_` API key receive the envelope as the entire response body, with the canonical HTTP status from the catalog below. Requests authenticated with the account-wide [legacy token](https://emailflow.ai/docs/api-auth-keys) keep their original status codes and body fields exactly as they always were — the envelope is *added* under a top-level `error` key, so existing integrations never break. ``` # Scoped key (efa_...) — the envelope is the body { "code": "VALIDATION_ERROR", "type": "invalid_request_error", "message": "The request failed validation.", "suggestion": "Fix the fields listed in details and retry the request.", "docs": "https://emailflow.ai/docs/api-errors#errors-validation-error", "param": "from_email", "details": { "from_email": ["The from email must be a valid email address."] } } # Legacy token — original body, envelope added under "error" { "from_email": ["The from email must be a valid email address."], "error": { "code": "VALIDATION_ERROR", "type": "invalid_request_error", ... } } ``` Optional fields appear only when they apply: `param` names the offending input, `details` carries field-keyed validation messages or structured context, and `retryAfter` (on `RATE_LIMITED`) is the number of seconds to wait, matching the `Retry-After` header. ## The catalog The full closed catalog — statuses shown are the canonical ones returned to scoped keys: | Code | Status | Type | What to do | | --- | --- | --- | --- | | `INVALID_REQUEST` | 400 | `invalid_request_error` | Check the request method, path, and parameters against the API reference. | | `INVALID_API_KEY` | 401 | `authentication_error` | Create a new key under Account -> API, or check that the key was copied in full. | | `INSUFFICIENT_PERMISSIONS` | 403 | `permission_error` | Use a key whose scopes cover this endpoint, or create one under Account -> API. | | `NOT_FOUND` | 404 | `invalid_request_error` | Check the identifier; the resource may have been deleted or may belong to another account. | | `VALIDATION_ERROR` | 422 | `invalid_request_error` | Fix the fields listed in details and retry the request. | | `RATE_LIMITED` | 429 | `rate_limit_error` | Slow down and retry after the number of seconds given in retryAfter. | | `IDEMPOTENCY_CONFLICT` | 409 | `invalid_request_error` | Use a fresh Idempotency-Key for a different request body, or replay the identical body. | | `CREDITS_EXHAUSTED` | 402 | `billing_error` | Upgrade your plan or wait for the next billing cycle to refresh your credits. | | `PLAN_LIMIT` | 402 | `billing_error` | Upgrade your plan to raise this limit. | | `CONFLICT` | 409 | `invalid_request_error` | The resource is in a state that does not allow this operation; fetch it again and check its status. | | `SERVER_ERROR` | 500 | `api_error` | Retry later; if the problem persists, contact support with the request timestamp. | ## Validation errors When input fails validation, scoped keys receive `422` `VALIDATION_ERROR` with field-keyed messages under `details` (the first offending field is also named in `param`). Legacy-token callers keep the original `403` with the bare field-keyed map as the body: ``` # Legacy token — original validation shape (403) { "from_email": [ "The from email must be a valid email address." ] } ``` ## Handling errors in practice Branch on `code`, not on `message` — messages may be reworded; codes never change (the catalog only grows). The cases worth handling explicitly: | Code | Client behavior | | --- | --- | | `RATE_LIMITED` | Wait `retryAfter` seconds, then retry. The [TypeScript SDK](https://emailflow.ai/docs/api-sdk-openapi) does this automatically. | | `IDEMPOTENCY_CONFLICT` | With `details.reason: "in_flight"`, the first attempt is still running — wait and retry. Otherwise you reused a key with a different body — pick a fresh key. | | `CREDITS_EXHAUSTED` / `PLAN_LIMIT` | Not retryable. Surface to a human: top up credits or raise the quota under [plans & quotas](https://emailflow.ai/docs/plans-quotas). | | `SERVER_ERROR` | Safe to retry with the same `Idempotency-Key` — failed attempts are never stored, so the retry executes normally. | --- ## Idempotency & rate limits Page URL: https://emailflow.ai/docs/api-idempotency-rate-limits # Idempotency & rate limits Two platform-wide behaviors that make integrations robust: idempotency keys turn retries after network timeouts into safe no-ops, and per-key rate limits with standard headers tell your client exactly when to back off. ## Idempotency Any write request (`POST`, `PUT`, `PATCH`, `DELETE`) may carry an optional `Idempotency-Key` header — up to 100 printable ASCII characters of your choosing. If the request succeeds and you retry it with the same key and the same body within 24 hours, the API replays the original response byte-for-byte instead of executing the operation again, and marks the replay with an `Idempotency-Replayed: true` response header. This makes retries after network timeouts safe: a list, campaign, or subscriber is created exactly once no matter how many times the request is repeated. ``` # Create a campaign — safe to retry on timeout curl -X POST https://emailflow.ai/api/v1/campaigns \ -H "Authorization: Bearer efa_YOUR_KEY" \ -H "Idempotency-Key: spring-sale-launch-2026" \ -d list_uid=ab12cd34ef \ -d name="Spring sale" \ -d subject="20% off this week" \ -d from_email=hi@acme.com \ -d from_name="Acme" ``` The rules in detail: | Situation | Result | | --- | --- | | Same key, same body, within 24 hours | Stored response replayed with `Idempotency-Replayed: true`. | | Same key, *different* body | `409` `IDEMPOTENCY_CONFLICT` — pick a fresh key for a different request. | | Retry while the first attempt is still running | `409` `IDEMPOTENCY_CONFLICT` with `details.reason: "in_flight"` — wait and retry. | | First attempt failed with a `5xx` | Nothing is stored; the retry executes normally. | | Key longer than 100 characters or non-printable | `400` `INVALID_REQUEST` with `param: "Idempotency-Key"`. | | `GET` request with the header | Header ignored. | Keys are scoped to your account, so they never collide with other customers'. A good key encodes the operation and its trigger, for example `order-created-8861-1718200000` (`--`), or simply a random UUID generated per logical operation. The [TypeScript SDK](https://emailflow.ai/docs/api-sdk-openapi) can generate one per call with `idempotencyKey: true`. ## Rate limits Requests are limited per minute by operation class. Each API key gets its own independent bucket (legacy-token callers share one bucket per user), so one busy integration never starves another. Every response carries `X-RateLimit-Limit`, `X-RateLimit-Remaining`, and `X-RateLimit-Reset` (the Unix time when the window resets); when you exceed a limit the API returns `429` with a `RATE_LIMITED` [error envelope](https://emailflow.ai/docs/api-errors) whose `retryAfter` matches the `Retry-After` header — wait that many seconds and retry. | Class | Requests / minute | Applies to | | --- | --- | --- | | `read` | 100 | All read (GET) requests on resource endpoints. | | `write` | 60 | Create, update, and delete requests on resource endpoints. | | `batch` | 10 | Bulk subscriber import (sync and async) and batch operations. | | `ai` | 20 | AI email generation and edit requests. | | `sends` | 10 | Campaign run (send) triggers. | | `default` | 60 | All other endpoints (administrative and legacy surfaces). | > Watch your real traffic against these limits under **Account → API → API usage** — request volume, error rate, and latency per key and per route. See [usage analytics](https://emailflow.ai/docs/api). ## Putting the two together: a robust retry loop Idempotency and rate limits are designed to compose into one simple client policy: 1. Generate an `Idempotency-Key` (a UUID is fine) before the first attempt of any write. 2. On a network timeout or `5xx`, retry with the *same* key and body — failed attempts are never stored, so a real failure re-executes, and a response you simply never received is replayed. 3. On `429`, sleep for `retryAfter` seconds, then retry with the same key. 4. On any other `4xx`, stop — the request itself is wrong, and retrying will not change the outcome. This is exactly the policy the [TypeScript SDK](https://emailflow.ai/docs/api-sdk-openapi) implements out of the box: pass `idempotencyKey: true` and it generates the UUID, reuses it across retries, honors `Retry-After`, and backs off exponentially on transient failures. --- ## Resource reference Page URL: https://emailflow.ai/docs/api-resources # Resource reference Every core resource over plain REST: lists, subscribers (single and bulk), segments, campaigns with downloadable logs, sending domains, templates, your brand profile, account usage meters, and a unified analytics event feed. Scope names in each section refer to [API key scopes](https://emailflow.ai/docs/api-auth-keys). > Prefer machine-readable contracts? Every endpoint below is specified in the [OpenAPI 3.1 document](https://emailflow.ai/openapi/public-api-v1.json) — see [SDK, OpenAPI & llms.txt](https://emailflow.ai/docs/api-sdk-openapi). ## Lists Mailing [lists](https://emailflow.ai/docs/lists) are the primary container for subscribers. Each list has a default sender identity and a set of [custom fields](https://emailflow.ai/docs/custom-fields), which you add with the `add-field` sub-route. Scope: `audiences` (implied by `contacts`). | Method | Endpoint | Description | | --- | --- | --- | | GET | `/lists` | Paginated index of lists owned by the key's account. | | POST | `/lists` | Create a list. Required: `name`, `from_email`, `from_name`. | | GET | `/lists/{uid}` | Fetch a single list with its fields and statistics. | | POST | `/lists/{uid}/add-field` | Add a custom field. `type` is one of `text`, `number`, `datetime`. | | DELETE | `/lists/{uid}` | Permanently delete a list and its subscribers. | ``` # Create a list curl -X POST https://emailflow.ai/api/v1/lists \ -H "Authorization: Bearer efa_YOUR_KEY" \ -d name="Newsletter" \ -d from_name="Acme" \ -d from_email="hi@acme.com" \ -d contact[company]="Acme Inc." \ -d contact[address_1]="1 Market St" \ -d contact[city]="San Francisco" \ -d contact[zip]="94105" \ -d contact[phone]="+1 555 0100" \ -d contact[country_id]=1 \ -d contact[email]="hi@acme.com" # Response { "status": 1, "message": "List has been created!", "list_uid": "ab12cd34ef" } ``` Add a custom field to that list: ``` curl -X POST https://emailflow.ai/api/v1/lists/{uid}/add-field \ -H "Authorization: Bearer efa_YOUR_KEY" \ -d type=text \ -d label="First name" \ -d tag=FIRST_NAME ``` ## Subscribers [Subscribers](https://emailflow.ai/docs/subscribers) belong to a list and carry custom field values, tags, and a status of `subscribed`, `unsubscribed`, or `unconfirmed`. Custom fields are passed as uppercase parameters (`FIRST_NAME`, `LAST_NAME`, …) matching your list's field configuration. Scope: `audiences` (implied by `contacts`). ### Single subscriber operations | Method | Endpoint | Description | | --- | --- | --- | | GET | `/subscribers?list_uid={uid}` | Paginated index for a list. Filter with `open=yes\|no` and `click=yes\|no`. | | POST | `/subscribers` | Create a subscriber. Required: `list_uid`, `EMAIL`. | | GET | `/subscribers/{id}` | Fetch a single subscriber by id or email. | | PATCH | `/subscribers/{id}` | Update fields, tags, or status. | | POST | `/subscribers/{id}/add-tag` | Add comma-separated tags. | | POST | `/subscribers/{id}/remove-tag` | Remove comma-separated tags. | | GET | `/subscribers/email/{email}` | Find every list containing a subscriber with this email. | | PATCH | `/lists/{list_uid}/subscribers/{id}/subscribe` | Mark the subscriber `subscribed`. | | PATCH | `/lists/{list_uid}/subscribers/{id}/unsubscribe` | Mark the subscriber `unsubscribed`. | | PATCH | `/lists/{list_uid}/subscribers/email/{email}/unsubscribe` | Unsubscribe by email when you do not have the id. | | DELETE | `/subscribers/{id}` | Permanently delete the subscriber from the list. | ``` # Add a subscriber with custom fields and tags curl -X POST https://emailflow.ai/api/v1/subscribers \ -H "Authorization: Bearer efa_YOUR_KEY" \ -d list_uid=ab12cd34ef \ -d EMAIL=alice@example.com \ -d FIRST_NAME=Alice \ -d tag=vip,newsletter \ -d status=subscribed ``` ### Bulk import and delete Import or remove many subscribers at once. The synchronous endpoints apply rows inline and return per-row results; JSON payloads accept at most **1,000 rows per request** (a larger payload returns `422`). For bigger imports, upload a CSV to the asynchronous endpoint, which queues the work and returns a job you poll for progress. Write endpoints carry the `batch` rate-limit class (10 requests per minute) — see [rate limits](https://emailflow.ai/docs/api-idempotency-rate-limits). | Method | Endpoint | Description | | --- | --- | --- | | POST | `/lists/{list_uid}/subscribers/bulk` | Synchronous bulk import (≤1,000 rows). Returns counts and per-row errors. | | DELETE | `/lists/{list_uid}/subscribers/bulk` | Batch delete by email (≤1,000). Body `{"emails": [...]}`; unknown emails come back as warnings, not errors. | | POST | `/lists/{list_uid}/subscribers/bulk/async` | Queued bulk import. Accepts a JSON body (≤1,000 rows) or a multipart CSV upload (unbounded). Returns `202` with a job. | | GET | `/lists/{list_uid}/import-jobs` | List recent bulk-import jobs for a list. | | GET | `/import-jobs/{job_uid}` | Poll a job for status, progress, and counts. | | DELETE | `/import-jobs/{job_uid}` | Cancel a queued or running job. | Callers authenticating with a scoped `efa_` key receive the aligned partial-success shape `{processed, created, updated, failed, errors: [{index, email, code, message}], warnings: [...]}`; legacy-token callers keep the original `{list_uid, received, inserted, updated, failed, batch_id, errors}` shape unchanged. ``` # Synchronous bulk import (JSON body) curl -X POST "https://emailflow.ai/api/v1/lists/{list_uid}/subscribers/bulk" \ -H "Authorization: Bearer efa_YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{ "mode": "overwrite", "subscribers": [ { "EMAIL": "alice@example.com", "FIRST_NAME": "Alice", "tags": ["vip"] }, { "EMAIL": "bob@example.com", "FIRST_NAME": "Bob", "status": "subscribed" } ] }' # Response (scoped efa_ key) { "processed": 2, "created": 1, "updated": 1, "failed": 0, "errors": [], "warnings": [] } ``` For large or untrusted inputs, queue the job and poll it: ``` # Queue an async import, then poll curl -X POST "https://emailflow.ai/api/v1/lists/{list_uid}/subscribers/bulk/async" \ -H "Authorization: Bearer efa_YOUR_KEY" \ -F "file=@subscribers.csv" \ -F 'mapping={"Email":"EMAIL","First Name":"FIRST_NAME"}' \ -F "mode=overwrite" # 202 Accepted { "job_uid": "job_77aa", "status": "queued", "status_url": "...", "cancel_url": "..." } # Poll curl "https://emailflow.ai/api/v1/import-jobs/job_77aa" \ -H "Authorization: Bearer efa_YOUR_KEY" ``` ## Segments [Segments](https://emailflow.ai/docs/segments) are saved filters over a list's subscribers, built from conditions on fields, tags, verification state, engagement dates, and signup date. Conditions use the same operators the in-app segment builder offers; an invalid operator for a condition type is rejected with a validation error. Scope: `contacts`. | Method | Endpoint | Description | | --- | --- | --- | | GET | `/lists/{list_uid}/segments` | Paginated index of a list's segments with matching-subscriber counts. | | POST | `/lists/{list_uid}/segments` | Create a segment. Required: `name`, `matching` (`all` or `any`), `conditions[]`. | | GET | `/segments/{uid}` | Fetch one segment with its conditions. | | PATCH | `/segments/{uid}` | Update name, matching mode, or conditions (conditions replace atomically). | | DELETE | `/segments/{uid}` | Delete the segment. Subscribers are not affected. | | GET | `/segments/{uid}/subscribers` | Paginated subscribers currently matching the segment. | ``` # Create a segment of recently active Gmail contacts curl -X POST "https://emailflow.ai/api/v1/lists/{list_uid}/segments" \ -H "Authorization: Bearer efa_YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "Active Gmail readers", "matching": "any", "conditions": [ { "type": "field", "field_uid": "EMAIL_FIELD_UID", "operator": "contains", "value": "@gmail.com" }, { "type": "last_open_email", "operator": "last_open_email_less_than_days", "value": "7" } ] }' ``` ## Campaigns Campaigns are the unit of sending. Create one with HTML content and tracking flags, move it through `run` / `pause` / `resume`, then download per-event logs as CSV. See the [campaigns guide](https://emailflow.ai/docs/campaigns-overview) for the full picture. Scope: `sends` (implied by `emails`). ### Managing campaigns | Method | Endpoint | Description | | --- | --- | --- | | GET | `/campaigns` | Paginated index. Accepts `page` and `per_page`. | | POST | `/campaigns` | Create a campaign. Required: `list_uid`, `name`, `subject`, `from_email`, `from_name`. | | GET | `/campaigns/{uid}` | Fetch a single campaign with statistics. | | PATCH | `/campaigns/{uid}` | Update content, subject, or tracking flags. | | POST | `/campaigns/{uid}/run` | Queue the campaign for delivery. | | POST | `/campaigns/{uid}/pause` | Pause an in-flight campaign. | | POST | `/campaigns/{uid}/resume` | Resume a paused campaign. | | DELETE | `/campaigns/{uid}` | Delete a campaign that is not in progress. | ``` # Create then run a campaign curl -X POST https://emailflow.ai/api/v1/campaigns \ -H "Authorization: Bearer efa_YOUR_KEY" \ -d list_uid=ab12cd34ef \ -d name="Spring sale" \ -d subject="20% off this week" \ -d from_email=hi@acme.com \ -d from_name="Acme" \ -d track_open=true \ -d track_click=true \ --data-urlencode 'html=

Hello!

' curl -X POST https://emailflow.ai/api/v1/campaigns/{uid}/run \ -H "Authorization: Bearer efa_YOUR_KEY" ``` ### Log downloads Each log endpoint streams a CSV for one event type. See [reports and logs](https://emailflow.ai/docs/campaign-reports) for how this data maps to the in-app reports. For a streaming JSON feed of the same events, use the [analytics event feed](#analytics) below; to be notified the moment events happen, use [webhooks](https://emailflow.ai/docs/api-webhooks). | Method | Endpoint | Description | | --- | --- | --- | | GET | `/campaigns/{uid}/tracking-log/download` | Combined tracking log. | | GET | `/campaigns/{uid}/open-log/download` | Opens. | | GET | `/campaigns/{uid}/click-log/download` | Clicks. | | GET | `/campaigns/{uid}/bounce-log/download` | Bounces. | | GET | `/campaigns/{uid}/feedback-log/download` | Spam and abuse feedback. | | GET | `/campaigns/{uid}/unsubscribe-log/download` | Unsubscribes. | ## Sending domains Register and verify the [domains you send from](https://emailflow.ai/docs/sending-domains). Creating a domain returns the DNS records to publish (an ownership record, DKIM records, and SPF); call `verify` after publishing to re-poll status. Depending on your plan's sending configuration, records are either the managed CNAME set or TXT-based local DKIM — the response reflects whichever mode applies. Internationalized domains are stored in punycode. Scope: `domains` (implied by `emails`). | Method | Endpoint | Description | | --- | --- | --- | | GET | `/domains` | Paginated index with per-record verification status. | | POST | `/domains` | Register a domain. Required: `domain`. Returns the DNS record set to publish. | | POST | `/domains/{uid}/verify` | Re-check verification and return updated per-record status. | | DELETE | `/domains/{uid}` | Remove the domain. Returns `409` while scheduled or sending campaigns use it. | ``` # Register a domain, publish the returned records, then verify curl -X POST https://emailflow.ai/api/v1/domains \ -H "Authorization: Bearer efa_YOUR_KEY" \ -d domain=mail.acme.com curl -X POST https://emailflow.ai/api/v1/domains/{uid}/verify \ -H "Authorization: Bearer efa_YOUR_KEY" ``` ## Templates Read access to your saved email templates. `source` tells you where each came from: `gallery` (started from the [template gallery](https://emailflow.ai/docs/template-gallery)), `imported` (ZIP or HTML upload), `ai` (built in the AI builder), or `api` (created through the [AI generation API](https://emailflow.ai/docs/api-ai-generation)). Pass `include=html` on the detail endpoint to receive the full HTML. Scope: `templates` (implied by `emails`). | Method | Endpoint | Description | | --- | --- | --- | | GET | `/templates` | Paginated index. Filters: `search` (name), `source` (`gallery`, `ai`, `imported`, `api`). | | GET | `/templates/{uid}` | Fetch one template. Add `?include=html` for the full HTML body. | ## Brand profile Your account's [brand profile](https://emailflow.ai/docs/brand-scan) — company identity, colors, fonts, and logo — as one read-only resource. Poll `crawl_status` after starting a brand scan in the app (`idle` → `scraping` → `analyzing` → `importing_logo` → `extracting_colors` → `completed` or `failed`). Scope: `brand`. | Method | Endpoint | Description | | --- | --- | --- | | GET | `/brand` | The account's brand profile. `404` until a brand scan or manual profile exists. | ## Usage One consolidated snapshot of your [plan quotas and credits](https://emailflow.ai/docs/plans-quotas): per-resource `used`/`limit` meters (lists, campaigns, subscribers, automations, sending domains, users, API keys) and per-credit `granted`/`used`/`remaining` balances (email sends, contact verifications, AI generations). Unlimited grants report `"unlimited": true`. Scope: `usage`. | Method | Endpoint | Description | | --- | --- | --- | | GET | `/usage` | Plan summary plus all quota and credit meters in one response. | ## Analytics events A unified, newest-first feed of every delivery event across your account: `sent`, `failed`, `open`, `click`, `bounce`, `feedback`, and `unsubscribe`. Each event carries the campaign, the subscriber email, and type-specific metadata (clicked URL, bounce type, IP and user agent). Filters compose; results paginate with an opaque `cursor` returned in `meta.next_cursor`. Scope: `analytics`. | Method | Endpoint | Description | | --- | --- | --- | | GET | `/analytics/events` | Unified event feed. Filters: `type[]`, `campaign_uid`, `email`, `since`, `until` (ISO 8601); paginate with `per_page` + `cursor`. | ``` # Recent opens and clicks for one campaign curl "https://emailflow.ai/api/v1/analytics/events?type[]=open&type[]=click&campaign_uid={uid}" \ -H "Authorization: Bearer efa_YOUR_KEY" # Response { "data": [ { "type": "click", "occurred_at": "2026-06-12T09:15:02+00:00", "campaign_uid": "ab12cd34ef", "campaign_name": "Spring sale", "subscriber_email": "alice@example.com", "meta": { "url": "https://acme.com/promo", "ip_address": "198.51.100.7", "user_agent": "..." } } ], "meta": { "next_cursor": "eyJ0IjoiMjAyNi0wNi0xMiAw..." } } ``` ## Notifications If you operate your own delivery pipeline, push delivery feedback back into EmailFlow AI so reports and suppression stay accurate. Report hard bounces and spam or abuse complaints against the original message id. | Method | Endpoint | Description | | --- | --- | --- | | POST | `/notification/bounce` | Record a hard bounce. Parameters: `message_id`, `description`. | | POST | `/notification/feedback` | Record a feedback report. Parameters: `message_id`, `type` (`spam` or `abuse`), `description`. | ``` curl -X POST https://emailflow.ai/api/v1/notification/bounce \ -H "Authorization: Bearer efa_YOUR_KEY" \ -d message_id="2016374...@example.com" \ -d description="550 mailbox not found" ``` --- ## AI generation API Page URL: https://emailflow.ai/docs/api-ai-generation # AI generation API Build and revise complete HTML emails from natural language — the same engine behind the [AI builder](https://emailflow.ai/docs/ai-text-to-email), exposed as two synchronous endpoints. Generate from a prompt, iterate with follow-up instructions, and everything stays editable in the visual builder. ## How it works Generation creates a template (provenance `source: "api"`) *and* a chat session, so anything your integration produces opens in the visual builder with full history and per-step checkpoints; edits append to that history, and “Revert to checkpoint” works on API-made changes. By default the generator uses your [brand profile](https://emailflow.ai/docs/brand-scan) and uploaded brand assets — colors, fonts, logo, voice — so drafts arrive on-brand; pass `apply_brand: false` for a neutral draft. Both endpoints consume AI credits (estimate-then-settle from real token usage; `402` `CREDITS_EXHAUSTED` when depleted), require the `emails` scope, and share the `ai` rate-limit class (20 requests/minute). Calls are synchronous and may take up to two minutes; a breach returns a `504` `SERVER_ERROR` envelope with `details.reason: "generation_timeout"`. > Send an `Idempotency-Key` with generate calls — a replay returns the same `template_uid` instead of generating (and metering) twice. See [idempotency](https://emailflow.ai/docs/api-idempotency-rate-limits). ## Endpoints | Method | Endpoint | Description | | --- | --- | --- | | POST | `/emails/generate` | Generate a new email. Required: `prompt` (≤4000 chars). Optional: `name`, `apply_brand` (default `true`). Returns `201` with `template_uid`, `html`, `tokens_used`, and a `subject_suggestion` when one can be derived. | | PATCH | `/emails/{template_uid}` | Revise an existing template with an instruction (≤2000 chars). Returns the updated `html`, `tokens_used`, and a `checkpoint_id` usable in the builder's history. | ``` # Generate, then iterate curl -X POST https://emailflow.ai/api/v1/emails/generate \ -H "Authorization: Bearer efa_YOUR_KEY" \ -H "Content-Type: application/json" \ -H "Idempotency-Key: 1c4d2c4e-launch-01" \ -d '{"prompt": "A product-launch email with one hero section and a CTA to the docs", "name": "Launch announcement"}' # Response (201) { "template_uid": "6a2c5b1ebaf83", "name": "Launch announcement", "html": "...", "tokens_used": 3069, "subject_suggestion": "Introducing the EmailFlow AI API" } curl -X PATCH https://emailflow.ai/api/v1/emails/6a2c5b1ebaf83 \ -H "Authorization: Bearer efa_YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{"instruction": "Make the CTA button deep purple"}' # Response (200) { "template_uid": "6a2c5b1ebaf83", "html": "...", "tokens_used": 4040, "checkpoint_id": "api_edcb1899-0a9a-42bf-82db-9818c88ac476" } ``` ## After generation The returned `html` is a complete, self-contained email document — use it directly as [campaign](https://emailflow.ai/docs/api-resources) content, or fetch it again later via the [templates resource](https://emailflow.ai/docs/api-resources) (`?include=html`, filter `source=api`). Open the template in the app to continue in the [chat editor](https://emailflow.ai/docs/editing-with-chat) exactly where the API left off — the API-seeded conversation and checkpoints are all there. A full generate-and-send recipe ships in the [SDK cookbook](https://emailflow.ai/docs/api-sdk-openapi). --- ## Automations API Page URL: https://emailflow.ai/docs/api-automations # Automations API [Automations](https://emailflow.ai/docs/automations-overview) are visual flows of triggers, conditions, and actions. The API covers the full lifecycle: build a flow from a JSON graph or a natural-language prompt, read and edit it (every change appears live in the [flow editor](https://emailflow.ai/docs/automation-flow-editor)), activate it, and manage individual contact runs. Requires the `automations` [scope](https://emailflow.ai/docs/api-auth-keys). ## The graph format Flows travel in one canonical shape, used identically by every endpoint below (and by the OpenAPI spec and SDK). The trigger is its own object; every node names its parent, and children of a condition carry a `branch` of `yes` or `no`: ``` { "trigger": { "key": "welcome-new-subscriber", "options": {} }, "nodes": [ { "id": "n_wait0001", "type": "wait", "parent_id": "trigger", "options": { "duration": "PT1H" } }, { "id": "n_send0001", "type": "send", "parent_id": "n_wait0001", "options": { "title": "Welcome email" } }, { "id": "n_cond0001", "type": "condition", "parent_id": "n_send0001", "options": { "kind": "open", "timeout": "P3D" } }, { "id": "n_yes00001", "type": "send", "parent_id": "n_cond0001", "branch": "yes", "options": {} } ] } ``` Node types are `send`, `wait` (ISO 8601 `duration`, e.g. `PT1H`, `P3D`), `wait_until`, `condition` (`kind`: `open` or `click`, plus a `timeout`), `operation` (`kind`: `tag`, `remove_tag`, `copy`, `move`, `update`), and `webhook`. Trigger keys match the [trigger catalog](https://emailflow.ai/docs/automation-triggers) (`welcome-new-subscriber`, `tag-based`, `api-3-0`, …). Responses also include an `issues` array — the same “ready to run?” findings the editor shows (for example a send node without an email configured). Replaying a run from a specific step is planned for a later phase. ## Flow endpoints | Method | Endpoint | Description | | --- | --- | --- | | GET | `/automations` | Paginated index with status, trigger key, and node count. | | POST | `/automations` | Create from a graph (`name`, `list_uid`, `trigger`, `nodes`) *or* compose with AI (`name`, `list_uid`, `prompt` ≤4000 chars) — exactly one of the two. The prompt branch consumes AI credits and the `ai` rate-limit class. | | GET | `/automations/{uid}` | Full normalized graph plus editor `issues`. | | PATCH | `/automations/{uid}` | Atomic operation batch: `{"operations": [{"op": "add_node" \| "update_node" \| "delete_node" \| "update_trigger", ...}]}`. One invalid operation rejects the whole batch with `422` — nothing is applied. | | DELETE | `/automations/{uid}` | Cascade delete (flow, emails, runs). `409` while active unless `?force=1`. | | POST | `/automations/{uid}/activate` | Activate (idempotent). `422` until a trigger is configured. | | POST | `/automations/{uid}/deactivate` | Deactivate (idempotent). | ``` # Create a welcome flow from a graph curl -X POST https://emailflow.ai/api/v1/automations \ -H "Authorization: Bearer efa_YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "Welcome series", "list_uid": "ab12cd34ef", "trigger": { "key": "welcome-new-subscriber", "options": {} }, "nodes": [ { "id": "n_wait0001", "type": "wait", "parent_id": "trigger", "options": { "duration": "PT1H" } }, { "id": "n_send0001", "type": "send", "parent_id": "n_wait0001", "options": { "title": "Welcome email" } } ] }' # ...or describe it and let the AI compose the graph curl -X POST https://emailflow.ai/api/v1/automations \ -H "Authorization: Bearer efa_YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{ "name": "Welcome series", "list_uid": "ab12cd34ef", "prompt": "Welcome new subscribers, wait an hour, then send a welcome email" }' # Edit atomically: re-point the trigger and grow a branch in one batch curl -X PATCH https://emailflow.ai/api/v1/automations/{uid} \ -H "Authorization: Bearer efa_YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{ "operations": [ { "op": "update_trigger", "key": "tag-based", "options": { "tags": ["vip"] } }, { "op": "add_node", "type": "condition", "parent_id": "n_send0001", "options": { "kind": "open", "timeout": "P3D" }, "as": "check" }, { "op": "add_node", "type": "send", "parent_id": "$check", "branch": "yes", "options": { "title": "Openers follow-up" } } ] }' ``` ## Runs A run is one contact's journey through one automation: where it is (`current_node_id`), its `status` (`running`, `waiting`, `completed`, `failed`, `cancelled`), and when it wakes next (`scheduled_at`). Fire a run to enroll a contact from your own system — firing is idempotent per contact (re-firing returns the existing run with `200` instead of enrolling twice). Cancelling is terminal and irreversible: the run keeps its position for audit but never advances again. An optional `payload` object is stored on the run for audit. | Method | Endpoint | Description | | --- | --- | --- | | GET | `/automations/{uid}/runs` | Paginated runs, newest first. Filter with `status=`. | | POST | `/automations/{uid}/runs` | Fire for a contact: `email` or `subscriber_uid`, optional `payload`. The automation must be active (`409` otherwise); the contact must be subscribed on the automation's list. | | PATCH | `/automation-runs/{uid}` | `{"action": "cancel"}` — halt the run permanently. Idempotent; completed or failed runs return `409`. | ``` # Fire for one contact curl -X POST https://emailflow.ai/api/v1/automations/{uid}/runs \ -H "Authorization: Bearer efa_YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{ "email": "alice@example.com", "payload": { "order_id": "ord_42" } }' # Response (201) { "data": { "uid": "64a91b2c7de31", "subscriber_uid": "5f8e2a1c9b3d4", "email": "alice@example.com", "status": "waiting", "current_node_id": "n_wait0001", "scheduled_at": "2026-06-12T14:30:00+00:00", "error": null, "created_at": "2026-06-12T13:30:00+00:00", "updated_at": "2026-06-12T13:30:00+00:00" } } # Cancel it curl -X PATCH https://emailflow.ai/api/v1/automation-runs/64a91b2c7de31 \ -H "Authorization: Bearer efa_YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{ "action": "cancel" }' ``` **Deprecated but supported:** `POST /automations/{uid}/execute` (fires an `api-3-0` automation for its whole list, returning `{"success": true}`) predates the runs API and remains available for existing integrations. New integrations should fire per-contact runs instead. --- ## Webhooks Page URL: https://emailflow.ai/docs/api-webhooks # Webhooks Get an HTTPS POST the moment things happen — deliveries, opens, clicks, bounces, complaints, subscribes, and unsubscribes — instead of polling the analytics feed. Every delivery is signed so your receiver can prove it came from EmailFlow AI. ## The event catalog Subscribe each endpoint to exactly the events it cares about. Event names are frozen — they never change meaning; new events are only ever added. | Event | Fires when | | --- | --- | | `email.delivered` | A message is handed to the recipient's mail server. | | `email.failed` | A message could not be sent. | | `email.opened` | A recipient opens a tracked message. | | `email.clicked` | A recipient clicks a tracked link. | | `email.bounced` | A message bounces (the metadata carries the bounce type). | | `email.complained` | A recipient files a spam or abuse report. | | `contact.subscribed` | A contact subscribes to a list (bulk imports deliberately do not fire it). | | `contact.unsubscribed` | A contact unsubscribes. | ## The delivery payload Every delivery is a JSON POST. `id` is unique per delivery — store it to deduplicate retries. `data` carries the campaign, automation, contact, and list identifiers when they apply, plus event-specific `meta` (clicked URL, bounce type, IP address, user agent, message id): ``` POST https://example.com/hooks/emailflow X-EmailFlow-Signature: t=1718200000,v1=5257a869e7... { "id": "64a91b2c7de31", "event": "email.clicked", "occurred_at": "2026-06-12T09:15:02+00:00", "data": { "campaign_uid": "ab12cd34ef", "subscriber_email": "alice@example.com", "list_uid": "cd34ef56ab", "meta": { "url": "https://acme.com/promo", "ip_address": "198.51.100.7" } } } ``` ## Verifying signatures When you create a subscription, the response includes a `secret` — shown exactly once at creation, never in any later response, so store it immediately. Every delivery then carries an `X-EmailFlow-Signature` header in the form `t=,v1=` where the signature is `HMAC-SHA256(secret, t + "." + raw_body)`. To verify: 1. Split the header into `t` and `v1`. 2. Compute `HMAC-SHA256(secret, t + "." + raw_body)` over the *raw* request body (before any JSON parsing). 3. Compare against `v1` with a constant-time comparison. 4. Reject if `t` is older than your tolerance (5 minutes is typical) to block replay attacks. ``` // Node.js — verify a delivery import { createHmac, timingSafeEqual } from 'node:crypto'; function verify(header, rawBody, secret, toleranceSeconds = 300) { const parts = Object.fromEntries(header.split(',').map(p => p.split('='))); if (Math.abs(Date.now() / 1000 - Number(parts.t)) > toleranceSeconds) return false; const expected = createHmac('sha256', secret) .update(`${parts.t}.${rawBody}`) .digest('hex'); return timingSafeEqual(Buffer.from(expected), Buffer.from(parts.v1)); } ``` A complete, type-checked version of this receiver ships in the [SDK cookbook](https://emailflow.ai/docs/api-sdk-openapi). ## Retries and auto-disable A delivery succeeds when your endpoint answers any `2xx` within the timeout. Anything else is retried up to **3 attempts** with backoff of **30 seconds, 5 minutes, then 30 minutes**. Respond fast — acknowledge first, process asynchronously. When all attempts for a delivery fail, the subscription gains a failure strike; any success resets the counter. At **20 consecutive failed deliveries** the subscription is automatically disabled, and you get an in-app notification plus an email. Fix your receiver, then re-enable from the UI or with `PATCH {"active": true}` — re-enabling clears the strike counter. Delivery logs are retained for 30 days. ## Managing subscriptions Manage subscriptions over the API (scope: `webhooks`) or in the app under **Account → API → Webhooks** — the UI includes a deliveries drawer with per-attempt status, response codes, and durations. ![The Webhooks tab on the Account API page showing a subscriptions table with endpoint URLs, subscribed events, status badges, and a recent-deliveries view with per-attempt response codes](https://emailflow.ai/files/docs/api-webhooks.png?v=0d0acea8) *Screenshot: Account → API → Webhooks — subscriptions with status, and per-delivery attempt logs.* Endpoint URLs must be HTTPS. Each subscription is limited to your account's data — events from other tenants can never reach your endpoint. | Method | Endpoint | Description | | --- | --- | --- | | GET | `/webhooks` | All subscriptions on the account. | | POST | `/webhooks` | Create a subscription. Required: `url` (HTTPS), `events[]`. Returns `201` with the signing `secret` — shown once. | | GET | `/webhooks/{uid}` | One subscription with status and failure counter. | | PATCH | `/webhooks/{uid}` | Update `url`, `events`, or `active`. Setting `active: true` on an auto-disabled subscription re-enables it. | | DELETE | `/webhooks/{uid}` | Delete the subscription and its delivery logs. | | POST | `/webhooks/{uid}/test` | Send a signed synchronous `ping` event and return the live result: status, response code, duration. | | GET | `/webhooks/{uid}/deliveries` | Paginated delivery log, newest first. Filter with `status=`. | ``` # Subscribe an endpoint to engagement events curl -X POST https://emailflow.ai/api/v1/webhooks \ -H "Authorization: Bearer efa_YOUR_KEY" \ -H "Content-Type: application/json" \ -d '{ "url": "https://example.com/hooks/emailflow", "events": ["email.opened", "email.clicked", "email.bounced"] }' # Response (201) — copy the secret now; it is never shown again { "data": { "uid": "7bc2e91d4af52", "url": "https://example.com/hooks/emailflow", "events": ["email.opened", "email.clicked", "email.bounced"], "active": true, "secret": "b41c0f8a2e..." } } # Fire a test ping and see the live result curl -X POST https://emailflow.ai/api/v1/webhooks/7bc2e91d4af52/test \ -H "Authorization: Bearer efa_YOUR_KEY" ``` --- ## SDK, OpenAPI & llms.txt Page URL: https://emailflow.ai/docs/api-sdk-openapi # SDK, OpenAPI & llms.txt Three ways to consume the platform beyond raw curl: a typed TypeScript SDK with retries and pagination built in, a complete OpenAPI 3.1 specification for generators and tooling, and llms.txt guides designed for AI coding agents. ## The TypeScript SDK `@emailflow/sdk` is a zero-runtime-dependency client built on `fetch` — it runs on Node 18+, in browsers, and on edge runtimes. Every request and response shape is generated straight from the OpenAPI spec, so the types are the contract. ``` import { EmailFlow, EmailFlowApiError } from '@emailflow/sdk'; const emailflow = new EmailFlow({ apiKey: process.env.EMAILFLOW_API_KEY! }); const lists = await emailflow.lists.list(); try { await emailflow.subscribers.create( { EMAIL: 'ada@example.com', FIRST_NAME: 'Ada', list_uid: lists[0]!.uid! }, { idempotencyKey: true }, ); } catch (error) { if (error instanceof EmailFlowApiError) { console.error(`${error.code}: ${error.message}`, error.suggestion); } } ``` What you get over hand-rolled `fetch` calls: | Feature | Behavior | | --- | --- | | Automatic retries | `429` waits for `Retry-After`; `5xx` and network failures retry with exponential backoff. Unsafe methods (`POST`/`PATCH`/`DELETE`) only retry when an idempotency key makes the retry safe. | | Idempotency | Pass `{ idempotencyKey: true }` on any write — the SDK generates a UUID, reuses it across retries, and the server [replays the original result](https://emailflow.ai/docs/api-idempotency-rate-limits). | | Typed errors | Every non-2xx throws `EmailFlowApiError` carrying the canonical [envelope](https://emailflow.ai/docs/api-errors): `code`, `message`, `suggestion`, `docs`, `retryAfter`, and HTTP `status`. | | Pagination | `for await` over subscribers, templates, runs, and the analytics feed — no page or cursor bookkeeping. | ``` // Stream every click event, newest first, without cursor bookkeeping for await (const event of emailflow.analytics.iterateEvents({ type: ['click'] })) { console.log(event.occurred_at, event.subscriber_email, event.meta?.url); } ``` The SDK ships with a cookbook of five end-to-end, type-checked recipes: bulk contact sync with idempotency, AI generate-and-send, webhook signature verification, analytics export, and building automations from graphs. Resource namespaces mirror the API one-to-one (`lists`, `subscribers`, `segments`, `campaigns`, `templates`, `emails`, `automations`, `automationRuns`, `domains`, `webhooks`, `brand`, `usage`, `analytics`). ## OpenAPI 3.1 The entire public API is specified in one OpenAPI 3.1 document — every endpoint, parameter, scope requirement, error envelope, and response schema. A test in our suite walks the live route table and fails if any public endpoint is missing from the spec, so it cannot drift. | Format | URL | | --- | --- | | JSON | [`/openapi/public-api-v1.json`](https://emailflow.ai/openapi/public-api-v1.json) | | YAML | [`/openapi/public-api-v1.yaml`](https://emailflow.ai/openapi/public-api-v1.yaml) | Feed it to any OpenAPI-aware tool: generate clients in other languages, import into Postman or Insomnia, validate requests at your edge, or wire it into contract tests. The SDK's own types are generated from this exact document. ## llms.txt — docs for AI agents If you point an AI coding agent (Cursor, Claude, Copilot, or your own) at EmailFlow AI, two plain-text endpoints give it everything it needs without scraping HTML: | URL | Contents | | --- | --- | | [`/llms.txt`](https://emailflow.ai/llms.txt) | A concise API guide: authentication, the scope table, rate-limit matrix, error catalog, and endpoint map — generated from the same source code that enforces them, so it is never stale. | | [`/llms-full.txt`](https://emailflow.ai/llms-full.txt) | The full documentation corpus — every docs page, including this one, as one markdown document. | > Building with an AI agent? Paste `https://emailflow.ai/llms.txt` into its context and it can write working integrations against the API — scopes, error handling, idempotency and all. --- # Account & Billing ## Plans & quotas Page URL: https://emailflow.ai/docs/plans-quotas # Plans & quotas Your plan is sized by three things — AI tokens, monthly email volume, and contacts — plus team seats and a fair-use send rate. Every tier sends through our managed delivery infrastructure and includes the full feature set; higher tiers simply raise the limits. ## Every plan, the full product There's no feature paywall here. The AI Design Studio, automations, A/B testing, segments, forms, [managed sending](https://emailflow.ai/docs/sending-servers), and automatic [verification](https://emailflow.ai/docs/email-verification) are available on every plan, including Free. What changes between tiers is capacity, not capability. ## What the limits look like | Limit | Free | Starter | Standard | Professional | Enterprise | | --- | --- | --- | --- | --- | --- | | Price / month | $0 | $19 | $49 | $99 | $299 | | AI tokens | 20K | 1M | 10M | 50M | 500M | | Emails / month | 5,000 | 50,000 | 200,000 | 1,000,000 | 10,000,000 | | Contacts | 500 | 5,000 | 20,000 | 100,000 | 1,000,000* | | Lists | Unlimited | Unlimited | Unlimited | Unlimited | Unlimited | | Automations | Unlimited | Unlimited | Unlimited | Unlimited | Unlimited | | Team members | 1 | 2 | 5 | 20 | Unlimited | | Send rate (fair use) | 100/hr | 1,000/hr | 5,000/hr | 20,000/hr | 80,000/hr | See the full side-by-side breakdown on the [Pricing](https://emailflow.ai/pricing) page. ** Need more than Enterprise? Higher-volume plans are available on demand — just contact us.* ![The Resource Usage page: per-quota cards for mailing lists, campaigns, subscribers, automations, upload storage, sending domains, and team users, each with usage shown as a count and a percentage bar](https://emailflow.ai/files/docs/account-quota.png?v=550b2e8d) *Screenshot: Resource Usage — live consumption against every plan limit, each quota with its own meter.* ## What's metered Three things are metered. **[AI tokens](https://emailflow.ai/docs/ai-credits)** power the AI features (generation, editing, image remix, brand scan, subject lines, automation chat) and reset at the start of each billing cycle. Your **monthly email volume** covers campaign and automation sends through our [managed delivery infrastructure](https://emailflow.ai/docs/sending-servers) and also resets each cycle. Your **contact limit** caps how many people you can store and email. > Free needs no credit card. Every paid plan includes a 14-day free trial — a card starts it, but you aren't charged until the trial ends, and you can cancel anytime before then. ## When you hit a limit If you reach a quota — AI tokens, contacts, or anything else — EmailFlow AI shows a clear in-app prompt rather than failing silently or charging you. You're always in control of when to [upgrade](https://emailflow.ai/docs/upgrading). Limits reset each cycle, so normal usage simply continues next month. ## Frequently asked questions **Is there a free trial?** Yes — every paid plan includes a 14-day free trial (a card is required to start). The Free plan is free forever and needs no card, so you can explore at your own pace. See [upgrading](https://emailflow.ai/docs/upgrading) for details. **What counts against my quotas?** Every email a [campaign](https://emailflow.ai/docs/campaigns-overview) or [automation](https://emailflow.ai/docs/automations-overview) sends counts toward your monthly email volume, alongside your contact count and [AI tokens](https://emailflow.ai/docs/ai-credits). All metered allotments reset each billing cycle. **Do sending and verification cost extra?** No. Delivery through our managed Amazon SES infrastructure is included in your plan — there are no per-email fees, no third-party sending accounts to pay for, and automatic contact verification is included in every plan at no extra charge. --- ## AI credits & tokens Page URL: https://emailflow.ai/docs/ai-credits # AI credits & tokens AI tokens are the fuel for every AI feature in EmailFlow AI. Each plan includes a generous monthly allotment that resets every billing cycle — from 20K on Free up to 500M on Enterprise. ## What tokens power Any time the AI does work for you, it spends tokens. That includes: - [Generating](https://emailflow.ai/docs/ai-text-to-email) a complete email from a prompt. - [Editing](https://emailflow.ai/docs/editing-with-chat) a design conversationally. - [Remixing images](https://emailflow.ai/docs/ai-image-remix) and running [Remix for My Brand](https://emailflow.ai/docs/remix-for-brand). - Scanning your website in a [brand scan](https://emailflow.ai/docs/brand-scan). - Generating [subject lines](https://emailflow.ai/docs/campaign-subject) and building flows in [automation chat](https://emailflow.ai/docs/automation-ai-chat). ## How usage adds up Different features consume different amounts. Generating a full email or remixing an image uses more tokens than producing a few subject-line options. Longer, more complex requests cost more than short ones. In practice, the monthly allotments are sized so that normal day-to-day work fits comfortably within your plan. > Tokens are separate from your [contact limit and monthly email volume](https://emailflow.ai/docs/plans-quotas). Building lots of emails won't eat into your AI tokens, and sending campaigns doesn't either. ## When you run low If you approach or reach your monthly token allotment, EmailFlow AI shows a clear in-app prompt to upgrade rather than cutting you off without warning — and you're never charged automatically. Your allotment refreshes at the start of the next billing cycle, and [upgrading](https://emailflow.ai/docs/upgrading) raises it immediately if you need more right away. ## Choosing the right allotment If you mostly send newsletters with occasional AI help, a smaller allotment is plenty. If you generate and remix heavily — lots of fresh designs, frequent image work, AI-built automations — a higher tier (or Enterprise's 500M tokens) keeps you moving without interruption. Review the tiers under [Plans & quotas](https://emailflow.ai/docs/plans-quotas). ## Making credits go further - **Start from a [template](https://emailflow.ai/docs/template-gallery).** Remixing an existing design uses fewer generations than building from a blank prompt. - **Be specific.** A clear prompt gets you closer on the first try, so you spend less refining. - **Set your [brand](https://emailflow.ai/docs/brand-assets) once.** On-brand output from the start means fewer corrective edits. ## Frequently asked questions **What happens if I run out?** You'll see an upgrade prompt. Moving to a higher [plan](https://emailflow.ai/docs/plans-quotas) raises your monthly AI allowance immediately. **Are AI tokens the same as a sending limit?** No — they are separate meters. Your plan's [monthly email volume](https://emailflow.ai/docs/plans-quotas) covers sending; AI tokens only power generation features like text-to-email and image remix. --- ## Upgrading Page URL: https://emailflow.ai/docs/upgrading # Upgrading Upgrade whenever you need more capacity — more sends, contacts, AI tokens, automations, or team seats. Changes take effect immediately, and every paid plan starts with a 14-day free trial. ## Good reasons to upgrade Because every plan includes the full feature set, you upgrade for *capacity*, not to unlock tools. Common triggers: - You're hitting your monthly [send or contact limits](https://emailflow.ai/docs/plans-quotas). - You want more [AI tokens](https://emailflow.ai/docs/ai-credits) for heavier generation and image work. - You need more concurrent [automations](https://emailflow.ai/docs/automations-overview) or a higher [send rate](https://emailflow.ai/docs/campaign-schedule). - You're adding teammates and need more [seats](https://emailflow.ai/docs/users-roles). - You want priority or migration support. > Every paid plan includes a 14-day free trial. A card is required to start one, but you're not charged until the trial ends — cancel anytime before then and pay nothing. ## How upgrading works 1. Open your plan settings or follow an in-app upgrade prompt. 2. Pick the tier that fits your needs. 3. Confirm — your new limits apply immediately, and your AI tokens and contact limit adjust to the new plan. ![The Subscription page: the current plan with its status and next billing date, sending and verification credit meters, recurring-billing controls, and Change plan and Cancel subscription buttons](https://emailflow.ai/files/docs/upgrade-plans.png?v=a6898eba) *Screenshot: Your subscription at a glance — current plan, credits, billing cycle, and the Change plan button.* ## Downgrading and changing plans You can move between plans as your needs change. If you downgrade, your limits adjust to the lower tier — so it's worth checking that your contact count and monthly email volume fit before switching. Sending infrastructure stays the same on every tier: it's [fully managed](https://emailflow.ai/docs/sending-servers), and only the volume allotment changes. ## No surprise charges EmailFlow AI never upgrades you or charges you automatically when you hit a limit. You'll see a clear prompt and decide for yourself. That means you can run right up to your plan's ceiling and choose, on your own terms, whether to move up. Review the tiers anytime on the [Pricing](https://emailflow.ai/pricing) page. ## Good reasons to upgrade - **More contacts and sends.** Your audience outgrew your current monthly allowance. - **More [AI credits](https://emailflow.ai/docs/ai-credits).** You're designing and generating more and want a bigger creative budget. - **Faster send rate.** Large campaigns reach inboxes sooner on higher tiers. - **More [team members](https://emailflow.ai/docs/users-roles) and priority support.** As your team and reliance grow. ## Frequently asked questions **How does the trial work?** Every paid plan starts with a 14-day free trial; a card is required to begin. The Free plan stays free forever with no card. **When do changes take effect?** Upgrades apply right away so you get the higher [limits](https://emailflow.ai/docs/plans-quotas) immediately; your contacts, campaigns, and automations carry over untouched. --- ## Users & roles Page URL: https://emailflow.ai/docs/users-roles # Users & roles Invite your team into a shared EmailFlow AI account so you can build, send, and report together. The number of seats is set by your plan, and each member signs in with their own login. ## Team seats by plan Every plan includes at least one user, and higher tiers add more seats — from a solo Free account up to large teams on Pro and up to 80 members on Enterprise. Check your seat count under [Plans & quotas](https://emailflow.ai/docs/plans-quotas); if you need more people than your plan allows, [upgrading](https://emailflow.ai/docs/upgrading) raises the limit. ## Inviting teammates 1. Open the users section of your account settings. 2. Invite a teammate by email. 3. They accept and set up their own credentials. 4. They now share your account's lists, templates, campaigns, and reports. ![The Users page in account settings: a Manage your team panel with an Add user button and a table of team members showing name, role, status, and created date](https://emailflow.ai/files/docs/account-users.png?v=95e249ec) *Screenshot: Team management — every member with their role and status, one Add user button to grow the team.* ## Why a shared account helps Working in one account means your brand profile, [assets](https://emailflow.ai/docs/brand-assets), [lists](https://emailflow.ai/docs/lists), and [templates](https://emailflow.ai/docs/template-gallery) are shared by everyone — no duplicated work, no inconsistent branding. A designer can build an email, a marketer can set up the [campaign](https://emailflow.ai/docs/campaigns-overview), and a manager can review the [reports](https://emailflow.ai/docs/campaign-reports), all in the same place. > Give each person their own login rather than sharing one. Individual accounts keep activity clear and make it easy to add or remove access as your team changes. ## Managing access As your team evolves, add new members up to your plan's seat limit and remove people who no longer need access. Keeping your user list current is good hygiene — it ensures only the right people can send on behalf of your brand. ## Frequently asked questions **How many people can I invite?** It depends on your [plan](https://emailflow.ai/docs/plans-quotas) — higher tiers include more team members. You can see your seat allowance on the pricing page. **Can I limit what teammates can do?** Yes. Roles let you decide who can send campaigns, edit automations, or manage billing, so collaborators get exactly the access they need and nothing more. **What if someone leaves?** Remove their access at any time. Their account is revoked immediately while the campaigns, automations, and contacts they created stay with your organization. **Why use roles instead of sharing one login?** Individual accounts mean every action is attributable, access can be tuned per person, and you can revoke one teammate without disrupting everyone else — far safer than a shared password and essential as your team grows. ---