REIGN

22 min read · 4,373 words

How to Sell Online Courses on WordPress With Stripe

Reign featured image: sell online courses on WordPress with Stripe, from checkout to course access

To sell online courses on WordPress with Stripe, you need four pieces: a Stripe account, a course plugin, a checkout that sends the buyer to Stripe, and a rule that opens the course only after Stripe confirms the payment. Most setups fail at that last piece. This guide walks through the whole chain in order, from choosing what to sell to testing a purchase in Stripe’s test environment before a real customer ever pays.

Stripe details here come from Stripe’s own documentation, read in October 2026. Stripe changes features and fees often, so check stripe.com for pricing and for what is available in your country before you commit.

In this guide

  • What you need before the first sale
  • Three ways to connect Stripe to a course site, compared
  • Step 1: decide what you are selling
  • Step 2: set up Stripe and its test environment
  • Step 3: create products and prices
  • Step 4: connect checkout to your course site
  • Step 5: give access when the payment lands
  • Step 6: bundles and coupons
  • Step 7: subscriptions and failed payments
  • Step 8: refunds and disputes
  • Step 9: tax
  • Step 10: receipts and fraud checks
  • Step 11: test the whole flow
  • What a Reign site adds around the checkout
  • Questions people ask

What do you need before you sell a course on WordPress with Stripe?

You need a course plugin that can hold content back from non-buyers, a Stripe account, and a way for the two to talk to each other. That is the whole list. Everything else in this guide is a choice about how those three connect and what happens when something goes wrong.

A few terms first.

  • Stripe is a payment processor. It takes the card, runs the charge and sends the money to your bank.
  • Checkout is the payment page Stripe provides. Stripe’s documentation lists three ways to show it: a full page hosted by Stripe or embedded on your site, an embedded form, or a fully custom page built with Stripe’s Elements components.
  • A webhook is a message Stripe sends to your website when something happens, such as a payment succeeding. It is how your site learns about a sale without the buyer doing anything.
  • Fulfilment is Stripe’s word for giving the customer what they paid for. For you, that means enrolling the student in the course.
  • Test mode is a safe copy of Stripe where no real money moves. Stripe now calls this a sandbox.

No course plugin yet? Read our comparison of WordPress LMS plugins with payment integration first. Still weighing a hosted platform? What online course platforms charge and what owning it looks like covers that trade.

How do you connect Stripe to a course site?

There are three common routes. Pick the one that matches how much setup you want to do yourself and how much control you need over the checkout.

RouteHow it worksGood forWatch out for
Course plugin with built-in checkoutThe plugin sells the course and handles enrolment itself. Learnomy, made by Wbcom, lists Stripe and PayPal checkout, membership plans, coupons and a transaction ledger on its site. Check the product page for what your licence includes.Creators who want one tool that sells and teaches.You depend on that plugin for every payment feature. Read its refund and failed-payment behaviour before you launch.
Course plugin plus a store or payments pluginA separate plugin takes the payment, and the course plugin enrols the student when the order completes.Sites that already sell other things, or need store features around the course.Two plugins must agree on what “paid” means. Test refunds and failed renewals, because that is where they drift apart.
Stripe Checkout or Payment Links, wired up by a developerYou create products in Stripe, send buyers to Stripe’s page, and write a small handler that enrols them when Stripe’s webhook arrives. Stripe says Payment Links use Checkout.Custom setups with unusual rules.You own the code. Stripe’s documentation says fulfilment must be driven by webhooks, so a developer has to build and maintain that handler.

For most creators the first route is the right start. You can change the route later, but the enrolment records live in the course plugin, and moving them means a migration, so choose with that in mind. Our guide on self-hosted online course platforms helps if you are still comparing options.

Step 1: What exactly are you selling?

Decide the product shape before you touch any settings. Four shapes cover most course businesses, and you can mix them.

A single course, paid once. The buyer pays and keeps access. It is the simplest to set up, and it has no recurring revenue.

A membership. The buyer pays on a repeating schedule and keeps access while payments continue. Failed payments become a regular concern here.

A payment plan. The buyer pays a larger price in several parts. In Stripe’s terms, this is a subscription that stops after a set number of billing cycles, which Stripe’s subscription documentation describes as a supported cancellation option. Decide up front what happens to access if the buyer stops paying halfway.

