Set up Recurring

What is Mollie Recurring?

Mollie Recurring is a payment feature that lets you charge your customers repeatedly — think of subscriptions, memberships, payment-installments or other repeating services.

With a single customer consent and our flexible APIs, you can charge customers on-demand or on a schedule, letting you focus on building your business — not babysitting payments.

Setting up Mollie Recurring

Registering a customer

A recurring payment is based on a single user, so we need to specify who is being charged.

  1. Use Customers API to create a customer.
    The code below creates a simple representation of a customer and also gives you a customer id (in the response object) that you will need to use later. Make sure you store this id.
curl -X POST https://api.mollie.com/v2/customers \
    -H "Authorization: Bearer test_dHar4XY7LxsDOtmnkVtjNVWXLSlXsM" \
    -H "Content-Type: application/json" \
    -d "{\"name\":\"Customer A\",\"email\":\"[email protected]\"}"

Example response:

  {
    "resource": "customer",
    "id": "cst_5B8cwPMGnU",
    "mode": "live",
    "name": "Customer A",
    "email": "[email protected]",
    "locale": "en_US",
    "metadata": "string",
    "createdAt": "2026-03-20T09:13:37.0Z",
    "testmode": null,
    "_links": {
      "self": {
        "href": "https://...",
        "type": "application/hal+json"
      },
      "dashboard": {
        "href": "https://...",
        "type": "application/hal+json"
      },
      "payments": null,
      "mandates": null,
      "subscriptions": null,
      "documentation": {
        "href": "https://...",
        "type": "application/hal+json"
      }
    }
  }
  1. Collect the initial payment.
    During the first transaction, it’s important to obtain consent from your customer for recurring charges.
    It’s similar to a regular payment, but the customer is shown information about your organization (and potential recurring payments) and needs to complete the transaction with a payment method that will be used for recurring charges.

    Example request:

{
  "amount": {
    "currency": "EUR",
    "value": "10.00"
  },
  "description": "A recurring payment",
  "redirectUrl": "www.redirectedurl.com",
  "profileId": "pfl_xxxxxx123",
  "customerId": "cst_xxxxxx",
  "mandateId": "mdt_xxxxxx",
  "sequenceType": "first"
}
📘

The first payment often requires a minimal amount (e.g. €0.01) to set up the mandate. However, if you use Credit Card or PayPal, it’s possible to make this first payment set to €0.00 for the simple purpose of verification.

Storing the mandate

  1. Store customer mandate

Once the first payment is processed, a mandate (payment authorization) is stored in Mollie.
Future payments will reference these stored mandates, so your customers don’t need to re-authorize each transaction. You can access customer mandates using Mandates API.

📘

Mandates don’t set the amounts that can be charged or the number of transactions that can be created on a specific mandate. A mandate is just a blank approval for future recurring payments.

Charging customers periodically or on demand

  1. Set up recurring payments

Assuming you retrieved a valid mandate, you can now create a subscription either using Mollie’s Subscriptions API or handle it within your own platform on-demand:

  • Using Subscriptions API: for regular billing (monthly, quarterly, custom intervals).
    Mollie will automatically create each payment according to your schedule.
  • Using Mandates API: for variable or on-demand recurring payments.
    Mollie will charge according to your internal billing logic or any subscription service you are using.

Subscriptions API

Mollie handles all the scheduling logic for you and allows to quickly start accepting recurring billing without any extensive setup or planning. This is most suited for simple cases where you have only a few subscription models and multiple customers are on the same setup.

  1. Get a valid mandate for your customer using Mandates API:
curl -X GET https://api.mollie.com/v2/customers/cst_xxxxxx/mandates \
    -H "Authorization: Bearer test_dHar4XY7LxsDOtmnkVtjNVWXLSlXsM"
<?php

$mollie = new \Mollie\Api\MollieApiClient();
$mollie->setApiKey("test_dHar4XY7LxsDOtmnkVtjNVWXLSlXsM");

