The UTM tracker shows where the order came from. This module shows how much an order cost: it combines advertising costs with sales and calculates the CRR, ROI, and order value for each channel and each campaign.
Demo Store
Showcase —
opencart3.nikifalex.ru
Admin —
opencart3.nikifalex.ru/admin/, login and password: demo / demo (login fields are already filled in).
The demo store has the paid version—you can see what removing the restrictions allows.
What's included in the free version
The module collects all the data: removes tags, identifies the source of each order, and calculates revenue and profit. It displays a summary for the period and a breakdown by channel—how much was spent, how much was returned, and what the CRR and CPO are for Yandex.Direct, Avito, VK, and others. Expenses are entered manually and using regular rules.
Free version limitations:
- Campaign breakdown — only in the paid version (data is collected, but the table won't open);
- Uploading cost data as a file from your advertising account — only in the paid version;
- Downloading reports to CSV and tracking multiple stores — only in the paid version.
The paid version is installed over the free version by simply downloading an archive: files are overwritten, but settings and accumulated statistics remain. There's no need to transfer or reconfigure anything.
Paid version: DRR, ROI, and advertising return
Why is it needed
The store owner pays for Yandex.Direct, Avito, blogger seeding, and SEO, but calculates which of these items actually pays for themselves—at best, quarterly in Excel. End-to-end analytics services charge from 5,000 rubles per month and require webhooks and integrations.
The module answers three questions on a single screen:
- How much money was spent on advertising and how much was returned in revenue and profit—overall and for each campaign.
- Which campaigns are running in the red: the CRR is above the threshold—the line is highlighted and visible immediately.
- How much is the cost per order from each channel (CPO) and which channel makes sense to scale.
What it calculates
CPC, CPO, CR, CRR, ROAS, ROMI, and average order value—for the period, by channel, and by campaign, sortable by any column and exported to CSV. Orders and purchases are calculated separately and shown side by side: the difference between "ordered" and "collected" is the shortfall, which eats into your advertising budget without you even noticing.
Profit can be calculated in three ways: margin percentage (applies immediately), cost price from the product page (more precisely), or a fixed amount per order. Shipping is deducted from revenue, making the CRR look better than it actually is.
Expenses without API and tokens
The module does not connect to advertising accounts: no OAuth is required, no API access requests are required, and the store does not store a token that can be used to manage other people's money. Expense is entered into the module in three ways:
- Manual— day, channel, amount. If you specify a period, the amount will be broken down by days: this is how the blogger is paid for integration.
- Rule— "SEO contractor 30,000 ₽/month" is created once and then broken down by days automatically. Without these rules, the report shows advertising ROI, but not marketing ROI.
- File from the advertising account— CSV, TSV, XLSX with automatic column recognition. This is a paid version feature.
How does the module know the order source
Tags are collected on the website itself: UTM tags, click identifiers (yclid, gclid), and the referral source. The order is linked to the campaign by the campaign number or name from the tag. The attribution model is the last indirect click (as in Metrica), first orLast click; the attribution window is configurable, 90 days by default.
Clicks without tags are not discarded: search, social media, direct visits, and clicks from websites are considered separate channels and are reported alongside ads, showing the overall share of sales generated by paid traffic.
If the Yandex Metrica Offline Conversions module (nkf_metrika) is installed on the store, attribution is taken from it—the two modules don't compete for the same visitor.
The report doesn't lie
- The "Not recognized" line is always shown. These are orders whose tags the module couldn't parse—a measure of the quality of the tagging, not junk. Hiding it means drawing a pretty CRR on half the data.
- A campaign with expenses and without a single order remains in the report. This is the reason the report is opened.
- If expenses haven't been entered for a channel with orders in a while, the report warns: the CRR for it is understated. Next to the totals, the percentage of days in the period covered by expenses is indicated.
- Tag Check: The module analyzes the last 200 orders and tells you how many arrived with working tags and what exactly needs to be corrected in the links — with a ready-made parameter template for Yandex.Direct.
More in the module
- Expense vs. Revenue Chart by Day.
- Filters: Period and Channel.
- Editable "Source → Channel" rules: any new traffic source is distributed among its channels without updating. Module.
- Changing calculation settings recalculates the history fairly—in batches, by Cron, or by pressing a button, with a warning in the report until the recalculation is complete.
Restrictions
- The module doesn't pull expenses from accounts automatically—you need to upload a file or create expenses using rules. This is a deliberate trade-off: no tokens, API moderation, or integration fixes are required after each dashboard update.
- Attribution starts from the moment of installation: orders placed before installation are marked as "Not Recognized"—there's no way to retroactively restore the source.
- Campaign breakdown, cost file upload, CSV export, and multi-store are available in the paid version.
Technical details
- Module version:1.0
- Compatibility: OpenCart 3.0.x, ocStore 3.0.x. PHP 7.0+, tested with PHP 8.3.
- Standard installation: downloading the ocmod archive, updating modifiers, activating the module.
- Works on OpenCart events; the core is not patched. The modifier only adds a menu item in "Reports."
- Used tables in the database; other trackers and counters are not affected. Accumulated data is preserved when the module is uninstalled.
- Cron is not required: the storefront is recalculated with a button. For automation, use an HTTP address with a secret or launch from the command line.
What's new in version 1.0
- First release: "Summary" and "Channels" reports, manual and regular cost rules, attribution by tags and clicks, markup verification, CRON.