A bundle. Several courses sold together under one price, usually at a lower total than buying each alone. Bundles are mostly a content decision, not a payment one, and we cover them in Step 6.

For each product, write down what the buyer gets, how long they keep it, and what happens when they stop paying or ask for their money back. Those answers become your settings later.

To confirm this step worked, you should be able to fill in one table row per product: name, price type, access length and refund rule.

Step 2: How do you set up Stripe and its test environment?

Create a Stripe account, then build in Stripe’s sandbox before you switch anything live. Stripe says a new account starts in a sandbox, where you can charge test cards and create test products and prices without moving real money.

Three things to know about the sandbox, all from Stripe’s testing documentation.

  • Objects in one mode cannot be used in the other. A test product cannot be part of a live payment, so expect to recreate products when you go live.
  • You get a separate set of API keys for test and live. The keys decide whether your site talks to the sandbox or the real thing. Stripe advises keeping live keys in a secrets vault or environment variables, not in files committed to version control.
  • By default, Stripe does not email customers from a sandbox, so no receipt arrives. You can send test receipts by hand, as in Step 11.

Stripe also notes that the original test-mode sandbox shares some settings with live mode. For a new project it recommends a separate general sandbox, which keeps settings and data apart from live mode.

To confirm this step worked, you should be able to log in to the Stripe Dashboard, see that you are in a sandbox, and find your test API keys on the API keys page.

Step 3: How do you create products and prices in Stripe?

Create one Stripe product per thing you sell, and one price per way of paying for it. Stripe separates the two: a product is what you sell, and a price is how much and how often to charge for it.

A course sold both outright and as a monthly membership is one product with two prices. Stripe lists the recurring models it supports: flat rate, per-seat, tiered and usage-based. For courses, flat rate usually fits. Per-seat only matters if you sell to teams and charge by learner count.

Give every product a clear name. Buyers see that name on the checkout page, so “Photography Basics, lifetime access” is better than “Product 3”. Your future self will thank you when matching refunds to courses.

If your course plugin creates the Stripe products for you, still open the Dashboard and check what it made. Names, prices and tax settings are easier to fix now than after a hundred sales.

To confirm this step worked, each product in the Stripe Dashboard should show the right name and the right price or prices, with the repeating ones marked as repeating.

Step 4: How do you connect checkout to your course site?

Connect Stripe to your site using the route you chose, then make sure the buyer lands back on a useful page after paying. The exact screens depend on your plugin, so follow its own setup guide for the key entry. The decisions that matter are the same everywhere.

Choose hosted or embedded checkout. Stripe’s documentation recommends the full-page option and rates its ongoing maintenance as low. The embedded form needs some upkeep, and a fully custom Elements page needs the most. Stripe also lists the full-page option as including a full order summary with discounts and promotion codes and free trials. Unless you have a design reason, use the hosted page.

Set where the buyer goes afterwards. Stripe lets you set a landing page URL that Checkout sends the buyer to after payment. Send them to a page on your site that says what happens next: “You are enrolled, here is your first lesson.” A buyer left on a blank page after paying is a refund request waiting to happen.

Collect only what you need. Name and email are enough for most courses. Tax setup in Step 9 might add an address requirement.

State your terms on the sales page. Say how long access lasts and what your refund rule is, so the buyer decides before the card comes out.

For a community around your courses, see building a paid online course community on WordPress and charging for a community with Stripe.

To confirm this step worked, click your own Buy button in test mode and check that you reach Stripe’s page showing the right product name and price, then land back on your site.

Step 5: How does a student get access after paying?

Access should be granted by the message Stripe sends to your site, not by the page the buyer lands on. Stripe’s fulfilment documentation is blunt about this: you cannot rely on triggering fulfilment only from your checkout landing page, because a customer can pay successfully and lose their connection before the page loads.

Here is the pattern Stripe describes, in plain words.

  1. The buyer pays. Stripe sends a checkout.session.completed event to your site.
  2. Your site checks the payment status on that session and, if it is not unpaid, enrols the student.
  3. Your site records that this session has been fulfilled, so the same payment never enrols twice.
  4. When the buyer arrives on your landing page, the same check runs again. Whichever of the two arrives first does the enrolment, and the second does nothing.

