OpenCart still works as the default pick for a plain, single-workflow store: a free core, a mature marketplace, and native multi-store without a paid add-on. It stops working once the workflow gets complicated — the checkout-only core API, a credential-only admin key and an unresolved two-year-old advisory are the parts a feature table won’t show. This pass checked OpenCart 3.0.5.0 and 4.1.0.3 against docs.opencart.com, the opencart/opencart GitHub repository and the GitHub Advisory Database, targeting PHP 8.0+ on Ubuntu 24.04 LTS with Docker 28.1.1 where the 4.x line’s own tooling applies.
Who should shortlist OpenCart in 2026 (and who shouldn’t)
The hypothesis worth testing is narrow: OpenCart earns a shortlist spot when the store is simple and conventionally structured, not when it needs to do something unusual. Its free GPLv3 core (opens in a new tab) and a marketplace that has sold extensions for two decades make it cheap to start and easy to staff. That advantage erodes once the workflow gets complex — deep integrations, non-standard B2B logic, or extension quality at a scale the marketplace was never built to guarantee.
Two release lines complicate the pick further. 3.0.5.0 (opens in a new tab), published 2025-12-12, is the version most of the community still runs, with no official Docker tooling. 4.1.0.3, published 2025-03-24, ships the project’s own Docker setup, but its release notes ask adopters to hold off running it in a live shop until third-party extensions catch up.
Best fit: a developer or small merchant who wants a conventional cart — PHP, a relational database, an admin panel — without adopting a framework project, running one storefront or a handful of related ones. Weak fit: a team that needs a documented catalogue or inventory API, complex B2B approval chains, or confidence that a purchased extension survives the next core upgrade. The rest of this review works through why.
flowchart TD
A[Store requirements] --> B{Catalogue and workflow simple and conventional?}
B -- No --> C[Look elsewhere: complex B2B, deep integrations]
B -- Yes --> D{Need a documented catalogue/inventory API?}
D -- Yes, core only --> E[Core API won't cover it - budget a marketplace REST extension]
D -- No, checkout/account only --> F{Decided between 3.0.5.0 and 4.1.0.3?}
F -- Not yet --> G[Decide first - the forum warns 4.1.0.3 breaks extensions]
F -- Yes --> H[OpenCart is a rational shortlist candidate]
What actually drives OpenCart’s total cost of ownership
“Free and open source” describes the licence, not the invoice. OpenCart’s core is GPLv3 with no gated paid tier — everyone runs the same code — but the opencart.com Marketplace (opens in a new tab) sells commercial extensions and themes next to free ones, and most stores end up needing at least one paid extension to match a competitor’s built-in feature.
The marketplace’s size checks out against opencart.com’s own homepage, read on 28 July 2026: “13000+ modules and themes”. The same page claims OpenCart powers “over 471 669 eCommerce Entrepreneurs” — a vendor figure with no stated methodology or date, so read it as marketing rather than measurement.
OpenCart Cloud is harder to pin down, and the difficulty is the finding. The homepage promotes it as a fully hosted solution that “offers multiple plans, allowing businesses of all sizes to choose the perfect fit,” but publishes no plan and no price. The cloud/landing route redirects to the homepage, cloud/pricing returns a 404, and the section’s own Get Started control did not lead anywhere on 28 July 2026. Budget for OpenCart Cloud as a quote-based product, because that is effectively what a prospective customer can see.
What is confirmed: hosting a self-managed PHP 8.0+ install per the system requirements (opens in a new tab), developer time to work inside OpenCart’s own conventions rather than a framework a hire may already know, and marketplace spend for anything beyond the core — including full REST API coverage, which section 4 covers in detail.
The realistic TCO line is licence cost zero, plus hosting, plus marketplace extensions, plus a developer who knows OpenCart specifically rather than PHP in general. That last cost is the easiest to underestimate, and it’s where the next section picks up.
OpenCart’s MVC-L architecture, and what it costs a hiring plan
OpenCart isn’t built on Laravel, Symfony or any PSR-framework layer, and that’s a deliberate choice, not neglect. The project’s own wiki (opens in a new tab) describes an MVC-L architecture split into two independent applications — catalog, the storefront, and admin — each following Model-View-Controller and sharing a common system library. There’s no Composer autoloading and no dependency-injection container underneath either one.
The practical consequence is hiring, not aesthetics. A developer fluent in a modern PHP framework still has to learn OpenCart’s own controller/model/view wiring and its two-application split before they’re productive. Budget ramp-up time into any OpenCart hire, even an experienced PHP one — the transferable skills stop at the language.
OpenCart 4’s developer documentation (opens in a new tab) describes a genuine improvement here: OCMOD-style core-file patching is being phased out in favour of an event system, where extensions register listeners at defined trigger points — before a cart add, for example — instead of rewriting core files via search-and-replace. That’s a real upgrade-safety gain, but it’s specific to OpenCart 4, and some marketplace extensions still ship OCMOD or vQmod patches through workaround installers despite the recommendation against it.
The buyer-facing consequence: before paying for an extension, check whether its installer registers events or patches core files directly. That answer predicts whether the extension survives your next version upgrade.
flowchart LR
subgraph Install[One OpenCart install]
SYS[Shared system library]
subgraph Catalog[catalog app - storefront]
CC[Controller] --> CM[Model]
CC --> CV[View]
end
subgraph Admin[admin app]
AC[Controller] --> AM[Model]
AC --> AV[View]
end
SYS --- Catalog
SYS --- Admin
end
Does OpenCart have a REST API? What the core and admin key actually cover
Yes, but not the one most integrators assume. Core ships nine front-end controllers under catalog/controller/api (opens in a new tab) — affiliate, cart, customer, order, payment_address, payment_method, shipping_address, shipping_method, subscription. That’s a checkout- and account-oriented surface built for the storefront’s own scripts, not a general product-catalogue or inventory API.
The separate admin API-key system, under System > Users > API and backed by admin/controller/user (opens in a new tab), is credential management, and its own documentation (opens in a new tab) stops there: an API username, a generated key, IP-address whitelisting. No endpoint list, no data-coverage description, no OAuth, no versioning.
The gap matters for scoping. A project scoped as “OpenCart has a REST API” for product or inventory sync stalls the moment the admin API produces a credential with nothing documented to call it against. Full catalogue and inventory endpoint coverage typically comes from a separately purchased marketplace REST extension — a real TCO line item from section 2, not an assumption. It’s also the direct input to the AI/agent-readiness score in section 7: an agent has no documented core contract for retrieving or writing catalogue data.
Confirm this on a disposable test install before scoping any integration timeline:
# Generate an admin API key first: System > Users > API > Add New
# Then call one of the nine core front-end endpoints - not a catalogue one
curl -X POST "https://<YOUR_DOMAIN>/index.php?route=api/cart.add" \
-H "Content-Type: application/x-www-form-urlencoded" \
--cookie-jar cookies.txt \
--data "product_id=42&quantity=1"You should now see: confirmation that this endpoint manages a cart session, and no equivalent core endpoint for reading or writing product or inventory records — that gap is what a marketplace REST extension exists to fill.
flowchart TB
subgraph Included[Included in core, no extra cost]
A1[catalog/controller/api: cart, checkout, account, subscription]
A2[Admin API key: username + key + IP whitelist only]
end
subgraph Extra[Costs extra]
B1[Documented product/catalogue endpoints]
B2[Inventory read/write endpoints]
B3[OAuth, versioning, webhooks]
end
A2 -. no documented endpoints .-> B1
A1 -. checkout only, not catalogue .-> B2
Multi-store: OpenCart’s genuine free-core strength, and its real limits
Multi-store is the one place OpenCart’s free core genuinely out-features platforms that charge for the same capability elsewhere in this series. The official documentation (opens in a new tab) confirms it as a native admin-panel feature: each store can carry its own contact details, owner, address, email and phone number, configured from Settings without a plugin.
Community setup guides (opens in a new tab) describe running several storefronts from one installation, each with its own currency, language, tax class and pricing — useful for regional variants of one brand, or a handful of related brands run by one team.
The correction that matters before committing to this as an architecture: every store in an OpenCart multi-store setup shares one product and customer database. It is not a set of isolated data domains per brand. A “multi-store” checkmark on a comparison table hides that detail, and it only surfaces once someone tries to keep two brands’ customer lists apart and finds they can’t.
If the plan needs a shared catalogue with separate storefronts, OpenCart’s multi-store fits as documented. If it needs genuinely separate brand data, confirm that against a real proof-of-concept install before committing — don’t let the feature-table checkmark settle it.
The incomplete CVE fix that’s a production concern, not a footnote
A feature table won’t show this, but it’s the more consequential fact in this review. CVE-2026-3714 (opens in a new tab) (GHSA-6j4x-4j9g-2875) documents an incomplete fix of an earlier template-injection issue, CVE-2024-36694, in admin/controller/design/template.php’s Save function, affecting OpenCart 4.0.2.3. The advisory lists the patched version as “Unknown” and states the vendor did not respond to the disclosure.
It isn’t isolated. CVE-2025-1746 (opens in a new tab), a cross-site scripting flaw in the storefront’s /product/search endpoint, was open in all OpenCart versions before 4.1.0, per third-party vulnerability-database records. Two disclosures, two years apart, one of them reopening an issue the project had already claimed to fix.
For a small-core-team open-source project, that pattern is a patch-stewardship risk, not a one-off bug. A 2024 fix that quietly regresses by 2026, with no vendor response on record, means a “patched” claim from this project needs re-checking rather than trusting the version number alone.
Mitigate what’s controllable: restrict admin template-editing access to trusted staff only, treat GHSA-6j4x-4j9g-2875 as unresolved rather than assuming the 2024 patch closed it, and track opencart/opencart (opens in a new tab)’s advisory feed directly rather than relying on a point-in-time scan.
sequenceDiagram
participant Researcher
participant Project as opencart/opencart
participant File as admin/controller/design/template.php
Researcher->>Project: Reports CVE-2024-36694 (template injection)
Project->>File: Patches the Save function
Note over File: Fix later found incomplete
Researcher->>Project: Reports CVE-2026-3714 / GHSA-6j4x-4j9g-2875
Project--x Researcher: No vendor response recorded
Note over Project: Patched version listed as "Unknown"
Score OpenCart’s modernity and AI/agent readiness, with the working shown
Modernity, scored component by component against this pass’s evidence rather than a gut feel:
| Component | Weight | Score /10 | Why |
|---|---|---|---|
| Runtime/dependency posture | 20% | 6 | PHP 8.0 minimum (opens in a new tab) is current, but two live major lines (3.0.5.0, 4.1.0.3) split the install base |
| API-first boundaries | 20% | 3 | Checkout-only core API, credential-only admin key — no documented catalogue/inventory contract |
| Extension model | 15% | 6 | The 4.x event system is a real gain, docked for lingering OCMOD/vQmod use |
| CI/tooling | 15% | 4 | Real static analysis, no functional tests — see below |
| Cloud/container friendliness | 15% | 4 | Docker tooling ships only on the 4.x line, and the forum cautions against running 4.x live |
| Storefront/admin developer experience | 10% | 6 | Conventional MVC-L, well documented for what it covers, but no framework-standard tooling |
| Release and documentation clarity | 5% | 6 | Docs are current and specific; the two-line version split is the main source of confusion |
Weighted total: (6×0.20) + (3×0.20) + (6×0.15) + (4×0.15) + (4×0.15) + (6×0.10) + (6×0.05) = 4.80, rounding to 4.8/10.
The CI row is worth showing the working on, because “has CI” and “has tests” are different claims and the repository settles both. OpenCart’s master branch carries exactly one GitHub Actions workflow, Lint.yml. It runs php -l syntax checks across PHP 8.0 through 8.4, PHP-CS-Fixer for style on 8.4, and PHPStan for static analysis, on every push to master and every pull request.
What it does not run is tests. There is no tests/ directory in the repository — the path returns a 404 — and composer.json declares no require-dev section at all, so PHPUnit is not a dependency of the project. Checked against the repository on 28 July 2026.
That combination earns a 4 rather than a 2: static analysis across five PHP versions on every pull request is genuine engineering discipline, and plenty of projects with a token test suite have weaker gates. But a merchant evaluating upgrade risk should know that nothing in this pipeline asserts the checkout still works — only that the code parses, conforms to a style, and type-checks.
AI/agent readiness, scored the same way:
| Component | Weight | Score /10 | Why |
|---|---|---|---|
| Catalogue/order/customer API completeness | 30% | 2 | No documented product/inventory endpoints in core; checkout-only |
| Safe authenticated writes with granular permissions | 20% | 3 | Admin key is credential-only — no scoped permissions, no endpoint contract to write against |
| Structured schemas/SDKs | 15% | 3 | No official SDK or schema published alongside the API docs |
| Webhooks/events | 15% | 4 | The 4.x event system exists internally for extensions, not exposed as external webhooks |
| Retrieval-suitable product data | 10% | 4 | Product data lives in a conventional database schema, reachable only through custom queries or a paid extension |
| Auditability/idempotency | 5% | 3 | No documented request idempotency or audit trail on the API surface |
| Official AI/MCP tooling | 5% | 1 | No official MCP server, agent SDK or first-party AI-agent reference implementation found in the opencart GitHub organisation or on opencart.com this pass |
Weighted total: (2×0.30) + (3×0.20) + (3×0.15) + (4×0.15) + (4×0.10) + (3×0.05) + (1×0.05) = 2.85, rounding to 2.9/10.
The absence of official AI/MCP tooling is evidence from a dated check, not a permanent claim — search again before repeating it. Consistent with this series’ own caution elsewhere: a mature, deliberately un-frameworked PHP platform can still score reasonably on modernity when its release activity and extension model are sound, independent of how old the stack itself is. OpenCart’s modernity score holds up better than its AI/agent-readiness score, and the gap between the two is the checkout-only API from section 4.
Run the five-question proof-of-concept before you commit to OpenCart
Run these five questions against your own project before signing off on OpenCart, not after:
- Complexity fit. Is your catalogue and workflow genuinely simple and conventional, or does it need the complex B2B or inventory logic that sits outside OpenCart’s tested strength?
- Version decision. Have you chosen between 3.0.5.0 and 4.1.0.3 with the release notes’ (opens in a new tab) own production caution in mind, rather than defaulting to the higher version number?
- API cost. Have you priced the specific marketplace REST API extension your integration needs directly on opencart.com (opens in a new tab), rather than assuming the built-in admin API covers product or inventory sync?
- Extension safety. Have you checked each planned extension’s installer — event system versus OCMOD/vQmod — against your target version before buying it?
- Security ownership. Who owns tracking opencart/opencart (opens in a new tab)’s security advisories, given GHSA-6j4x-4j9g-2875’s unresolved status and the vendor’s non-response to disclosure?
You should now see: a completed checklist with a documented answer against your own project for each of the five questions, ready to bring into a platform-selection decision.
Limitations
This review doesn’t include a hands-on OpenCart installation walkthrough or a live marketplace REST API integration test — the API section above describes a procedure to run, not a completed run, and its output is marked as pending. The marketplace count and the Cloud pricing question were settled by reading opencart.com in a browser, since that site blocks automated fetch; independent adoption figures were not, because w3techs (opens in a new tab) and BuiltWith (opens in a new tab) both refused the same way. The only install-base number here is OpenCart’s own. Treat every unlinked or explicitly hedged figure in this article as unconfirmed until checked live, including via cvedetails.com (opens in a new tab) for OpenCart’s fuller CVE history.