Mollie
Attribute Mollie payments and refunds to the visits that led to them.
Use this connector when payments are created through the Mollie Payments API. Mollie’s classic webhooks only send a payment ID, which Seean cannot verify or price, so the connector uses Mollie’s next-generation webhooks with the full payload format. Seean verifies each delivery with the signing secret you chose, records payment.paid events as orders and matches refund.refunded events to them. Attribution is derived on Seean’s server from the buyer’s tracked visits when the payment metadata carries the visitor ID.
Setup
- In Seean open Settings → Integrations → Payment providers on your own website, choose Mollie, select Enable and copy the webhook URL (
https://events.seean.io/api/connect/mollie/<site ID>; use the exact value shown). - In the Mollie Dashboard (or through the Webhooks API) create a next-generation webhook for that URL with the Full payload format.
- Subscribe it to
payment.paidandrefund.refunded. These event types are in Mollie’s beta and may need to be enabled by Mollie support for your account. - Choose a signing secret of your own (8-256 characters), give it to Mollie when creating the webhook and paste the same value into Seean, then choose Save secret.
- Pass the attribution metadata described below when you create payments.
Only the website owner can connect, replace or disconnect a provider; one connection per provider; demo websites cannot connect providers.
Attribution handoff
Read window.seean.attribution() in the browser, send it to your server and attach it as the payment’s metadata (an object or a JSON string; Seean reads both):
// Browser
await window.seean?.ready;
const a = window.seean?.attribution?.() ?? {};
const seean = { seean_visitor_id: a.visitorId, seean_landing_path: a.landingPath, seean_converting_path: a.convertingPath, seean_campaign: a.campaign };
// send `seean` to your server with the checkout request
// Server (Mollie API client)
const payment = await mollie.payments.create({
amount: { currency: "EUR", value: "10.00" },
description: "Starter plan",
redirectUrl: "https://example.com/thanks",
metadata: Object.fromEntries(Object.entries(seean).filter(([, v]) => v)),
});
| Key | Meaning |
|---|---|
seean_visitor_id |
Links the order to the buyer’s tracked visits; touches, first and last source, landing page and time to buy are derived from that history. |
seean_landing_path |
Used only when Seean has no tracked visit for the visitor in the 90 days before the order. |
seean_converting_path |
The page where checkout started. |
seean_campaign |
Overrides the campaign derived from the tracked history. |
Orders without seean_visitor_id are recorded as Unattributed.
What is recorded
| Event | Result in Seean |
|---|---|
payment.paid |
Order from _embedded.entity: amount.value in amount.currency, description as the product name. sequenceType: oneoff becomes a one-time order; first and recurring become subscription orders. |
refund.refunded |
Refund of the payment in paymentId by amount.value. |
The order ID is the Mollie payment ID and the order time is paidAt. A delivery in the simple-payload format carries no amount and is recorded under the provider as an error. Other events are acknowledged and ignored.
Refunds
refund.refunded reduces the payment by the refunded amount, once per refund ID; partial refunds are supported. Refunds lower net revenue in the period of the original order. If the original order has not arrived, Seean returns HTTP 503 and shows Last event failed: Order not found. The provider can retry after the order arrives; the refund ID prevents double counting. A refund whose order is still missing one day after the refund was created is acknowledged and ignored, so refunds of payments Seean never recorded do not keep the endpoint failing; record those with the Order API. See delivery recovery if retries expire.
Currency
Orders are stored in the website’s reporting currency (Settings → Integrations → Revenue integration). Mollie’s decimal value is converted with the ISO 4217 exponent ("10.00" EUR is 1000 minor units). A payment in another currency is acknowledged but not stored, and the reason appears under the provider.
Verify
Use Mollie’s Test a webhook endpoint or complete a test-mode payment. The status line under Mollie shows the last event time and, if the last event could not be stored, the error. Then open Revenue for a range containing the order and check the amount, product and derived attribution. Duplicate deliveries return duplicate and change nothing.
Limits
- Seean verifies the
X-Mollie-Signatureheader (sha256=hex HMAC-SHA256 of the body). Mollie does not sign a timestamp, so a captured delivery could be replayed; replays are deduplicated by payment and refund ID and cannot create a second order. - Request bodies above 64 KiB are rejected with 413. Events Seean does not handle are acknowledged with 200; rate limits return 429 and temporary ingestion failures return 503 so the provider can retry. See delivery recovery.
- Disable stops accepting events (the URL answers 404); delete the webhook in Mollie so it stops retrying. Existing orders are kept.
Related: Revenue attribution, Order API and refunds.
Something unclear? Contact support.