Stripe says the fulfilment function can be called more than once for the same session, even at the same moment, so it must be safe to run repeatedly. It also says webhooks are required for subscriptions and for payment methods with delayed confirmation, such as bank debits. For those, Stripe sends a separate checkout.session.async_payment_succeeded event when the money finally arrives, and you should also watch for the matching failure event.

With a built-in checkout, this is the plugin’s job, but ask its support or read its documentation: does it enrol on a webhook or only on the return page? Does it handle delayed payment methods? A plugin that only trusts the return page will sooner or later take a payment and leave a student locked out.

Once a course is paid for, the next problem is a login passed around. Our piece on stopping course account sharing covers what to check in a course plugin.

To confirm this step worked, make a test purchase with a second user account and check that the new student appears in the course, with access, within moments, even if you close the browser tab right after paying.

Step 6: How do you offer bundles and coupons?

A bundle is one product that enrols the buyer in several courses, and a coupon is a discount applied at checkout. Keep them separate in your head: a bundle changes what is sold, a coupon changes what it costs.

Bundles

Build a bundle as a new product with its own price, and tell your course plugin that buying it enrols the student in each included course. Avoid selling it as separate purchases in one basket, because refunds and access rules get messy. Decide whether a refund removes all the courses or only some, and write that into your refund policy.

Check what happens when someone already owns one course in the bundle, and test it with a real example.

Coupons

Stripe separates coupons from promotion codes, and the difference matters for how you launch. In Stripe’s documentation, a coupon is back-end logic that your system applies, while a promotion code is the customer-facing string a buyer types at checkout. Many promotion codes can point at one coupon.

Stripe’s promotion codes can be limited in several ways, all listed in its documentation: to one customer, to first-time purchases only, to a minimum order value, to an expiry date, and to a maximum number of redemptions. A coupon can also be set to apply once, for a set number of months, or forever. That “forever” option is easy to choose by accident, so read it twice before you save.

For a launch week, create one promotion code with an expiry date and a redemption cap, so the offer ends on schedule. For affiliate partners, create one promotion code per partner pointing at the same coupon, so you can see whose code was used.

If your course plugin has its own coupon system, test it too. Learnomy’s site lists coupons among its payment features; check the product page for details. Either way, check that the discounted price is what Stripe actually charges, not just what the page displays.

To confirm this step worked, buy a bundle and a discounted course in test mode, and check that both the Stripe payment amount and the student’s access match what you intended.

Step 7: What happens when a subscription payment fails?

When a recurring payment fails, Stripe tries again on a schedule, and your site must decide how long the student keeps access in the meantime. Failed payments are normal, so plan for them before launch.

Stripe’s subscription documentation describes the lifecycle. A new subscription starts as incomplete until the first invoice is paid, then becomes active. If the first payment is not made within 23 hours, the subscription becomes incomplete_expired and does not bill the customer. For later failures, the subscription becomes past_due. Stripe might retry while it is past due, and what happens after the last retry depends on your settings in the Stripe Dashboard: the subscription can move to canceled or unpaid, or stay past_due.

Stripe offers Smart Retries or custom retry rules for failed payments. Stripe also says that for the unpaid status, you should revoke access to your product, because Stripe has already attempted and retried payment.

That leaves you a policy to choose. A common approach is to keep access during the retry window, since many failures are an expired card, then remove it at the final status you configured. Message the student the moment a payment fails, with a link to update their card. Stripe recommends listening for invoice.payment_failed and notifying the customer, and offers a customer portal where subscribers manage billing details.

Some payments need the customer to authenticate, for example with 3D Secure. Stripe then sends an invoice.payment_action_required event, and your emails should cover that case too.

For a one-time course none of this applies, which is one reason a single payment is simpler to run.

To confirm this step worked, simulate a failed renewal in test mode and check that the student gets the message you wrote and keeps or loses access according to your rule.

Step 8: How do refunds and disputes work?

You can refund all or part of a payment from the Stripe Dashboard or through the API, and the money goes back to the original payment method only. Stripe’s documentation says you can issue more than one refund against a charge, as long as the total never exceeds the original amount.

