Payload CMS and Open edX

Your site, course catalog, and LMS - all connected

Abstract Technology integrates Payload CMS with Open edX so your public website, course shop, and learning platform share one login, one brand, and one enrollment flow. Deployed as a single Tutor plugin.

The Gap

Open edX is a world-class LMS. It was never meant to be your website.

Payload with Open edX

Most large Open edX deployments run their marketing site separately from their online learning platform, and for good reason. Open edX is built to deliver world-class learning, not to power landing pages, blogs, SEO campaigns, or checkout flows. By integrating Payload CMS, a modern, flexible, developer-friendly content platform, directly with Open edX, Abstract-Technology unifies your entire digital presence. Your public website, course catalog, and learning environment finally share the same login, the same look and feel, and the same automated enrollment flow. A visitor discovers a course on a fast, SEO-optimized marketing page, pays in a few clicks, and lands directly inside the course, no friction, no re-registration, no lost sales. And because it's deployed as a single Tutor plugin, there's no fragile custom glue to maintain. It installs cleanly, scales with your platform, and stays maintainable over time. The result: one brand, one seamless learner journey, and one platform your team can actually manage, turning your Open edX deployment from a course-delivery tool into a complete, revenue-ready academy.

Learn more about openedx

Disconnected user experience

Learners bounce between a marketing site and the LMS with different logins, different styling, different navigation. That friction bleeds conversions - especially on mobile, where patience is measured in seconds.

Manual course catalog updates

Every time you publish a new course in Studio, someone has to manually recreate the listing on your website. Dates get stale. Descriptions drift. The catalog you show the world stops matching reality.

E-commerce as an afterthought

Open edX's built-in ecommerce service is being deprecated. WordPress plugins and WooCommerce bridges introduce another moving part. Neither approach was built to trigger enrollment directly from checkout.

Two services, one domain ecosystem

Payload runs on your root domain - example.com - while the LMS operates on a subdomain like training.example.com. Caddy reverse proxy routes traffic to the right service. Both share the same cluster. An OAuth 2.0 application on the LMS handles single sign-on. When a visitor clicks "Log in" on your Payload site, they authenticate through the LMS and return with a session - no separate account required. Course data flows from Open edX into Payload through an automated sync. Stripe handles payments on the Payload side, and after a successful checkout, the enrollment API on the LMS fires automatically.

How payload is connected

Purchase → Enroll

Learner buys a course on your site. Open edX enrolls them automatically.

01

Browse catalog

Learner finds a course on your Payload-powered site. Prices, descriptions, and dates sync from Open edX.

02

Checkout

The e-commerce gateway handles the payment - credit card, Apple Pay, Google Pay. SCA/3-D Secure built in.

03

Webhook fires

The e-commerce gateway confirms the charge. Payload receives the webhook, creates an Order record, and calls the LMS.

04

Enrolled on the LMS

The Open edX enrollment API registers the learner. They see the course on their dashboard immediately.

Capabilities

Abstract Technology built every piece of this integration.

OAuth single sign-on from the LMS

Learners authenticate through Open edX. Payload creates or matches a local user on callback. No separate registration form - the LMS is the identity provider. Both authorization-code flow (for SSO) and client-credentials flow (for server-to-server enrollment calls) are pre-configured.

Automatic course catalog sync

A Payload cronjob fetches courses from the Open edX REST API at a configurable interval - every five minutes by default. Course ID, name, org, dates, pacing, images, and enrollment windows land in a dedicated Payload collection. You can also trigger a manual sync from the admin panel with one click.

E-commerce payments that trigger enrollment

Courses in Payload are bound to the Products collection through the official @payloadcms/plugin-ecommerce package. e-commerce handles the checkout. After a successful charge, a webhook creates a Transaction and Order record, then calls the LMS enrollment API so the learner appears in the course immediately.

Unified theming across LMS and website

One of the genuine challenges here is that Open edX uses its own comprehensive theme system (LMS themes plus MFE micro-frontends), while Payload uses Next.js and Tailwind. Abstract Technology builds custom theme bridges so your marketing site and your learning platform share the same visual identity - fonts, colors, component patterns - without forcing one system into the other's template engine.

Pages, blog posts, and rich content

Payload's website template ships with Pages and Posts collections out of the box - rich text, media embeds, hero blocks, call-to-action components. Your marketing team publishes landing pages and blog posts without touching code or waiting on a deploy. The site rebuilds on save through Next.js on-demand revalidation.

Kubernetes-ready, Docker-native

The plugin generates all the infrastructure files: a production Dockerfile, Caddy patches for routing, Docker Compose services for local development, and Kubernetes service and deployment manifests. MongoDB is initialized with a dedicated user and database through an automated init job. Everything runs through Tutor's existing orchestration - no separate deployment pipeline.

