---
title: "Flexmail Integration"
description: "Flexmail is a Belgian email marketing and transactional email platform. Agents manage contacts, interests, preferences, and opt-ins, run bulk imports and segments, send transactional messages, and track message events and webhooks across both APIs."
url: https://flowrunner.ai/integrations/flexmail
date_modified: 2026-09-04T14:28:58-07:00
---

# Flexmail

[Email Marketing](https://flowrunner.ai/integrations/category/email-marketing)

Flexmail is a Belgian email marketing and transactional email platform. Agents manage contacts, interests, preferences, and opt-ins, run bulk imports and segments, send transactional messages, and track message events and webhooks across both APIs.

[Verified](https://flowrunner.ai/integrations/verified "What does verified mean?") · 59 actions · Basic auth · available

[Flexmail website](https://email-api.flexmail.eu/) · [Platform Documentation](https://api.flexmail.eu/documentation/) · Capability data verified 2026-08-19

1.  A sign-up form is submitted on the website
2.  Agent reads the address, the language, and the topics the person selected
3.  Get Account Contact Languages and List Sources confirm the language and the origin are values this account actually holds
4.  Create Contact writes the record with its source recorded, because a contact without an origin cannot be created here
5.  Subscribe Contact To Interest records each topic the person asked for, as its own subscription
6.  Send Message delivers the welcome with open and link tracking switched on deliberately
7.  When a bounce feed proposes unsubscribing a cohort, a person confirms before contactability is removed

## What This Integration Enables

Flexmail is a Belgian platform that models consent as structure rather than as a checkbox, and building on it means working with that structure rather than around it. A contact cannot be created without a recorded source, which is exactly the point of the field. Interests and preferences are separate subscription objects a person holds independently of being on the list at all. And when a contact has unsubscribed themselves from an interest, an API call trying to put them back is refused. That refusal is not a permissions problem. It is the recipient's choice outranking your integration, which is the behavior you want and rarely get.

There are two APIs behind one login here, and they share almost nothing. Marketing holds contacts, interests, imports, and segments. Transactional holds message sending, senders, sending domains, and its own separate webhook collection. Contacts do not exist on the transactional side, and transactional messages do not appear in marketing reports. FlowRunner agents work across both, and the [connectors](https://flowrunner.ai/concepts/connectors) keep the two sets of operations distinct rather than pretending there is one collection, because a webhook created on one host is invisible from the other.

### Without FlowRunner

**Consent as a single flag**: Somebody is subscribed or not, and what they actually asked to hear about is lost

**Origin recorded loosely**: Nobody can say where a given contact came from, or which campaign brought them in

**Imports land unevenly**: A large import runs against a live database with no separation between staging it and committing it

### With FlowRunner

**Consent as structure**: Interests, preferences, and sources are separate records a person holds independently

**Origin is required**: Every contact carries a recorded source because the platform will not create one without it

**Imports are staged then started**: Records accumulate against an import object, and nothing reaches the contact database until the flow starts it

## Use Case Scenarios

### Sign-up to welcome, with the consent recorded properly

A submission arrives from [Typeform](https://flowrunner.ai/integrations/typeform). The agent validates the language against Get Account Contact Languages and resolves the origin with List Sources, then calls Create Contact with the source attached. Each topic the person selected becomes its own call to Subscribe Contact To Interest, so a later unsubscribe from one topic does not silently remove the others. Send Message delivers the welcome with open tracking and link tracking set explicitly, because both default to off and a flow that later looks for engagement events on a message sent with the defaults will find none and nothing about the send will have looked wrong.

### A warehouse import that is staged before it commits

A quarterly refresh comes out of [PostgreSQL](https://flowrunner.ai/integrations/postgresql). The agent calls Create Contact Import to open the job, then Add Contact Import Records across as many calls as the volume needs, with every record carrying at least one source because the flow checks that before the request leaves. Nothing has reached the contact database yet. Get Contact Import reports the staged state, the counts post to [Slack](https://flowrunner.ai/integrations/slack) for a look, and only then does Start Contact Import commit it. The flow also checks that no other import is in flight first, because the platform allows one per account and answers a conflict rather than queuing the second.

### Deliverability set up before the first send, not after the first failure

A new brand is being added to the account. The agent calls Add Sender for the address and Register Sending Domain for the domain, then reads Get Sending Domain to collect the DNS records that have to be published and posts them to the team that owns the zone. Get Sender reports whether the confirmation mail to the address has been acted on. Registering neither one makes it usable, and a send from an unverified sender is refused at send time rather than at registration time, so the flow treats both as open until the reads say otherwise. Once they clear, the corresponding contact records in [HubSpot](https://flowrunner.ai/integrations/hubspot) are flagged as mailable under the new brand.

## Human-in-Loop Highlight

Unsubscribe Contact is one-way through this API. There is no matching resubscribe route, and the vendor's own stated path back is a double opt-in: call the opt-in submission, then wait for the person to confirm, and an unconfirmed opt-in is deleted after twenty-four hours. That means an over-broad automated unsubscribe is not something an agent can quietly reverse the next morning. Every affected person has to be asked again, individually, and each of them has a one-day window to act before the invitation expires.

So when a bounce or complaint feed proposes removing a cohort, the agent assembles the case and stops. It reads the contacts, groups the evidence by domain and by failure pattern, and asks: "The delivery feed proposes unsubscribing 640 contacts. 470 are hard failures at consumer providers. 170 are at one corporate domain and all failed inside the same two-hour window, which reads like a receiving outage. Unsubscribing is one-way here: getting any of these back needs a fresh opt-in that each person confirms within a day. Unsubscribe all 640, or hold the 170?" The marketing owner answers, and the agent applies the decision across the whole set. What made this safe was not the agent's grouping. It was that a removal nobody can undo belonged to a person.

Agent processes routinely

Detects exception requiring judgment

Clear match Continues automatically

Ambiguous Routes to human via preferred channel

Human decides

Agent resumes with decision

## Agent Capabilities

59 actions

### Contacts

12

-   **List Contacts** Returns contacts with filtering. The email and interest filters cannot be combined, and the connector catches that before the platform refuses it.
-   **Get Contact** Reads one contact in full.
-   **Create Contact** Creates a contact. A source is required, the language must be one the account actually holds, and custom field keys are placeholder names rather than display labels, so an unknown key is a refusal rather than a silently ignored field.
-   **Update Contact** Merges changes into a contact, leaving anything not mentioned alone.
-   **Replace Contact** Rewrites the contact record. Anything left out is cleared, which makes this the write a flow reaches for deliberately rather than by default.
-   **Unsubscribe Contact** Removes the contact from all communication. One-way through this API, and the operation this page's human gate exists for.
-   **Get Contact Interests** Reads which topics a contact is subscribed to.
-   **Subscribe Contact To Interest** Adds a topic subscription. Refused when the contact unsubscribed themselves from that interest, because their choice outranks the write.
-   **Unsubscribe Contact From Interest** Removes one topic subscription without touching the rest or the contact's overall subscription.
-   **Get Contact Interest Labels** Reads the labels attached to a contact's interests.
-   **Get Contact Preferences** Reads the preference subscriptions a contact holds.
-   **Get Contact Sources** Reads where a contact came from, which is the field that makes a consent record auditable.

### Bulk Import

4

-   **Create Contact Import** Opens an import job. Nothing reaches the contact database at this point.
-   **Add Contact Import Records** Adds records to an open import, across as many calls as the volume needs. Every record needs at least one source, checked before the request is sent.
-   **Start Contact Import** Commits the staged records. The only call in the sequence that writes, and one import may run per account at a time.
-   **Get Contact Import** Polls an import. Processing is asynchronous, so the start response is not completion.

### Interests

8

-   **List Interests** Returns the topics defined on the account.
-   **Get Interest** Reads one interest's configuration.
-   **Create Interest** Defines a new topic people can subscribe to.
-   **Update Interest** Changes a topic's configuration.
-   **Delete Interest** Removes a topic. Refused while contacts are subscribed to it, an opt-in form references it, or a segment uses it, so a failing delete usually means it is still in use.
-   **Get Interest Translations** Reads the translated names of a topic, which is what a multilingual audience actually sees.
-   **Replace Interest Translations** Rewrites those translations as a complete set.
-   **List Interest Labels** Returns the labels available for grouping interests.

### Preferences

3

-   **List Preferences** Returns the preferences defined on the account, which are a separate axis of consent from interests.
-   **Subscribe Contact To Preference** Records a preference subscription for a contact.
-   **Unsubscribe Contact From Preference** Removes one preference subscription.

### Account Configuration

5

-   **List Custom Fields** Returns the account's custom fields with the placeholder names that writes have to use.
-   **Get Account Contact Languages** Returns the languages this account was configured with. The authority a flow checks a language value against before creating a contact.
-   **List Sources** Returns valid contact origins, which every contact creation has to reference.
-   **Get Source** Reads one source's detail.
-   **List Segments** Returns valid and active segments only, so a segment being absent is not proof it was deleted.

### Opt-in

3

-   **List Opt In Forms** Returns the account's opt-in forms.
-   **Get Opt In Form** Reads one form's configuration.
-   **Submit Opt In** Starts a double opt-in for an address. The vendor's stated route back after an unsubscribe, and the invitation expires if the person does not confirm within a day.

### Marketing Webhooks

6

-   **List Webhook Events** Returns the marketing events that can be subscribed to.
-   **List Webhooks** Returns the marketing webhooks registered on the account. Transactional webhooks are a separate collection and do not appear here.
-   **Get Webhook** Reads one marketing webhook.
-   **Create Webhook** Registers a marketing webhook. The platform calls the target URL during creation and expects the receiver to echo a verification token back, so this is for receivers a flow controls rather than for arbitrary endpoints.
-   **Update Webhook Target URL** Changes where a marketing webhook points. Runs the verification callback again.
-   **Delete Webhook** Removes a marketing webhook.

### Transactional Messages

5

-   **Get API Info** Reads the transactional API's own information. The cheapest confirmation that the transactional host is reachable with the same credential.
-   **Send Message** Sends a transactional message. Open and link tracking both default to off, substitutions with no matching value are removed from the content rather than left visible, and only a short list of attachment types is accepted.
-   **List Messages** Lists transactional messages over a period, with event filters that can find messages that do have an event and messages that do not.
-   **Get Message** Reads one transactional message.
-   **Get Message Statistics** Reads aggregate transactional results over a period.

### Senders and Sending Domains

9

-   **List Senders** Returns the sender addresses registered on the account.
-   **Add Sender** Registers a sender address, which the platform then confirms by mailing that address.
-   **Get Sender** Reads a sender's verification state. Registering is not the same as being usable.
-   **Delete Sender** Removes a sender address from the account.
-   **List Sending Domains** Returns the registered sending domains.
-   **Register Sending Domain** Registers a domain and returns the DNS records that have to be published before it works.
-   **Get Sending Domain** Reads a domain's verification state and its required records.
-   **Update Sending Domain** Changes the return path. The domain itself cannot be changed after registration.
-   **Delete Sending Domain** Removes a sending domain from the account.

### Transactional Webhooks

4

-   **List Transactional Webhooks** Returns the webhooks registered on the transactional host, which are invisible to the marketing collection.
-   **Create Transactional Webhook** Registers a transactional webhook, with the same verification callback the marketing host performs.
-   **Update Transactional Webhook Target URL** Changes where a transactional webhook points, and re-runs the verification.
-   **Delete Transactional Webhook** Removes a transactional webhook.

## Frequently Asked Questions

### What can FlowRunner do with Flexmail?

FlowRunner agents can run List Contacts, Get Contact, and Create Contact in Flexmail, plus 56 more actions.

### Does connecting Flexmail to FlowRunner require OAuth?

No. Flexmail connects to FlowRunner with basic authentication (a username and password), no OAuth flow required.

### Can Flexmail trigger a FlowRunner workflow automatically?

Flexmail doesn't currently expose triggers in FlowRunner. It connects as an action step inside workflows started by another trigger.

**Work at Flexmail?** This integration exposes Flexmail to AI agents on every FlowRunner plan, including through MCP, at no cost to you. [See what FlowRunner offers integration partners](https://flowrunner.ai/integrations/partners), including how to keep this page current.

---
Markdown version of https://flowrunner.ai/integrations/flexmail. Site index: https://flowrunner.ai/llms.txt
