Customer
PetroSkills, part of RelyOn, is a leading provider of training for the petroleum industry, serving energy companies and professionals worldwide with instructor-led courses (in classrooms and virtual sessions around the globe, from Houston to London to Dubai to Kuala Lumpur), self-paced e-learning, and technical publications.
Challenge
Off-the-shelf e-commerce assumes you are selling SKUs: fixed products with prices and stock counts. PetroSkills sells something harder. A self-paced e-learning module behaves roughly like a product, but a scheduled course is an event: it has a start date and an end date, a physical or virtual location, assigned instructors, session-based pricing, and an inventory measured in seats at a specific time and place.
The complexity compounds at checkout. The buyer is frequently not the student: a training coordinator may purchase seats for several engineers at once, which means checkout is not just a payment flow, it is attendee registration. And the source of truth for session inventory (what runs where, when, with how many seats) lives in a custom ERP that PetroSkills built and operates in-house, so the storefront had to integrate deeply with the client's own system rather than owning the data itself.
Solution
Lightning Jar originally built the PetroSkills platform on Pimcore, the open-source digital experience platform, which provides the product information management and content backbone for the course catalog, e-learning modules, and book sales. This year we ported the platform to OpenDXP, the GPLv3 community fork of Pimcore, a decision we wrote about on our blog: Pimcore or OpenDXP: A Fork in the Road. The storefront frontend is built in Vue, with Pinia state management and a component library covering course discovery, faceted filtering, session selection, and checkout.
Because no packaged checkout could model their products, we built the checkout workflows from scratch, tailored to how training is actually bought: one flow for on-demand e-learning and a distinct flow for scheduled courses, sharing components and state where the flows genuinely overlap and diverging where they don't.
Featured Project
The platform maintains two distinct checkout workflows because the two product types are genuinely different transactions.
• E-learning checkout treats the purchase like a product: pick a module, add one or more students, pay, and enrollment follows on demand.
• Scheduled-course checkout treats the purchase like an event registration: the buyer selects a specific session (with its dates, location, format, and instructors), and the checkout captures the attendees themselves. Buying the seat and registering the engineer who will sit in it are the same act.
Both flows run in the same Vue application on the native HTML Popover API rather than heavyweight modal frameworks, which improved both performance and accessibility.
ERP Integration
Session inventory (time, date, location, capacity) is managed by TMS, a custom ERP built by PetroSkills. Rather than replicate that data, the storefront integrates with it: session availability flows from the ERP to the catalog, and completed checkouts flow back as registrations and payment transactions.
Running commerce against a client-operated system also meant hardening the boundary. After a real-world carding-bot incident, Lightning Jar built a layered defense stack in front of the payment endpoint: rate limiting by IP, fingerprint, and card, duplicate-submission detection, header verification, and heuristic bot blocks, all with privacy-safe logging (card data is truncated before it ever reaches a log line, a rule locked in by automated tests).
Platform Stewardship
An e-commerce platform is never done, and Lightning Jar has evolved this one continuously rather than letting it calcify toward an expensive rewrite:
• Migrated the platform from Pimcore 10 to Pimcore 11 and then to OpenDXP, with a clean production cutover in May 2026.
• Completed a full migration from Bootstrap to UnoCSS across every template.
• Moved JavaScript, CSS, and static assets to a multi-environment CDN with per-environment cache policies.
• End-to-end test coverage with Playwright guards the checkout flows.
Results
• A storefront that models training accurately: seats, sessions, and students, not just SKUs.
• Checkout that doubles as attendee registration, eliminating a separate enrollment step for scheduled courses.
• The client's own ERP remains the operational source of truth, with the web platform integrated around it.
• A hardened, tested payment boundary that shut down real-world bot abuse without harming legitimate buyers.