Alternatives

Abstract Technology chose Payload CMS for Open edX marketing sites. Here is why.

Payload + Open edXWordPress + PluginRichie CMS
Capability
SSO with the LMS✓ OAuth 2.0 built in~ Requires custom plugin~ Django session sharing
Automatic course sync✓ Cronjob + manual trigger~ REST polling via plugin✓ Django management command
Built-in e-commerce✓ E-commerce + auto-enrollment~ WooCommerce bridge✗ Not included
Self-hosted, open source✓ Open license✓ GPL✓ MIT
Tutor plugin deployment✓ pip install, one command✗ Separate server~ Tutor integration exists
Modern tech stackTypeScript, Next.js, ReactPHP, jQueryPython, Django CMS
Admin panel customization✓ Full white-label React UI~ Theme-dependent~ Django admin
Kubernetes-native deploy✓ k8s manifests generated✗ Manual setup~ Helm chart available
Blog Post image: German UDS in the ranking of the best digital universities in Europe

Proven in production

German University of Digital Science

A German university using Payload CMS for their public-facing website, course catalogs, and enrollment flows - tightly integrated with their Open edX learning platform. EU-hosted infrastructure, GDPR-compliant from the ground up.

Under the Hood

Payload collections purpose-built for course commerce

Payload and ecommerce

The integration introduces dedicated Payload collections that mirror your Open edX catalog and handle commerce state. Each collection is fully accessible through Payload's REST and GraphQL APIs.

Learn more

Courses

Synced from Open edX. Stores course ID, name, org, start/end dates, enrollment windows, pacing type, image URL, and a raw JSON snapshot of the full LMS response for any field you might need later. Indexed on course ID for fast lookups.

Transactions

Created when e-commerce gateway confirms a charge. Links the payment event to a user and a course. Carries the session ID, amount, currency, and timestamp - the audit trail your finance team will want.

Orders

The final record tying a transaction to an enrollment action. Created after the LMS enrollment API confirms the learner was added to the course. If enrollment fails, the order records the failure state for retry.

Ready to connect your marketing site to your LMS?

Book a 30-minute call with our team. We will walk through the architecture, answer your deployment questions, and scope a timeline for your institution.

FAQ'S

Common questions about the Payload CMS + Open edX integration

Absolutely. That is exactly what this integration was built for. Payload handles your public-facing website - landing pages, blog posts, course catalog, checkout - while Open edX runs the learning experience. They share a single sign-on, so learners move between the two without re-authenticating. Abstract Technology deploys both as part of the same Tutor-managed cluster.

A Payload background job queries the Open edX Course API at a configurable interval - every five minutes by default. It pulls course metadata (name, org, dates, pacing, images) and upserts them into Payload's Courses collection. Admins can also hit a "Sync Now" button in the Payload admin panel for an immediate refresh. The raw JSON response from the LMS is stored too, so any field not mapped today is still available for custom use.

It can. The legacy ecommerce service has been difficult to maintain and is being phased out by the community. This integration uses Payload's e-commerce plugin with e-commerce gateways's directly - separate from the old ecommerce service and separate from Abstract Technology's openedx-abstract-payments framework. Think of it as a parallel commerce path: learners buy on your Payload site, the gateway processes the charge, and a webhook tells the LMS to enroll them.

Two OAuth 2.0 applications are registered on the LMS. The first uses the authorization-code grant for user-facing SSO: a visitor clicks "Log in" on the Payload site, gets redirected to the LMS, authenticates, and returns to Payload with a valid session. The second uses the client-credentials grant for server-to-server calls - specifically the enrollment API call that happens after a Stripe payment succeeds. The Payload user account (with staff privileges on the LMS) must exist for enrollment calls to work.

Yes - and that is the default deployment model. Abstract Technology hosts on Frankfurt-based EU infrastructure. Payload, Open edX, MongoDB, and the reverse proxy all run in the same cluster under your control. No data leaves the EU. The entire stack is open source and can be audited.

Payload uses MongoDB. The Tutor plugin includes an initialization job that creates a dedicated database and a scoped user with dbOwner privileges for that database only. In production, Payload connects to the same MongoDB instance Tutor manages. For local development, the plugin patches Docker Compose to expose the MongoDB port so your local Payload can reach it.

Related but different. The Payload CMS page covers Payload as a general-purpose CMS that Abstract Technology implements for any project. This page focuses specifically on the deep integration between Payload and Open edX - the OAuth SSO bridge, the course syncing engine, the Stripe-to-enrollment pipeline, and the Tutor plugin that ties it all together.