LifterLMS Stripe Setup: Cards, Subscriptions, Webhooks and SCA

How to accept card payments and subscriptions in LifterLMS with the Stripe add-on: connecting your account, test mode, webhooks, the two payment flows, 3D Secure and SCA, and the mistakes that break renewals.

  • Add as a preferred source on Google
Illustration for “LifterLMS Stripe Setup: Cards, Subscriptions, Webhooks and SCA”

Stripe is the payment gateway most LifterLMS sites end up on, and for good reason: it handles one-time payments and subscriptions, keeps card details off your server, and supports the authentication rules banks now require in many countries.

This guide explains how to set up LifterLMS Stripe properly: connecting your account, testing with test mode, confirming webhooks, choosing a payment flow, and dealing with 3D Secure and Strong Customer Authentication (SCA). It also covers how recurring payments actually run, because that is where most Stripe problems on LifterLMS sites come from.

It is written for site owners and developers who already have courses and access plans. If you are still deciding how to price, read about payment plans and free trials first.

What the LifterLMS Stripe add-on does

Stripe support is not part of the free LifterLMS plugin. It comes from LifterLMS Stripe, a paid add-on from the LifterLMS team. Once installed and connected, it adds Stripe as a payment method on your checkout and lets you:

  • Take one-time card payments for courses and memberships.
  • Take recurring payments for subscription and payment-plan access plans, with the card saved at Stripe for renewals.
  • Issue refunds from the order screen in WordPress.
  • Let students update the card on a subscription from their dashboard.

Card numbers never touch your server. They go straight to Stripe, which keeps your PCI compliance burden low. You still need https across the site.

How renewals, refunds and cancellations work

Recurring payments

This is worth understanding before you set anything up. In LifterLMS, each subscription is a LifterLMS order with a billing schedule. When a payment is due, LifterLMS core triggers the charge from your WordPress site using its scheduled actions, and the Stripe add-on charges the card saved for that order.

That has three practical consequences:

  • Your site's scheduled tasks must run. If WP-Cron is disabled and no server cron replaces it, renewals do not happen on time.
  • Renewal dates, retries and statuses live in LifterLMS. The order's Next Payment Date and its notes are the first place to look when a renewal is missing.
  • Staging copies must not charge real customers. LifterLMS watches for a change of site URL and offers to disable automatic recurring payments on the copy. The current state is shown as Automatic Recurring Payments on the General settings tab.

Failed renewals are retried automatically when Retry Failed Payments is enabled on the Checkout tab, which it is by default. Stripe is one of the gateways LifterLMS lists as supporting retries.

Refunds and cancellations

Refund from WordPress, not only from Stripe. Open the order from the Orders menu, find the transaction in the Transactions box and refund through the gateway. LifterLMS records the refund on the order and, by default, a refunded order removes the student's enrollment. If you refund from the Stripe dashboard instead, the charge.refunded webhook is how LifterLMS finds out, so working webhooks matter.

Students can cancel a subscription from their dashboard. The order moves to Pending Cancellation, they keep access until the end of the period they paid for, and no further charges are taken.

Install and connect LifterLMS Stripe

  1. Download the add-on from your LifterLMS account, then go to Plugins > Add New Plugin > Upload Plugin, install the zip and activate it.
  2. Go to LifterLMS > Settings > Checkout and open the Stripe section.
  3. Tick Enable Stripe Payment Gateway.
  4. Click Connect Stripe and sign in to your Stripe account. When you return, the settings show that live mode is connected.
  5. Check that Webhook Status shows as installed.
  6. Save the settings.

Connect is the current method. Sites set up before September 2024 may still use manually entered secret and publishable keys; the LifterLMS documentation notes that keys can also be defined in wp-config.php instead of the database. Whichever you use, the LifterLMS Stripe getting started guide has the current screens.

Before going further, set your store Currency on the Checkout tab to the currency your Stripe account will charge in.

Test mode and test cards

Tick Enable Stripe Test Mode in the Stripe section and save. Checkout now talks to Stripe's test environment and no real money moves. Switch your Stripe dashboard to test mode to see the payments arrive.

Stripe publishes test card numbers for every scenario. The three you need most:

Card numberResultWhat to check in LifterLMS
4242 4242 4242 4242SucceedsOrder Completed or Active, student enrolled, receipt sent
4000 0000 0000 3220Requires 3D Secure authenticationThe authentication window appears and the order completes after you approve it
4000 0000 0000 0002DeclinedA clear error at checkout and no enrollment

Use any future expiry date and any three-digit CVC. Test a one-time plan, a recurring plan, a plan with a trial and a plan with a coupon. Then turn test mode off. A launch with test mode still on looks fine until you notice no money has arrived.

Webhooks: what they do and how to check them