Some details worth knowing before you write a refund policy, all from Stripe’s refund documentation.

  • Stripe’s processing fees from the original transaction are not returned when you refund. Check Stripe’s pricing page for how that affects you.
  • The customer typically sees a card refund as a credit roughly 5 to 10 business days later, depending on the bank.
  • A refund issued soon after the charge can show up as a reversal, where the original charge disappears from the statement and no separate credit appears.
  • Stripe can email the customer about a refund if you turn on refund emails in the Dashboard.

Your site then needs to react. If a student is refunded, should access end? Find out whether your plugin removes access automatically or leaves it to you.

Disputes are different from refunds

A dispute, often called a chargeback, happens when a buyer asks their bank to reverse the payment instead of asking you. Stripe’s documentation says that when a dispute is opened, Stripe debits the disputed amount plus a dispute fee from your balance, and you cannot issue a refund outside the dispute process while it is open. Card networks typically allow disputes within 120 days of the payment, and the full process can take two to three months.

Make refunds easy to ask for and answer quickly. A buyer who can get a refund from you in a day has little reason to go to their bank. Stripe’s guidance on contesting disputes is worth reading before you need it.

Consumer rules on refunds and cancellation rights differ between countries. Check the rules where you and your buyers live.

To confirm this step worked, refund a test payment in the Dashboard and check what happens to the student’s access and to the confirmation email, if any.

Step 9: Who handles tax on course sales?

You are generally responsible for working out and collecting any tax that applies to your sales, and the rules depend on where you and your buyers are. This guide cannot tell you what applies to you. Check your local rules, and talk to an accountant who knows digital sales in your country.

What Stripe offers, according to its documentation, is a tool called Stripe Tax. It calculates sales tax, VAT and GST based on the product type, the customer’s location and your business location. It also tracks your sales against local registration thresholds and alerts you when you might have obligations, and it can help manage registrations. Stripe lists it as a separate product with its own pricing, so check the pricing page.

Two details matter when you set it up. Stripe Tax uses a tax code on each product to decide how it is taxed. If you do not set one, it uses the default from your tax settings, so check that default fits a digital course. And Stripe asks you to decide whether your displayed prices include tax or have tax added on top. That choice changes what the buyer sees at checkout, so decide before you publish prices.

To confirm this step worked, run a test purchase from an address in a place where you expect tax and check that the Checkout page and the receipt show what you intended.

Step 10: How do receipts and fraud checks work?

Stripe creates a receipt for every successful payment and refund, and you decide whether it emails them automatically. In the Dashboard, under the customer email settings, you can switch on receipts for successful payments and for refunds. Nothing is sent when a payment fails.

You can add your logo and brand colours to the receipt. Stripe says receipts must show your legal business name, a customer support address, a support email and a privacy policy URL, so fill those in before launch.

One catch: for one-time Checkout payments, Stripe’s receipt page says invoices are priced separately. If buyers need a formal invoice, check Stripe’s pricing before switching it on. Subscriptions generate invoices automatically.

Radar basics

Radar is Stripe’s fraud tool. Stripe describes it as evaluating transactions in real time with AI algorithms to assess the risk of fraud, and it has a rules engine where you can tell it to allow, block, review or request 3D Secure authentication for certain payments. Its page also lists tools for customer abuse, including free-trial abuse and account sharing. Features depend on the Radar plan, so check Stripe’s page.

For a digital course, the usual pattern is a stolen card followed by a dispute weeks later. Keep the default protections on and look at the risk evaluation on your first few payments. Do not block whole countries without a reason, since you will turn away real buyers.

To confirm this step worked, send yourself a manual test receipt from the Dashboard, since sandboxes do not email customers by default, and check how it looks.

Step 11: How do you test the whole flow before going live?

Run every path through the sandbox with test cards, in this order, and fix anything odd before you flip to live keys. Stripe says test card numbers work only in the sandbox, and gives 4242 4242 4242 4242 as the card for a successful payment, with any future expiry date and any three-digit security code. For failed payments and other scenarios, Stripe publishes specific test card numbers on its testing page, so take them from there.

