Recurring payments

Recurring payments can be used to charge customers on a regular basis or to offer automatic top-ups with credits-based services. Since the amount for a recurring payment is variable, other innovative use-cases are possible as well. Like doing a partial prepayment and later a final recurring payment, for more expensive products. Or charging a customer in your Dashboard manually, for orders by phone.

Recurring payments happen in the background. The customer goes through the payment steps only once, for the first payment.

Reducing the risk of chargebacks

To reduce the risk of chargebacks, it’s recommended to communicate how often and how much the customer will be charged as clearly as possible. We suggest notifying the customer a couple of days in advance of the next payment, for example by sending them an email.

How to get started

In the following sections we explain the following topics.

For more information on how to test recurring payments, refer to our guide for testing the Mollie API.

Setting up the first payment

In order to get started with recurring payments you need to require the customer’s consent through a first payment. It’s similar to a regular payment, but the customer is shown information about your organization, and the customer needs to complete the payment with the account or card that will be used for recurring charges in the future. After the first payment is completed successfully, the customer’s account or card will immediately be chargeable on-demand, or periodically through subscriptions.

  1. Create a unique customer using the Customers API. If you are using Mollie Connect, make sure you have the permission customers.write in order to create a customer.
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]\"}"
<?php

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

$customer = $mollie->customers->create([
    "name" => "Customer A",
    "email" => "[email protected]"
]);
  1. Save the customer’s id in your database. You need it for the next step.
  2. Create a payment (or order) for the customer by specifying the customerId and setting the sequenceType parameter to first. If you're using the Orders API, those parameters must be included in the payment section of the Create Order payload.

📘

Authorise a first payment for subscription payments

For credit card and PayPal payments, you can create a payment with a zero amount. No money will then be debited from the card or account when doing the first payment. If you intend to start a subscription, you can use this payment as the first installment, e.g. by charging the amount you will periodically charge. Next, you can set up a subscription which starts after the first period. See also the startDate field in the Subscriptions API.

curl -X POST https://api.mollie.com/v2/payments \
    -H "Authorization: Bearer test_dHar4XY7LxsDOtmnkVtjNVWXLSlXsM" \
    -H "Content-Type: application/json" \
    -d \
    "{
        \"amount\": {\"currency\":\"EUR\", \"value\":\"0.01\"},
        \"customerId\": \"cst_Ok2DlrJe5\",
        \"sequenceType\": \"first\",
        \"description\": \"First payment\",
        \"redirectUrl\": \"https://webshop.example.org/order/12345/\",
        \"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" => "0.01"
    ],
    "customerId" => "cst_Ok2DlrJe5",
    "sequenceType" => "first",
    "description" => "First payment",
    "redirectUrl" => "https://webshop.example.org/order/12345/",
    "webhookUrl" => "https://webshop.example.org/payments/webhook/"
]);
  1. Redirect the customer to the _links.checkout.href to complete the first payment. Make sure to use an HTTP GET redirect. You can find an example of the hosted checkout in our demo environment.
  2. Once completed there will be a customer mandate that you can access via the Mandates API. If the first payment was paid using a creditcard, the resulting mandate method will be creditcard as well. paypal will result in a paypal mandate. Virtually all other first payment methods will be a directdebit mandate.

📘

Not all payment methods support a first payment. When the method parameter is not provided in the API, we take care of this automatically in our Checkout. The following payment methods support a first payment and are thus allowed as a value for the method parameter of a first payment: applepay bancontact belfius creditcard eps trustly ideal kbc mybank paypal, paybybank

Charging immediately on-demand

Now that the customer has given their consent, it’s possible to perform a recurring payment on-demand. Instead of the regular payment with a redirectUrl, a recurring payment happens in the background without a browser session, i.e. without the customer going through payments steps. You can create a recurring payment with the sequenceType set to recurring when creating a payment with the Payments API.

In order to do recurring payments, SEPA Direct Debit or credit card has to be activated on your profile.

  1. Make sure the customer has valid mandates. Find out using the Mandates API.