Webhooks are how Stripe tells your site about events that happen after the buyer leaves checkout: a refund issued in the Stripe dashboard, a charge that fails later, or a hosted checkout session completing. LifterLMS Stripe creates its webhook automatically when you connect.

According to the LifterLMS documentation, the webhook should listen for six events: charge.failed, charge.refunded, checkout.session.async_payment_failed, checkout.session.async_payment_succeeded, checkout.session.completed and checkout.session.expired.

If Webhook Status does not show as installed:

  1. Check the site is reachable from the internet. Webhooks cannot reach a local or password-protected site.
  2. Look in your Stripe dashboard under Developers > Webhooks for an endpoint pointing at your site, and at its recent delivery attempts.
  3. Turn on Enable Debug Logging in the Stripe section and check the logs for errors.
  4. Check that a security plugin or firewall is not blocking requests from Stripe.

Each environment needs its own webhook. Staging and live sites should never share one.

Choosing a payment flow: on-site card form or Stripe Checkout

LifterLMS Stripe offers two ways to take the card:

  • Stripe Elements (default). The card field is embedded in your LifterLMS checkout page. Buyers never leave your site.
  • Stripe Checkout (beta at the time of writing). Buyers are redirected to a Stripe-hosted payment page, which can show wallets such as Apple Pay and Google Pay next to cards. It is enabled by adding define( 'LLMS_STRIPE_ENABLE_STRIPE_CHECKOUT', true ); to wp-config.php and then setting Payment Flow to Stripe Checkout in the Stripe settings.

Additional payment methods are switched on in your Stripe dashboard, not in LifterLMS. Be careful with recurring plans: some payment methods only support one-time payments, and offering one on a subscription leads to failed renewals. Test the hosted flow on a staging site before switching a live store.

3D Secure and SCA

Strong Customer Authentication is a European rule that requires many card payments to be confirmed by the cardholder, usually through a banking app or a one-time code. Card networks implement it as 3D Secure. LifterLMS Stripe supports it; there is no LifterLMS setting to switch on.

What you control is in Stripe. The LifterLMS article on Stripe and SCA explains that 3D Secure is driven by Radar rules in your Stripe dashboard, that the default rule requesting 3D Secure when the card requires it should stay on, and that Stripe's Billing settings include an option to request 3D Secure for recurring payments that match Radar rules.

The part that affects your students is renewals. A recurring charge happens when the student is not at their computer. If their bank insists on authentication for that charge, it fails. LifterLMS then puts the order on hold and the retry rules kick in. The fix is for the student to log in, open the order on their dashboard and update the payment method, which re-authorises the card. Once a payment succeeds, the order returns to Active and access is restored.

Make that easy: mention in your renewal and failed-payment emails exactly where to update a card, and keep the Student Dashboard link visible in your site menu.

Common mistakes

  • Leaving test mode on at launch. Everything looks normal and nothing is charged.
  • Cloning live to staging without checking recurring payments. A staging copy with live keys and running cron can charge real students twice.
  • Disabling WP-Cron without a replacement. Renewals stop silently.
  • Turning off Stripe's default 3D Secure rule. More declines and disputes, not fewer.
  • Caching the checkout page. Exclude checkout and the Student Dashboard from page and edge caching.
  • Refunding only in Stripe while webhooks are broken. The student keeps access and your LifterLMS reports disagree with Stripe.

Frequently asked questions

Is Stripe included in free LifterLMS?

No. Core includes only the manual gateway. Stripe needs the LifterLMS Stripe add-on.

Does LifterLMS Stripe support subscriptions?

Yes. Recurring access plans, payment plans with a fixed number of payments, and trials all work with Stripe. LifterLMS schedules each renewal and Stripe charges the saved card.

Can students pay with Apple Pay or Google Pay?

The LifterLMS documentation describes wallets on the Stripe Checkout payment flow, which is in beta at the time of writing, with the payment methods enabled in your Stripe dashboard.

Why did a student's renewal fail when their card is valid?

The most common reason in Europe is that the bank required authentication. The student needs to update or re-confirm their payment method from the dashboard.

Next steps

Install the add-on, connect in test mode, run the three test cards against each type of plan you sell, confirm the webhook, then switch to live and make one small real purchase. Keep an eye on the first round of renewals.

If renewals are failing, payments are arriving in Stripe but not in LifterLMS, or you need Stripe connected to invoicing or tax tools, our LifterLMS integrations team can trace and fix it. Get in touch with what you are seeing.

Add LifterLMS Expert to your preferred sources

Add lifterlmsexpert as a preferred source on Google, or open this article in your AI assistant to use it as a source.

  • Add as a preferred source on Google
VishavjeetChoubeyLifterLMS Expert
Free consultation

Prefer expert help over DIY?

Skip the trial and error. Get specialist LifterLMS help and ship faster.

Talk to a LifterLMS Expert Explore our services

Replies within one business day