Work through this list.

  1. Successful one-time purchase. Pay for a course with a second account. Check the enrolment, the landing page, and the Stripe payment status.
  2. Close the tab early. Pay, then close the browser the moment the payment page finishes. Check the student is still enrolled. This proves the webhook works.
  3. Failed card. Use a test card that declines. Check the buyer sees a clear message and no access is granted.
  4. Coupon. Apply a valid code, an expired code and a code past its redemption limit. Check each outcome.
  5. Bundle. Buy a bundle, then buy one that includes a course you already own.
  6. Subscription start and failed renewal. Use Stripe’s test mode to run a renewal that fails, and check your emails and access rule.
  7. Full and partial refund. Refund in the Dashboard. Check access and the email.
  8. Receipt. Send a manual test receipt and read it on a phone.
  9. Tax. If you use Stripe Tax, run an address that should be taxed.

Stripe also provides a command line tool that forwards webhook events to a local site, which a developer can use to watch events arrive. The Dashboard can delete all test data later, and Stripe says that cannot be undone.

When every line passes, switch to live keys, recreate products if your setup requires it, and make one real purchase yourself, then refund it. That confirms the live keys and live webhook work. The processing fee on that test is not returned.

To confirm the launch worked, the real purchase should appear in the live Dashboard, enrol the student and produce a receipt.

What does a Reign site add around the checkout?

Reign is the WordPress community theme from Wbcom Designs. It offers five header layouts, colour tokens and dark mode without code, so a pricing page, a login page and a student area can share one design.

If your plan is to sell courses and keep students around afterwards, the community side matters. BuddyNext, also by Wbcom, adds an activity feed, Spaces, profiles, member directory and native Stripe membership tiers, so a course buyer can step into a members area on the same site. Learnomy, the Wbcom course plugin, covers courses, lessons, quizzes, student progress and certificates; for payments inside Learnomy, check the product page for what your licence includes. Each runs on its own, so you can use one without the others.

Reign is not a payment tool. It does not process cards or manage subscriptions. If you already use a different LMS, Reign has paid add-ons for LearnDash, LifterLMS, Tutor LMS and Sensei.

Weighing this against a hosted platform? See our Kajabi alternative guide and our Skool alternative guide. For getting your first buyers into a community, see how to launch an online community and reach your first 100 members.

Questions people ask

Can I sell courses on WordPress with only Stripe and no other plugin?

You can take payments with Stripe alone, but WordPress will not enrol anyone on its own. You still need a course plugin to hold the content back and something to connect a payment to an enrolment. Most creators use a plugin that does both.

Do I need a developer to connect Stripe to my courses?

Not if your course or payments plugin includes Stripe checkout, because it handles the webhook. You need one if you build the link yourself, since Stripe says webhooks are required for fulfilment.

Should I sell a one-time course or a membership?

A fixed course suits a single payment. A library you keep adding to, or a course with a community, suits a membership, which also means handling failed payments.

Who pays the tax on my online course sales?

Tax rules depend on where you and your buyers are, and in many places the seller is responsible for collecting and reporting it. Stripe has tools that calculate and track tax, but they do not replace advice. Check your local rules and ask an accountant.

How do I test Stripe payments without spending money?

Use Stripe’s sandbox and its test cards. Payments there move no real money, and Stripe says test card numbers work only in the sandbox. Run every path in Step 11 before you go live.

Where to go from here

Start with Step 1, then build and test in the sandbox before any live payment. For the site around the checkout, see what Reign can do. For courses on your own domain, look at Learnomy, and for a community your students can join, BuddyNext. For a broader view, see our general guide to selling online courses on WordPress.

Reading
22 min · 4,373 words
Published
Oct 22, 2026
Shashank Dubey
Reign contributor

Writing about WordPress communities, BuddyPress, BuddyBoss, LMS plugins, and the business of paid communities.

Keep reading

More from the Reign blog

Browse all posts on community, WordPress, BuddyPress and the studio of plugins behind Reign.

What customers say on Trustpilot

Swift and expert coding!

Swift and expert coding by Kerit to apply a personalised display adjustment on the Reign Theme for a media plugin that was not fully supported at the moment.

RussellGB