curl -X GET https://api.mollie.com/v2/customers/cst_4qqhO89gsT/mandates \
    -H "Authorization: Bearer test_dHar4XY7LxsDOtmnkVtjNVWXLSlXsM"
<?php

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

$mandates = $mollie->customers->get("cst_4qqhO89gsT")->mandates();
  1. If there’s at least one mandate with a status set to valid then continue.
  2. Set the sequenceType parameter to recurring to charge the 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\",
        \"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/"
]);
  1. Like regular payments your webhook is called for retrieving status updates.

Charging periodically with subscriptions

For simple regular recurring payments with constant amounts, you can create subscriptions with the Subscriptions API. Subscription payments will be spawned automatically at the specified frequency, and will show up in your Dashboard.

  1. Make sure the customer has a pending or valid mandate using the Mandates API.
curl -X GET https://api.mollie.com/v2/customers/cst_4qqhO89gsT/mandates \
    -H "Authorization: Bearer test_dHar4XY7LxsDOtmnkVtjNVWXLSlXsM"
<?php

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

$mandates = $mollie->customers->get("cst_4qqhO89gsT")->mandates();
  1. Continue if there’s a mandate with its status being either pending or valid, otherwise set up a _first _payment for the customer first.
  2. Create the subscription using the Create subscription endpoint.
curl -X POST https://api.mollie.com/v2/customers/cst_Ok2DlrJe5/subscriptions \
    -H "Authorization: Bearer test_dHar4XY7LxsDOtmnkVtjNVWXLSlXsM" \
    -H "Content-Type: application/json" \
    -d \
    "{
        \"amount\": {\"currency\":\"EUR\", \"value\":\"25.00\"},
        \"times\": 4,
        \"interval\": \"3 months\",
        \"description\": \"Quarterly 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/"
]);
  1. In the above example the customer is charged €25.00 for 4 times every 3 months, starting today.
  2. The webhook URL will be triggered for every payment to communicate any status updates.

Refer to the documentation of the API client you are using for more examples.

How do webhooks for subscriptions work?

When using our Subscriptions API to charge a customer periodically, new payments are created by Mollie every time the customer is charged. We will call your webhook as usual for these payments. The only difference is, the payment ID will not be known by your system yet when we call the webhook to report the payment’s status.

With normal payments you know the payment ID, because you’ve received this when creating the payment. With subscriptions you do not know the payment ID in advance. You will receive a webhook call with a payment ID that you have likely never seen before.

The payment object will, however, contain a subscriptionId field that contains the subscription ID you received when the subscription was created. This allows you to recognize where the payment belongs to.

We do not provide webhooks specifically for status changes of a Subscription itself.

Failing or disputed subscription payments

As with any other recurring payment, subscription payments can fail or be disputed via a chargeback. Generally, unsuccessful payments will not affect your subscription, but there are some exceptions. Here are the two most important things to know:

Mollie will not retry the failed or disputed payment
If your subscription payment does not succeed, Mollie will not make another attempt. The next charge date will be updated regardless of the result, and the next payment will be created following the normal interval set by you.

Some chargeback/failure reasons will cancel your subscription
As stated above, Mollie will generally not cancel your subscription when a payment fails. However, there are some reasons that can lead to cancellation. It varies whether the subscription will be canceled immediately or after a few occurrences of the same issue. The following reasons may cause your subscription to be canceled:

ReasonReason codeCancels subscription...
Account identifier incorrect (i.e. invalid IBAN)AC01Immediately
Account closedAC04Immediately
Account blocked for Direct DebitAC06Immediately
No MandateMD01After 3 times
Return of funds requested by end customerMD06After 3 times
Debtor deceasedMD07Immediately
Refusal by the DebtorMS02After 3 times
Reason not specifiedMS03After 3 times
Specific Service offered by the Debtor BankSL01After 3 times

❗️

Be aware!

If your subscription has a fixed mandate set (mandateId field), cancelling the subscription based on the reasons above will also revoke the mandate itself.