{"id":389045,"date":"2026-10-23T09:37:52","date_gmt":"2026-10-23T09:37:52","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/caltru-ledger-profit-cost-of-goods-for-woocommerce\/"},"modified":"2026-10-23T10:02:26","modified_gmt":"2026-10-23T10:02:26","slug":"caltru-ledger","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/caltru-ledger\/","author":23588679,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.1.2","stable_tag":"1.1.2","tested":"7.1.3","requires":"6.8","requires_php":"7.4","requires_plugins":null,"header_name":"Caltru Ledger \u2013 Profit & Cost of Goods for WooCommerce","header_author":"Caltru","header_description":"Historically correct cost of goods, gross and net profit for WooCommerce. Built on the core COGS field; past orders never change when a cost is updated.","assets_banners_color":"f6f5f0","last_updated":"2026-10-23 10:02:26","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"","header_author_uri":"","rating":0,"author_block_rating":0,"active_installs":0,"downloads":73,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.1.2":{"tag":"1.1.2","author":"caltru","date":"2026-10-23 10:02:26","revision":3761359}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.gif":{"filename":"icon-128x128.gif","revision":3761352,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.gif":{"filename":"icon-256x256.gif","revision":3761352,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3761352,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3761352,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.1.2"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3761309,"resolution":"1","location":"assets","locale":"","width":1400,"height":1000},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3761309,"resolution":"2","location":"assets","locale":"","width":1400,"height":1000},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3761309,"resolution":"3","location":"assets","locale":"","width":1400,"height":1000},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3761309,"resolution":"4","location":"assets","locale":"","width":1400,"height":1000},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3761309,"resolution":"5","location":"assets","locale":"","width":1400,"height":1000},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3761309,"resolution":"6","location":"assets","locale":"","width":1400,"height":880},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3761309,"resolution":"7","location":"assets","locale":"","width":1400,"height":470},"screenshot-8.png":{"filename":"screenshot-8.png","revision":3761309,"resolution":"8","location":"assets","locale":"","width":1400,"height":1000}},"screenshots":{"1":"The dashboard: net profit, its margin and trend, against the period before.","2":"Where the money goes, step by step from sales to net profit, and what each delivery method costs you.","3":"The Products report: profit and margin per product, searchable, sortable and exportable.","4":"Cost data: every missing cost, the most expensive gap first, fillable in place.","5":"Cost and margin on WooCommerce's product list, with Quick Edit.","6":"Settings: what each delivery method costs you per parcel, and each payment method per transaction.","7":"Setup, from installation to a dashboard that means something.","8":"Costs as a spreadsheet: what an upload would change, before anything does."}},"plugin_section":[],"plugin_tags":[132181,6601,11938,6882,286],"plugin_category":[45],"plugin_contributors":[288033],"plugin_business_model":[],"class_list":["post-389045","plugin","type-plugin","status-publish","hentry","plugin_tags-cost-of-goods","plugin_tags-inventory","plugin_tags-margin","plugin_tags-profit","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-caltru","plugin_committers-caltru"],"banners":{"banner":"https:\/\/ps.w.org\/caltru-ledger\/assets\/banner-772x250.png?rev=3761352","banner_2x":"https:\/\/ps.w.org\/caltru-ledger\/assets\/banner-1544x500.png?rev=3761352","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/caltru-ledger\/assets\/icon-128x128.gif?rev=3761352","icon_2x":"https:\/\/ps.w.org\/caltru-ledger\/assets\/icon-256x256.gif?rev=3761352","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/caltru-ledger\/assets\/screenshot-1.png?rev=3761309","caption":"The dashboard: net profit, its margin and trend, against the period before."},{"src":"https:\/\/ps.w.org\/caltru-ledger\/assets\/screenshot-2.png?rev=3761309","caption":"Where the money goes, step by step from sales to net profit, and what each delivery method costs you."},{"src":"https:\/\/ps.w.org\/caltru-ledger\/assets\/screenshot-3.png?rev=3761309","caption":"The Products report: profit and margin per product, searchable, sortable and exportable."},{"src":"https:\/\/ps.w.org\/caltru-ledger\/assets\/screenshot-4.png?rev=3761309","caption":"Cost data: every missing cost, the most expensive gap first, fillable in place."},{"src":"https:\/\/ps.w.org\/caltru-ledger\/assets\/screenshot-5.png?rev=3761309","caption":"Cost and margin on WooCommerce's product list, with Quick Edit."},{"src":"https:\/\/ps.w.org\/caltru-ledger\/assets\/screenshot-6.png?rev=3761309","caption":"Settings: what each delivery method costs you per parcel, and each payment method per transaction."},{"src":"https:\/\/ps.w.org\/caltru-ledger\/assets\/screenshot-7.png?rev=3761309","caption":"Setup, from installation to a dashboard that means something."},{"src":"https:\/\/ps.w.org\/caltru-ledger\/assets\/screenshot-8.png?rev=3761309","caption":"Costs as a spreadsheet: what an upload would change, before anything does."}],"raw_content":"<!--section=description-->\n<p><strong>Calculation. True.<\/strong><\/p>\n\n<p>That is what the name stands for, and it is the whole promise. Every profit\nfigure here is a calculation you can follow back to the order it came from,\nand it stays true after the fact.<\/p>\n\n<p>WooCommerce tells you what you sold. Caltru Ledger tells you what you kept,\nafter the cost of the goods, the parcel and the payment fee, so you can decide\nwhat to push, what to reprice and what to stop selling on numbers that hold.<\/p>\n\n<h4>What it is worth to your shop<\/h4>\n\n<ul>\n<li><strong>Put money behind what earns.<\/strong> Profit and margin for every product and category show which ones pay for the shop and which only add to turnover.<\/li>\n<li><strong>Change prices knowing the margin.<\/strong> Cost, margin and the last 90 days of profit sit on the product list you already use, next to the price you are about to change.<\/li>\n<li><strong>Price free delivery.<\/strong> Net profit counts what the carrier and the gateway actually charged you, and shows separately what the orders you shipped for free cost you.<\/li>\n<li><strong>Close a month once.<\/strong> A sale's cost is recorded when it happens and a refund lands on its own date, so last month reads the same next year, whatever your supplier charges by then.<\/li>\n<li><strong>Never act on a guess by mistake.<\/strong> A product with no cost is reported as a gap, ranked by how much profit it overstates, not counted as pure profit.<\/li>\n<li><strong>Keep costs up to date in minutes.<\/strong> Bulk Edit by amount or percentage, or a spreadsheet you download, edit and upload, with every change shown before it is made.<\/li>\n<\/ul>\n\n<h4>Calculation: every figure can be checked<\/h4>\n\n<ul>\n<li>A profit dashboard: revenue, cost of goods, gross profit and margin, by day or by month, each figure compared with the period before.<\/li>\n<li>Where the money goes, step by step from sales to net profit: gross profit less what shipping and the payment gateway cost you, with a breakdown per delivery method.<\/li>\n<li>Per-product and per-category reports, searchable, sortable and exportable.<\/li>\n<li>Cost and margin, and the last 90 days of sales and profit, on your product list: three database queries for the whole page, however long it is.<\/li>\n<li>Quick Edit and Bulk Edit for costs, with six bulk modes: change to, increase by or decrease by, each as an amount or a percentage.<\/li>\n<li>Costs as a spreadsheet: download, edit, upload, and see exactly what the file would do before any of it happens.<\/li>\n<li>Variations, and multilingual shops where a product and its translations are one product.<\/li>\n<\/ul>\n\n<h4>True: what it records stays recorded<\/h4>\n\n<p>The cost of every order line is written down <strong>at the moment of the sale<\/strong>.\nChange a supplier price tomorrow and last month's profit does not move. That\nis the thing a spreadsheet cannot do for you, and it is what WooCommerce\nitself does not do: it works an order's cost out again from today's product\ncost whenever the order is recalculated.<\/p>\n\n<p>Refunds work the same way. The sale stays on its date, the refund lands on\nthe refund's date, so a closed month never changes underneath you.<\/p>\n\n<p>What an order cost to deliver is written once too, on the day it was sold.\nYour carrier can put its prices up tomorrow without moving last month.<\/p>\n\n<h4>True: it says when it does not know<\/h4>\n\n<p>A profit figure built on missing costs is worse than no figure, so this\nplugin never quietly invents one. Revenue with no cost behind it is reported\nas its own number and flagged on every product it affects. Costs filled in\nafter a sale are marked as estimates, and you can exclude them entirely.<\/p>\n\n<p>The Cost data screen lists the gaps in the order of how much profit each one\nis overstating, with a box to type the answer into.<\/p>\n\n<p>Delivery is treated the same way. WooCommerce does not record what the\ncarrier charged you, and most gateways never write their fee onto the order.\nSo you tell it once what each shipping method and payment method costs you.\nA method you have not priced is reported as <strong>not priced<\/strong>, never as free: a\nshop giving away delivery on a third of its orders would otherwise read\nevery one of them as costing nothing, and believe a margin it does not have.\nTyping 0 says something different, and is recorded as 0.<\/p>\n\n<h4>Built on WooCommerce's own cost field<\/h4>\n\n<p>Since 9.5 WooCommerce has a Cost of Goods Sold field of its own. This plugin\nwrites to that field rather than keeping a private copy, so your costs stay\nwith your products whatever you do next. It also hands WooCommerce back the\nhistorical figure, so the core order screens show what the order actually\ncost, not what the product costs today.<\/p>\n\n<h4>Coming from another plugin<\/h4>\n\n<p>Costs from WPFactory's Cost of Goods, SkyVerge's Cost of Goods and ATUM can be\nimported, including \u2014 where those plugins recorded it \u2014 what each past order\ncost at the time. That is better evidence than today's price, and it is\npreferred over it.<\/p>\n\n<h4>Nothing here is locked<\/h4>\n\n<p>Every feature described above is in this plugin, with no time limit, history\nlimit or licence key, and it stays that way: nothing published free here will\never move to a paid version.<\/p>\n\n<h4>Caltru Ledger Pro<\/h4>\n\n<p>A separate add-on for shops that want the work done for them. It adds new\nscreens, columns and reports; it unlocks nothing in this plugin.<\/p>\n\n<ul>\n<li><strong>Stock replenishment<\/strong> \u2014 what to reorder, how many, and what the order will cost.<\/li>\n<li><strong>Profit on the orders list<\/strong> \u2014 cost, profit and margin beside every order, with loss-making orders flagged <em>(coming soon)<\/em>.<\/li>\n<li><strong>Fixed costs and true net profit<\/strong> \u2014 rent, salaries, advertising and software, spread over the period, with your break-even point <em>(coming soon)<\/em>.<\/li>\n<li><strong>A weekly email report and alerts<\/strong> \u2014 the week's profit against the last, best and worst products, what to reorder, and an alert when margin drops <em>(coming soon)<\/em>.<\/li>\n<li><strong>Inventory value<\/strong> \u2014 what your stock is worth at cost, month by month <em>(coming soon)<\/em>.<\/li>\n<\/ul>\n\n<h4>Third-party code<\/h4>\n\n<p>Charts are drawn with Chart.js 4.5.1 (MIT licence, https:\/\/www.chartjs.org),\nbundled unmodified in assets\/vendor.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate WooCommerce 10.4 or later.<\/li>\n<li>Install Caltru Ledger from Plugins \u2192 Add New, or upload the zip, and activate it.<\/li>\n<li>Open Caltru Ledger \u2192 Dashboard. A short setup asks how you enter costs and which order statuses count as sales, offers to import costs another plugin already holds, and can record your past orders.<\/li>\n<li>Enter what each shipping method and payment method costs you under Caltru Ledger \u2192 Settings to see net profit as well as gross.<\/li>\n<\/ol>\n\n<p>Activating the plugin switches on WooCommerce's own Cost of Goods Sold feature (WooCommerce \u2192 Settings \u2192 Advanced \u2192 Features), because costs are stored there.<\/p>\n\n<!--section=faq-->\n<dl>\n<dt id=\"will%20changing%20a%20product%27s%20cost%20change%20my%20past%20profit%3F\"><h3>Will changing a product's cost change my past profit?<\/h3><\/dt>\n<dd><p>No. That is the one thing this plugin exists to prevent. The cost is recorded\nagainst the order line when the order is placed, and nothing later rewrites\nit.<\/p><\/dd>\n<dt id=\"i%20installed%20this%20today.%20what%20about%20my%20existing%20orders%3F\"><h3>I installed this today. What about my existing orders?<\/h3><\/dt>\n<dd><p>Tools \u2192 Record past orders will go through them. They are costed at the\nprices you have entered now, and marked as estimates so you can tell them\napart from figures recorded at the time of sale. Anything another cost plugin\nrecorded back then is used instead, and preferred.<\/p><\/dd>\n<dt id=\"why%20do%20my%20figures%20differ%20from%20woocommerce%20analytics%3F\"><h3>Why do my figures differ from WooCommerce Analytics?<\/h3><\/dt>\n<dd><p>Two reasons, both deliberate. Analytics counts an order on the date it was\npaid and leaves out orders that are not paid yet; this plugin can count those\non their creation date instead, which suits shops taking bank transfers. And\nrefunds here land on the refund's own date rather than the original order's.<\/p><\/dd>\n<dt id=\"why%20was%20woocommerce%27s%20cost%20of%20goods%20sold%20feature%20switched%20on%3F\"><h3>Why was WooCommerce's Cost of Goods Sold feature switched on?<\/h3><\/dt>\n<dd><p>This plugin stores costs in WooCommerce's own field rather than a copy of its\nown, and WooCommerce ignores that field while the feature is off. So activation\nturns it on, once. Costs you enter stay with your products if you ever remove\nthis plugin.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20high-performance%20order%20storage%3F\"><h3>Does it work with High-Performance Order Storage?<\/h3><\/dt>\n<dd><p>Yes. The whole test suite runs against both order storages.<\/p><\/dd>\n<dt id=\"how%20do%20i%20calculate%20net%20profit%20in%20woocommerce%3F\"><h3>How do I calculate net profit in WooCommerce?<\/h3><\/dt>\n<dd><p>WooCommerce reports sales, not profit. Net profit is what is left of revenue\nafter refunds, the cost of the goods, what the carrier charged you and what\nthe payment gateway took \u2014 plus whatever customers paid you for delivery.\nThis plugin records each of those per order, at the time of the sale, and\nadds them up per day: enter your product costs, and under Settings what each\ndelivery method and payment method costs you, and the dashboard shows net\nprofit beside gross.<\/p><\/dd>\n<dt id=\"how%20is%20this%20different%20from%20woocommerce%27s%20own%20cost%20of%20goods%3F\"><h3>How is this different from WooCommerce's own Cost of Goods?<\/h3><\/dt>\n<dd><p>It uses it. Since 9.5 WooCommerce can store a cost on each product, and this\nplugin keeps costs there and nowhere else, so you enter a cost once. What\nWooCommerce does not do is remember: it works an order's cost out again from\ntoday's product cost whenever the order is recalculated, and it has no\nprofit reports. This plugin records the cost at the moment of each sale,\nhands that historical figure back to WooCommerce, and builds the reports,\nnet profit and the gap-finding around it.<\/p><\/dd>\n<dt id=\"how%20do%20i%20enter%20shipping%20costs%3F\"><h3>How do I enter shipping costs?<\/h3><\/dt>\n<dd><p>Under Caltru Ledger \u2192 Settings \u2192 Shipping and payment costs, enter what the\ncarrier charges you per parcel for each delivery method (LP Express, Omniva,\nDPD, Venipak and others are recognised by name), and what each payment\nmethod takes. Leave a box empty for \"not known\" \u2014 those orders are reported\nas unpriced, never as free \u2014 and type 0 for a method that genuinely costs you\nnothing. New orders are priced as they are placed; Tools \u2192 Price past orders\napplies the same costs to orders placed before, marked as estimates.<\/p><\/dd>\n<dt id=\"do%20i%20lose%20my%20data%20if%20i%20remove%20the%20plugin%3F\"><h3>Do I lose my data if I remove the plugin?<\/h3><\/dt>\n<dd><p>Not unless you ask to. Product costs live in WooCommerce and are never\nremoved. The recorded history \u2014 what each past sale cost \u2014 is kept on\nuninstall too, unless you switch on Settings \u2192 Data \u2192 \"Delete all plugin data\non uninstall\" first. Deactivating the plugin removes nothing.<\/p><\/dd>\n<dt id=\"does%20it%20send%20anything%20anywhere%3F\"><h3>Does it send anything anywhere?<\/h3><\/dt>\n<dd><p>No. There is no telemetry, no licence check and no outbound request of any\nkind. There is a test asserting that.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.1.2<\/h4>\n\n<ul>\n<li>The setup reminder appears only on the Plugins screen and Caltru Ledger's own pages, and the \"needs WooCommerce\" message only on the Plugins screen.<\/li>\n<li>Chart.js updated to 4.5.1.<\/li>\n<li>Translations come from translate.wordpress.org: the plugin no longer loads its own or ships compiled translation files.<\/li>\n<\/ul>\n\n<h4>1.1.1<\/h4>\n\n<ul>\n<li>Fixed: on WooCommerce 11.2, Bulk Edit showed only Price and Sale \u2014 tax, weight, stock, shipping class and the cost modes are back.<\/li>\n<\/ul>\n\n<h4>1.1.0<\/h4>\n\n<ul>\n<li>New: delivery and payment providers (LP Express, Omniva, DPD, Venipak, InPost, Lietuvos pa\u0161tas, Neopay, Paysera, Montonio, Stripe, PayPal, Przelewy24) are named and grouped on Settings.<\/li>\n<li>New: a few quiet, dismissible mentions of Caltru Ledger Pro on this plugin's own screens; none once Pro is active.<\/li>\n<li>New: a one-time review request after two weeks of use.<\/li>\n<li>Settings and setup say plainly that costs live in WooCommerce's own Cost of Goods field.<\/li>\n<\/ul>\n\n<h4>1.0.1<\/h4>\n\n<ul>\n<li>Fix: \"Price past orders\" now shows in net profit straight away; the nightly check also catches any day missing a shipping cost or payment fee.<\/li>\n<li>Fix: with estimated costs left out of reports, the nightly check no longer rebuilds the same days every night.<\/li>\n<li>Fix: orders that recorded no delivery method and no gateway are no longer offered for pricing, and applied rules are not offered again.<\/li>\n<li>Fix: setup counts as finished once its last page is reached.<\/li>\n<li>Fix: a cost typed on the Cost data screen is saved once, not twice.<\/li>\n<li>Fix: the setup screen has a title.<\/li>\n<li>Requires WordPress 6.8; tested up to WooCommerce 11.2.<\/li>\n<\/ul>\n\n<h4>1.0.0<\/h4>\n\n<ul>\n<li>First release on WordPress.org.<\/li>\n<\/ul>\n\n<p>The full history is in CHANGELOG.md, inside the plugin.<\/p>","raw_excerpt":"Calculation. True. Know what each WooCommerce sale really earned, after goods, delivery and fees, and keep past profit true.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/389045","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=389045"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/caltru"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=389045"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=389045"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=389045"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=389045"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=389045"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=389045"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}