$mandates = $mollie->customers->get("cst_4qqhO89gsT")->mandates();
  1. Ensure the status for the specified mandates is either pending or valid (otherwise charge your first payment for that customer)
  2. Schedule payments using Create subscription endpoint:
    (here we charging €5.00 for X times every Y months, starting today)
curl -X POST https://api.mollie.com/v2/customers/cst_xxxxxx/subscriptions \
    -H "Authorization: Bearer test_dHar4XY7LxsDOtmnkVtjNVWXLSlXsM" \
    -H "Content-Type: application/json" \
    -d \
    "{
        \"amount\": {\"currency\":\"EUR\", \"value\":\"5.00\"},
        \"times\": X,
        \"interval\": \"Y months\",
        \"description\": \"Recurring payment\",
        \"webhookUrl\": \"https://webshop.example.org/subscriptions/webhook/\"
    }"
<?php

$mollie = new \Mollie\Api\MollieApiClient();
$mollie->setApiKey("test_dHar4XY7LxsDOtmnkVtjNVWXLSlXsM");

$subscription = $mollie->subscriptions->createForId("cst_4qqhO89gsT", [
    "amount" => [
        "currency" => "EUR",
        "value" => "25.00"
    ],
    "times" => 4,
    "interval" => "3 months",
    "description" => "Quarterly payment",
    "webhookUrl" => "https://webshop.example.org/subscriptions/webhook/"
]);

On-demand

The on-demand option is best suited for complex use cases, like pausing a subscription, changing the amount charged month-to-month, billing customers after they paid a deposit etc. This is better suited for setups where charges are inconsistent or where customers each have their own personal setup (think of grocery/food delivery apps, ride sharing etc).

  1. Get a valid mandate for your customer using Mandates API:
curl -X GET https://api.mollie.com/v2/customers/cst_xxxxxx/mandates \
    -H "Authorization: Bearer test_dHar4XY7LxsDOtmnkVtjNVWXLSlXsM"
<?php

$mollie = new \Mollie\Api\MollieApiClient();
$mollie->setApiKey("test_dHar4XY7LxsDOtmnkVtjNVWXLSlXsM");

$mandates = $mollie->customers->get("cst_4qqhO89gsT")->mandates();
  1. Ensure that the status of the mandate is set to valid.
  2. Make a call to Payments API while the sequenceType parameter is set to recurring and pass in the mandateId to charge that customer on-demand.
curl -X POST https://api.mollie.com/v2/payments \
    -H "Authorization: Bearer test_dHar4XY7LxsDOtmnkVtjNVWXLSlXsM" \
    -H "Content-Type: application/json" \
    -d \
    "{
        \"amount\": {\"currency\": \"EUR\", \"value\": \"10.00\"},
        \"customerId\": \"cst_Ok2DlrJe5\",
        \"mandateId\": \"mdt_h7Id8SjfJ\",
        \"sequenceType\": \"recurring\",
        \"description\": \"Background payment\",
        \"webhookUrl\": \"https://webshop.example.org/payments/webhook/\"
    }"
<?php

$mollie = new \Mollie\Api\MollieApiClient();
$mollie->setApiKey("test_dHar4XY7LxsDOtmnkVtjNVWXLSlXsM");

$payment = $mollie->payments->create([
    "amount" => [
        "currency" => "EUR",
        "value" => "10.00"
    ],
    "customerId" => "cst_Ok2DlrJe5",
    "sequenceType" => "recurring",
    "description" => "Background payment",
    "webhookUrl" => "https://webshop.example.org/payments/webhook/"
]);

Best practices

Communicate clearly: let your customers know how often (and how much) they’ll be billed — this helps reduce chargeback risk and customer frustration.

Use Webhooks: you can use Webhooks to get notified about payment statuses, handle failed charges, update subscriptions, trigger fulfillment, etc.

Handle failed or disputed payments properly: failed payments don’t necessarily cancel the subscription but may cause a cancellation of mandate/subscription. See our guide on dealing with failed transactions here.

Still not sure where to start with your subscriptions? We'd love your feedback!

You are invited to join our Discord community, where other members and Mollie developers will be happy to answer your questions or point you in the right direction.


Did this page help you?