The number of OCMOD or vQmod modifications that are currently colliding with each other or with OpenCart core, each one a silent risk of a broken storefront feature.
At a glance
OpenCart applies extensions as XML-based modifications (OCMOD, or vQmod on older builds) that patch core files in place rather than replacing them. When two modifications try to edit the same line, or a modification targets code that a core update has moved or renamed, the patch fails or applies in the wrong place. This card counts those conflicts. Each conflict can quietly disable checkout, search, a payment method, or the admin without throwing a visible error, so the trigger is >0.
| What it counts | The number of OCMOD / vQmod modification rules that fail to apply cleanly, or that overlap with another modification on the same target file and search block. Derived from the modification cache rebuild against the oc_modification table. |
| What a “conflict” is | Two modifications editing the same search string, an operation that finds no match after a core or theme update, or a patch that applies in an order that breaks a later one. |
| OCMOD vs vQmod | OpenCart 3.x and 4.x use OCMOD natively (rules stored in oc_modification). Older 2.x stores often still run the vQmod engine. Both produce the same class of conflict; this card normalises across them. |
| Severity | Not all conflicts are equal. A conflict on a checkout or payment template is critical; a conflict on a rarely-touched admin report is cosmetic. The card counts all; the detail view ranks by the storefront area touched. |
| Refresh dependency | Conflicts only surface after the modifications are refreshed (Extensions → Modifications → Refresh). A store that has not refreshed since installing an extension can carry a latent conflict that this card flags before the merchant hits it live. |
| Multi-store | OpenCart multi-store instances share one codebase and one modification cache, so a conflict affects every store_id at once. |
| Time window | RT (real time, evaluated each sync) |
| Alert trigger | >0, driven by sentiment on platform health |
| Roles | owner, operations |
Calculation
Worked example
A UK auto-parts merchant runs OpenCart 3.0 with around 22 installed extensions: a one-page checkout, a Stripe payment module, a layered navigation filter, a SEO pack, and a currency switcher among them. On 12 May 26 they applied an OpenCart point release to patch a security advisory. Two days later, on 14 May 26, support tickets start mentioning that the discount code box has vanished at checkout.| Modification | Target file | Status after core update | Effect |
|---|---|---|---|
| One-page checkout | catalog/.../checkout.twig | Applied, but now overlaps SEO pack | Coupon field markup shifted |
| SEO pack | catalog/.../checkout.twig | Applied second, overwrites checkout edit | Coupon div removed |
| Stripe payment | catalog/.../payment.twig | Failed - search string moved by core update | Stripe button intermittently missing |
| Layered navigation | catalog/.../category.twig | Applied cleanly | None |
| Currency switcher | catalog/.../header.twig | Applied cleanly | None |
| Conflicts (this card) | 2 |
- The store looked fine in the admin. OpenCart did not throw a fatal error. The modification cache rebuilt “successfully” because OCMOD skips a rule whose search string is not found rather than failing the whole rebuild. The card flagged
2the moment the post-update refresh ran, two days before the merchant connected the dots from the support tickets. - The checkout conflict is the expensive one. The one-page checkout and the SEO pack both edit
checkout.twig. Whichever applies last wins, and the coupon field lost. Customers with a valid code abandoned rather than paying full price. This is direct, ongoing revenue loss, which is why the card is a Hero and pairs with Order Volume. - The Stripe conflict is intermittent, which is worse for diagnosis. A failed patch on the payment template means the Stripe button renders only when a cached version of the page is served. Intermittent faults are the hardest for merchants to reproduce; a card that says “2 conflicts, one on payment.twig” turns a week of guesswork into a five-minute fix.
- The fix is an ordering and re-target job, not a re-install. Reorder the OCMOD load priority so checkout edits apply after the SEO pack, and update the Stripe module’s search string to match the new core markup, then refresh. The card should drop back to
0on the next sync. - This is the single most OpenCart-specific failure mode. Hosted platforms isolate apps; OpenCart patches shared files. Almost every OpenCart store accumulates conflicts over its life, and they cluster right after core updates, theme changes, and bulk extension installs.
Sibling cards merchants should reference together
| Card | Why pair it with Extension / Modification Conflicts |
|---|---|
| Installed Extensions / Modules | The denominator. Conflicts as a share of installed extensions tells you whether your stack is fragile or just large. |
| Platform Error Spike or Extension Conflict | A spike here is usually a symptom of a new conflict. Watch the two together after any update. |
| Error Log Volume (24h) | A failed modification frequently throws PHP notices or warnings into the log. A conflict and a log spike landing together confirms causation. |
| OpenCart Version Status | Conflicts cluster right after a version change. If this card moved, check whether a core update just landed. |
| Failed Orders (24h) | A conflict on a payment or checkout template shows up downstream as failed orders. The link is causal. |
| Order Volume | The bottom-line check. A silent checkout conflict suppresses order volume before anyone files a ticket. |
Reconciling against OpenCart
Where to look in OpenCart admin: Extensions → Modifications. This screen lists every installed modification and has a Refresh button (the blue refresh icon, top right) that rebuilds the modification cache. After a refresh, OpenCart writes a modification log; the Log sub-area shows which rules could not be applied. The rules themselves live in theoc_modification table, and the compiled output sits in the system/storage/modification/ directory.
For vQmod stores (typically OpenCart 2.x), the equivalent is the vqmod/xml/ directory and the vqmod/logs/ folder, plus the vQmod admin checker if installed.
Other OpenCart views that look related but are not the same number:
- Extensions → Extensions: lists installed and available extensions by type, not conflicts. That is the Installed Extensions / Modules card.
- Error log (System → Maintenance → Error Logs): shows PHP errors, some of which are caused by conflicts, but also many that are not.
- The storefront itself: a missing feature is the effect of a conflict, not a count of conflicts.
| Reason | Direction of divergence |
|---|---|
| Refresh lag. OpenCart only recomputes conflicts when Modifications is refreshed. If the merchant has not refreshed since the last extension change, the admin shows a stale state while Vortex IQ flags the latent conflict. | Vortex IQ higher until the merchant refreshes |
| Severity weighting. The admin log lists every skipped rule flatly. This card de-duplicates rules that belong to the same disabled extension and ranks by storefront impact, so the raw admin log line count can be higher. | Admin log line count higher |
| vQmod vs OCMOD. On mixed stores running both engines, the admin splits the view across two screens. This card sums both. | Vortex IQ higher than either single screen |
| Disabled extensions. A disabled extension’s modification is not applied, so it cannot conflict. If the admin still lists its rule, it is not counted here. | Vortex IQ lower |
| Sync lag. A conflict introduced seconds ago is picked up on the next sync, not instantly. | Self-resolves at next sync |