JoomCourses takes payments by card through Stripe or PayPal, and also supports invoice requests and cash. You can disable payments entirely for free courses or if you handle payment outside your website.
Payment Options Overview
| Payment Method | Description |
|---|---|
| Stripe | Card payments, plus Apple Pay, Google Pay and Link (plugin) |
| PayPal | Online payment via PayPal (plugin) |
| Cash Payment | A built-in method for offline/cash payments |
| Request Invoice | Allows customers to request an invoice instead of paying online (plugin) |
| Disabled | No payment required — registration only |
Enabling or Disabling Payments
Disable All Payments
If your courses are free or you handle payments outside your website:
- Go to Components > JoomCourses > Configuration.
- Under General, set Disable Payment to Yes.
- The checkout will skip the payment step entirely. Users register and their application is created immediately.
Enable Cash Payment
- In Configuration > General, set Cash Payment to Yes.
- This adds a "Cash" option in the payment method selection during checkout.
- Cash payment applications are created with a "Pending" status until you manually change them to "Paid" in the admin.
Stripe Setup
Stripe is the way to take card payments. Customers pay on Stripe's own payment page and come back to your site, so card details never touch your server. Apple Pay, Google Pay, Link and any local payment methods you switch on in your Stripe Dashboard appear automatically.
You need a Stripe account (stripe.com). Stripe charges a fee per payment; JoomCourses does not.
Enabling the Stripe Plugin
The plugin installs disabled, so nothing changes on your site until you turn it on.
- Go to System > Plugins in the Joomla admin.
- Search for "stripe" and open JoomCourses - PaymentStripe.
- Set Status to Enabled.
- Leave Test Mode on Yes while you set everything up.
Adding Your Keys
- In Stripe, go to Developers > API keys with test mode switched on.
- Copy the secret key (it starts with
sk_test_) into Test Secret Key. - Save the plugin.
For the live keys later, use the same screen with test mode switched off.
A safer alternative: create a restricted key (rk_live_…) instead, allowing write access to Checkout Sessions and Refunds and read access to PaymentIntents and Charges. Joomla stores plugin settings as plain text, so a full secret key ends up in every database backup. A restricted key that leaks cannot move your balance or read your customer list.
Adding the Webhook
Stripe confirms payments by calling your site back. Without this step bookings stay unpaid.
- In the plugin settings, copy the address shown in Webhook URL.
- In Stripe, go to Developers > Webhooks and add it as an endpoint.
- Select these events:
checkout.session.completed,checkout.session.async_payment_succeeded,checkout.session.async_payment_failed,checkout.session.expired,charge.refunded,payment_intent.payment_failedandcharge.dispute.created. - Stripe shows a signing secret starting with
whsec_. Copy it into Test Webhook Signing Secret. - Repeat for live mode when you go live, and put that secret in Live Webhook Signing Secret.
Your site must be reachable from the internet for this to work. A site on localhost cannot receive webhooks.
Stripe Settings
| Setting | Description |
|---|---|
| Test Mode | Uses your test keys; no real money moves. Switch off only after a successful test payment |
| Test / Live Secret Key | Your Stripe key for each mode |
| Test / Live Webhook Signing Secret | The whsec_ secret Stripe shows when you add the endpoint |
| Webhook URL | The address to register in Stripe — copy it, you cannot edit it |
| Button Text | Wording on the payment button. The total is added automatically |
| Message Above the Button | Optional text shown to the customer before they pay |
| Send Alerts To | Where to email you about problems needing attention: duplicate payments, wrong amounts, partial refunds, disputes |
| Alert on Failed Payments | Email you when a card is declined. Off by default — declines are common and the customer can just try again |
| Enable Logging | Records what happens, with keys masked. Leave on: support will ask for it |
Advanced settings — a description for the Stripe page, how long a checkout stays valid, checkout language, card statement text, and a guard that ignores events from another copy of your site — have sensible defaults and rarely need changing.
Testing
With Test Mode set to Yes, book a course and pay with Stripe's test cards:
| Card number | Result |
|---|---|
| 4242 4242 4242 4242 | Payment succeeds |
| 4000 0000 0000 0002 | Card declined |
| 4000 0025 0000 3155 | Asks for 3-D Secure authentication |
Use any future expiry date and any 3-digit code. Check that the booking becomes Paid and that the payment appears in your Stripe Dashboard.
How Stripe Payment Works
- The customer chooses Stripe at checkout and clicks the payment button.
- They are taken to Stripe's payment page and pay there.
- Stripe notifies your site, which marks the booking Paid.
- The customer returns to their booking page on your site.
If the card is declined or the customer gives up, the booking stays payable so they can try again. Nothing is cancelled automatically.
Going Live
- Make a successful test payment first.
- Enter your live secret key and add the webhook endpoint in live mode.
- Set Test Mode to No.
- Make one real booking with a real card and refund it to confirm both directions work.
If something is not set up correctly — a missing key, or test keys with test mode off — the payment button is replaced by an explanation. Only administrators see the reason; customers see a short notice.
If a Payment Does Not Show Up
| Symptom | Usual cause |
|---|---|
| Customer paid but the booking is still unpaid | The webhook endpoint is missing in Stripe, or its signing secret was not copied into the plugin |
| No payment button on the booking page | Keys missing, or test keys used with Test Mode off. Log in as an administrator to see the reason |
| Nothing happens in Stripe | Your site is not reachable from the internet, or your currency is not supported by Stripe |
Switch Enable Logging on and check plg_joomcourses_paymentstripe.php in your Joomla log folder. Stripe also lists every attempt under Developers > Webhooks and Payments.
PayPal Setup
The PayPal payment plugin allows customers to pay online through PayPal.
Enabling the PayPal Plugin
- Go to System > Plugins in the Joomla admin.
- Search for "JoomCourses - PayPal Payment".
- Click on the plugin to open its settings.
- Set Status to Enabled.
Configuring PayPal
In the plugin settings, configure:
| Setting | Description |
|---|---|
| Business Email | Your PayPal merchant email address (required) |
| Test Environment | Enable for PayPal Sandbox testing; disable for live payments |
| Enable Logging | Turn on transaction logging for troubleshooting |
| Message | Custom message shown to users before they are redirected to PayPal |
Testing with PayPal Sandbox
Before going live:
- Create a PayPal Sandbox account at developer.paypal.com.
- In the plugin settings, set Test Environment to Yes.
- Enter your Sandbox business email.
- Process test bookings to verify the payment flow.
- When everything works correctly, set Test Environment to No and enter your live PayPal business email.
How PayPal Payment Works
- The user fills out the checkout form and selects PayPal as the payment method.
- They are redirected to PayPal to complete payment.
- PayPal sends an Instant Payment Notification (IPN) back to your site.
- JoomCourses verifies the payment and automatically changes the application status to Paid.
- The user is redirected back to a "Thank You" page on your site.
If payment fails or is canceled:
- The user is redirected to a "Payment Failed" page.
- The application remains in Pending status.
Payment Logging
When logging is enabled, all PayPal transaction details are recorded. This is helpful for troubleshooting payment issues. Check the Joomla logs directory for payment log files.
Invoice Request Setup
The invoice request plugin allows customers to request an invoice instead of paying immediately. This is common for B2B or corporate bookings.
Enabling the Invoice Plugin
- Go to System > Plugins in the Joomla admin.
- Search for "JoomCourses - Request Invoice".
- Click to open the plugin settings.
- Set Status to Enabled.
Configuring Invoice Request
| Setting | Description |
|---|---|
| Message | Custom message shown to users who select invoice payment |
How Invoice Request Works
- The user selects "Request Invoice" as their payment method during checkout.
- The application is created with a Pending status.
- You receive the application in the admin and can generate an invoice through your accounting system.
- Once payment is received, manually change the application status to Paid.
Refunds
A booking that was paid through a gateway that supports refunds shows a Refund button when you open it.
- Go to Components > JoomCourses > Bookings and open the paid booking.
- Check the Payment panel, which shows the total, the payment method and the gateway reference.
- Click Refund and confirm.
The money is returned through the gateway and the booking is then marked Refunded, with reversing entries written to your financial figures. This cannot be undone.
Notes:
- Only bookings with the status Paid can be refunded, and only the full amount.
- If the gateway cannot be reached, nothing is changed and the booking stays Paid, so you can try again.
- A refund you make directly in the Stripe Dashboard marks the booking Refunded here automatically.
- Cash and invoice bookings have no button; change their status by hand once you have returned the money.
Payment Received Email
The booking confirmation goes out at checkout, before any money has arrived. To also email customers when their payment actually succeeds:
- Create an email template of the type Booking State Changed (see Email Templates).
- Go to Components > JoomCourses > Options.
- Choose it under Payment Received Email Template.
Leave it unset and no such email is sent.
Payment Processing Flow
The complete payment flow in JoomCourses:
- User browses courses and adds a course date to their cart.
- Checkout — User fills in their details and selects a payment method.
- Payment processing — Depending on the method:
- Stripe: Customer pays on Stripe. The booking changes to Paid by itself.
- Cash: Application created as Pending. Admin manually confirms payment.
- PayPal: User redirected to PayPal. On success, status auto-changes to Paid.
- Invoice: Application created as Pending. Admin follows up with invoice.
- Disabled: Application created immediately with no payment step.
- Confirmation — User sees a success page. Confirmation email is sent (if configured).
- Admin review — Admin can view, manage, and update application statuses from the Applications list.
Multiple Payment Methods
When multiple payment methods are enabled, users see a selection of available methods during checkout. They choose their preferred method before completing the booking.
The available payment methods are determined by:
- Which payment plugins are installed and enabled
- Whether cash payment is enabled in the configuration
- Whether payments are disabled globally
Tips
- Always test first: Use Stripe test mode, or the PayPal sandbox, before accepting real payments.
- Do not skip the webhook: Stripe bookings stay unpaid until the webhook address is registered in Stripe and its signing secret is saved in the plugin.
- Use a restricted Stripe key: It limits the damage if your database backup ever leaks.
- Keep logging on: It is the first thing support will ask for when a payment goes wrong.
- Use invoice requests for corporate clients: Many organizations prefer to receive an invoice and pay by bank transfer.
- Monitor pending applications: Regularly check for applications stuck in "Pending" status, which may indicate payment issues.