{"id":362556,"date":"2026-09-08T03:08:18","date_gmt":"2026-09-08T03:08:18","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/codebold-commerce\/"},"modified":"2026-09-08T09:12:27","modified_gmt":"2026-09-08T09:12:27","slug":"codebold-pos-for-woocommerce","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/codebold-pos-for-woocommerce\/","author":23544796,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"0.9.15","stable_tag":"0.9.15","tested":"7.1","requires":"6.5","requires_php":"8.1","requires_plugins":null,"header_name":"CodeBold Commerce - POS and Inventory for WooCommerce","header_author":"CodeBold IT Solutions","header_description":"Point of sale and inventory for WooCommerce. An offline-capable till, stock across outlets, purchase orders, and table service for restaurants.","assets_banners_color":"0b0f14","last_updated":"2026-09-08 09:12:27","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/codeboldcommerce.com","header_author_uri":"https:\/\/codeboldtech.com\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":55,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"0.9.14":{"tag":"0.9.14","author":"codeboldtech","date":"2026-09-08 03:08:05","revision":3685817},"0.9.15":{"tag":"0.9.15","author":"codeboldtech","date":"2026-09-08 09:12:27","revision":3686266}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-256x256.png":{"filename":"icon-256x256.png","revision":3685816,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3685816,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3685816,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["0.9.14","0.9.15"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3685816,"resolution":"1","location":"assets","locale":"","width":2560,"height":1800},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3685816,"resolution":"2","location":"assets","locale":"","width":2560,"height":1800},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3685816,"resolution":"3","location":"assets","locale":"","width":2560,"height":1800},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3685816,"resolution":"4","location":"assets","locale":"","width":2560,"height":1800},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3685816,"resolution":"5","location":"assets","locale":"","width":2560,"height":1800}},"screenshots":{"1":"The till, ringing up a sale","2":"Stock Central \u2014 everything you have, on one screen","3":"A purchase order as a size-by-colour grid","4":"Closing a shift and counting the cash","5":"The receipt preview"}},"plugin_section":[],"plugin_tags":[6601,26270,10229,20710,286],"plugin_category":[39,45],"plugin_contributors":[278356],"plugin_business_model":[],"class_list":["post-362556","plugin","type-plugin","status-publish","hentry","plugin_tags-inventory","plugin_tags-point-of-sale","plugin_tags-pos","plugin_tags-restaurant","plugin_tags-woocommerce","plugin_category-business","plugin_category-ecommerce","plugin_contributors-codeboldtech","plugin_committers-codeboldtech"],"banners":{"banner":"https:\/\/ps.w.org\/codebold-pos-for-woocommerce\/assets\/banner-772x250.png?rev=3685816","banner_2x":"https:\/\/ps.w.org\/codebold-pos-for-woocommerce\/assets\/banner-1544x500.png?rev=3685816","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/codebold-pos-for-woocommerce\/assets\/icon-256x256.png?rev=3685816","icon_2x":"https:\/\/ps.w.org\/codebold-pos-for-woocommerce\/assets\/icon-256x256.png?rev=3685816","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/codebold-pos-for-woocommerce\/assets\/screenshot-1.png?rev=3685816","caption":"The till, ringing up a sale"},{"src":"https:\/\/ps.w.org\/codebold-pos-for-woocommerce\/assets\/screenshot-2.png?rev=3685816","caption":"Stock Central \u2014 everything you have, on one screen"},{"src":"https:\/\/ps.w.org\/codebold-pos-for-woocommerce\/assets\/screenshot-3.png?rev=3685816","caption":"A purchase order as a size-by-colour grid"},{"src":"https:\/\/ps.w.org\/codebold-pos-for-woocommerce\/assets\/screenshot-4.png?rev=3685816","caption":"Closing a shift and counting the cash"},{"src":"https:\/\/ps.w.org\/codebold-pos-for-woocommerce\/assets\/screenshot-5.png?rev=3685816","caption":"The receipt preview"}],"raw_content":"<!--section=description-->\n<p>A shop that sells in person and online usually ends up running two systems and reconciling\nthem by hand. This puts the counter inside WooCommerce instead: a sale rung up at the till\nis a WooCommerce order, and it takes stock from the same number the website is selling\nagainst.<\/p>\n\n<h4>The till<\/h4>\n\n<ul>\n<li>Ring up sales on a tablet, laptop or phone<\/li>\n<li>Works offline. Sales made while the connection is down are queued and sent when it\nreturns, so a broken router does not close the shop<\/li>\n<li>Shifts: open a till with a float, count the cash at the end, and see the difference<\/li>\n<li>Cash in, cash out and safe drops, recorded rather than remembered<\/li>\n<li>Discounts, price overrides, voids and refunds \u2014 each behind its own permission<\/li>\n<li>Receipts, with a preview so the layout can be checked before a customer sees one<\/li>\n<\/ul>\n\n<h4>Inventory<\/h4>\n\n<ul>\n<li>One stock figure for the shop and the website. There is no second number to reconcile<\/li>\n<li>Stock Central: everything you have, what is on order, and what it cost, on one screen<\/li>\n<li>Multiple outlets and warehouses, with transfers between them (Pro)<\/li>\n<li>Purchase orders, including a size-by-colour grid for ordering garments<\/li>\n<li>Suppliers, receiving, and stock takes<\/li>\n<li>Weighted-average costing, so margin is a real number rather than the last price paid.\nThe cost is kept for every shop; the valuation reports that read it are Pro<\/li>\n<li>A ledger behind every movement: every change to stock says who, when and why<\/li>\n<\/ul>\n\n<h4>Restaurant (Pro)<\/h4>\n\n<p>Everything in this section is part of CodeBold Commerce Pro, not this plugin.<\/p>\n\n<ul>\n<li>Table service with open tabs<\/li>\n<li>Order types \u2014 eat in, takeaway, delivery<\/li>\n<li>Modifiers: \"no onions\", \"extra bacon\", priced and printed on the ticket<\/li>\n<li>Kitchen tickets on a screen, in the order they were sent. Each round is its own\nticket, so the kitchen sees what is new rather than a reprint of the whole bill<\/li>\n<li>Tickets colour themselves as they age, so the one in trouble is obvious from the door<\/li>\n<li>A line pulled after it was sent shows as cancelled rather than quietly disappearing \u2014\nsomebody has already started cooking it<\/li>\n<li>Recipes: a burger sells, and a bun, a patty and a slice of cheese leave stock. There is\nno shelf of burgers, which is why an ordinary shop plugin watches a restaurant's stock\nnever move<\/li>\n<li>Recipes nest \u2014 a sauce is made of things, and dishes use the sauce. What leaves the\nshelf is what the sauce is made of<\/li>\n<li>A dish costs what its ingredients cost today, so a price rise reaches every dish using\nit without editing a single recipe<\/li>\n<li>Refunding a meal puts its ingredients back<\/li>\n<\/ul>\n\n<h4>Orders stay WooCommerce orders<\/h4>\n\n<p>Sales are written through WooCommerce's own order system, not a private table. So they\nappear in WooCommerce \u2192 Orders alongside online sales, they count in WooCommerce's reports,\nand every plugin that reads orders keeps working. Till sales are labelled \"Point of Sale\"\nso they can be told apart.<\/p>\n\n<h4>What is free, and what is not<\/h4>\n\n<p>This plugin is free, and free means finished rather than sampled. There is no trial, no\ncountdown, and nothing switched off waiting for a card number. A single shop with a counter\ncan run all of it, for ever, without paying anything:<\/p>\n\n<ul>\n<li>The till \u2014 selling, cash and card, split payments, discounts, parked sales, voids,\nrefunds and receipts<\/li>\n<li><strong>Working offline<\/strong>, which is the feature most likely to be held back elsewhere and is\nnot held back here. A shop with a bad connection is exactly the shop that needs it<\/li>\n<li>One location, one register, and stock tracked for thirty products<\/li>\n<li>Shifts, the cash drawer, and X and Z reports<\/li>\n<li>Sales reports: by day, by product, by hour, and by staff member<\/li>\n<li>Stock Central and the movement ledger behind it<\/li>\n<li>Customers: search by name, email or phone, and create one mid-sale<\/li>\n<li>Batch and expiry dates<\/li>\n<li>Suppliers, purchase orders, receiving and stock takes<\/li>\n<li>Importing your stock from a CSV, because charging to let somebody bring their own data\nin is charging at the exact moment they are deciding whether to trust you<\/li>\n<li>Barcode labels, up to 50 in one print run<\/li>\n<li>Roles and permissions<\/li>\n<\/ul>\n\n<p><strong>CodeBold Commerce Pro<\/strong> is a separate plugin, for shops that have outgrown that: more\nlocations and registers, transfers between them, stock valuation, restaurant service,\nunlimited label printing, and sales reporting split by outlet.<\/p>\n\n<p>It is a separate plugin rather than a licence key on this one, deliberately. A key that\nunlocks dormant code means the paid work is sitting inside everybody's copy of the free\nplugin \u2014 which WordPress.org does not allow, and which would make the word \"free\" above\nconsiderably less true.<\/p>\n\n<p>Switching from one to the other loses nothing either way. Everything this plugin records\nstays where it is.<\/p>\n\n<h4>Works with the rest of the range<\/h4>\n\n<ul>\n<li><strong>CodeBold Smart Filters<\/strong> \u2014 product filters for the shop and category pages<\/li>\n<li><strong>CodeBold Members<\/strong> \u2014 edit what each of your roles is allowed to do. This plugin's\npermissions appear there under their proper names<\/li>\n<\/ul>\n\n<p>Neither is required.<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate WooCommerce, then this plugin.<\/li>\n<li>Follow the setup screen: choose your outlet, register and receipt details.<\/li>\n<li>Open <strong>POS<\/strong> in the admin menu and start a shift.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"does%20the%20till%20really%20work%20without%20internet%3F\"><h3>Does the till really work without internet?<\/h3><\/dt>\n<dd><p>Yes, once it has been loaded. The screen, the products and the prices are cached, and\nsales made offline are queued on the device and sent when the connection returns. Card\nterminals are a separate matter \u2014 those need their own connection.<\/p><\/dd>\n<dt id=\"will%20it%20fight%20with%20my%20other%20plugins%3F\"><h3>Will it fight with my other plugins?<\/h3><\/dt>\n<dd><p>It writes stock through one path and orders through WooCommerce's own, so anything else\nreading either keeps working. Its own styles are prefixed, so it does not restyle screens\nbelonging to other plugins.<\/p><\/dd>\n<dt id=\"can%20i%20stop%20a%20cashier%20giving%20discounts%3F\"><h3>Can I stop a cashier giving discounts?<\/h3><\/dt>\n<dd><p>Yes. Discounts, price overrides, voids, refunds, seeing cost prices and opening the drawer\nare separate permissions. Install CodeBold Members to change them with checkboxes rather\nthan code.<\/p><\/dd>\n<dt id=\"does%20it%20support%20more%20than%20one%20shop%3F\"><h3>Does it support more than one shop?<\/h3><\/dt>\n<dd><p>Yes \u2014 outlets and warehouses, each with their own stock, and transfers between them.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20my%20stock%20numbers%20if%20i%20deactivate%20it%3F\"><h3>What happens to my stock numbers if I deactivate it?<\/h3><\/dt>\n<dd><p>They stay. Stock lives on the WooCommerce product, as it always did.<\/p><\/dd>\n<dt id=\"my%20barcode%20labels%20print%20in%20the%20wrong%20place%20on%20the%20sheet\"><h3>My barcode labels print in the wrong place on the sheet<\/h3><\/dt>\n<dd><p>Four settings in the browser's print dialog decide this, and every one of them defaults to\nthe wrong value for label paper:<\/p>\n\n<ul>\n<li>Paper size \u2014 A4 for sheets. For a label roll, pick the roll's own size, not A4, or you\nget one label per page.<\/li>\n<li>Margins \u2014 None. The page already contains the exact margins your sheet needs. Adding the\nbrowser's on top shifts every label down and right.<\/li>\n<li>Scale \u2014 100%. \"Fit to page\" is usually the default and shrinks everything by a few per\ncent, which is enough to miss the die cut and enough to make a barcode unreadable.<\/li>\n<li>Headers and footers \u2014 off, or the page title prints across your top row.<\/li>\n<\/ul>\n\n<p>Rather than guess, use <strong>Print a test sheet<\/strong> on the Barcode labels screen. It prints the\nsame grid as outlines on plain paper, with a 100mm ruler. Measure the ruler to check the\nscale, then hold the page against a sheet of labels to check the position. A test sheet\ncosts one piece of paper; getting it wrong costs the labels.<\/p>\n\n<p>If every label is shifted the same way, the margins are the problem. If they drift further\nout as they go down the page, the scale is.<\/p><\/dd>\n<dt id=\"which%20printer%20does%20it%20print%20to%3F\"><h3>Which printer does it print to?<\/h3><\/dt>\n<dd><p>Whichever one you choose in that dialog. WordPress cannot select a printer \u2014 no plugin can,\nbecause the browser owns printing \u2014 so what this does instead is lay the page out correctly\nin millimetres for the stock you picked, and tell you what to set.<\/p>\n\n<p>Thermal label printers and ordinary office printers both work. The label sizes on offer\ncover A4 sheets of 65 and of 24, and a 58 \u00d7 40mm continuous roll.<\/p><\/dd>\n<dt id=\"how%20many%20labels%20can%20i%20print%20at%20once%3F\"><h3>How many labels can I print at once?<\/h3><\/dt>\n<dd><p>Fifty per run in the free version, which covers labelling a shelf or a small delivery. If a\nrun would go over, it prints the first fifty and tells you how many were left out \u2014 nothing\nis lost, and you can print the rest in a second run. The paid version removes the limit.<\/p>\n\n<p>Every label size is available at every tier. If you have bought a label printer, telling\nyou the printer is a premium feature would be a poor way to meet you.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>0.9.15<\/h4>\n\n<ul>\n<li>A <strong>Help and support<\/strong> screen under the till menu, and a \"Get help\" link on the Plugins\npage. Three buttons \u2014 something is broken, I need something it does not do, a question\nbefore I buy \u2014 each open your own email program with a message already addressed to\nsupport@codeboldcommerce.com and the facts we would otherwise have to ask for (WordPress,\nPHP, WooCommerce and plugin versions, theme, active plugins) already at the bottom.\nNothing is sent from the screen itself; you see every word first and can delete any of it<\/li>\n<li>The customer display no longer bounces to the sign-in page when a till opens it on a\nsecond screen before a cashier has signed in on the first<\/li>\n<\/ul>\n\n<h4>0.9.14<\/h4>\n\n<p>Everything from 0.9.7 to 0.9.14, which were the versions reviewed for the WordPress.org\ndirectory:<\/p>\n\n<ul>\n<li>Every cap is gone. There is no product limit, no register limit and no label limit in this\nplugin \u2014 a plugin hosted on WordPress.org is free software, and free software does not\nhave a meter. The paid features live in a separate plugin, CodeBold Commerce Pro, and\nnothing here waits on it<\/li>\n<li>Renamed to CodeBold POS for WooCommerce, which is what it is<\/li>\n<li>Loyalty points: earned on a sale, spent on a later one<\/li>\n<li>A customer-facing display for a second screen, showing the sale as it is rung up<\/li>\n<li>CSV export of sales, and a PIN so a shared till can tell cashiers apart without a\nWordPress sign-in each<\/li>\n<li>A dark admin on the website's palette, and a pass over every screen for how it reads:\nform controls that stay visible under the mouse, six control states that had never been\nstyled, money lined up on the right everywhere it appears, and Stock Central that scrolls\ninside its own grid rather than the whole page sideways<\/li>\n<li>Stylesheets are enqueued the WordPress way rather than printed into the page<\/li>\n<li>Coding standards: the directory's own checker passes, and every remaining exclusion in the\nruleset says why it is there<\/li>\n<\/ul>\n\n<h4>0.9.6<\/h4>\n\n<ul>\n<li>The till and the stockroom are now switches of their own, under a new <strong>Modules<\/strong> heading\non the Add-ons screen. A shop that only wants a counter switches the stockroom off; one\nthat only wants stock management switches the till off. Neither deletes anything<\/li>\n<li>Switching a module off takes its options with it \u2014 no more answering \"yes, stock counts\nare on\" for a shop with no stockroom \u2014 but it never overwrites what you chose. Switch it\nback on and every option is exactly where you left it, and the screen says so while it\nwaits<\/li>\n<li>Stock still moves with the stockroom switched off. The write path is not a feature and\ncannot be switched off; a sale still takes stock off the shelf. You simply stop having\nscreens to manage it on<\/li>\n<li>Add-ons can no longer hide its own switch. It used to live under the stockroom menu, so\nswitching that off would have left the database as the only way back. It now follows\nwhichever menu exists, and becomes a menu of its own if neither does<\/li>\n<li>Outlets &amp; Registers follows the same rule, because an outlet is where stock lives and a\nregister is how it sells \u2014 a shop needs that screen whichever half it is running<\/li>\n<li>The till switch now reaches the till itself, not only its menus. Switching Point of sale\noff closes the register's address and its endpoints, rather than hiding the menu while\n  \/pos\/ carried on taking money<\/li>\n<li>It will not switch off from under an open shift. That is a counted drawer with somebody\nstood behind it, and taking the screens away first would leave a database edit as the\nonly way to close it. The refusal names the register, who is on it and how long for, and\nlinks to Login Sessions so it takes a few seconds to clear<\/li>\n<li>No equivalent guard on the stockroom, deliberately. An open stock take is a document and\nit keeps; nobody is holding cash for it<\/li>\n<li><code>\/pos\/<\/code> shows a plain page rather than a 404. That address is bookmarked and pinned to\nhome screens on machines nobody has signed into for months, and a browser finding nothing\nthere reports a broken shop<\/li>\n<li>Sales taken offline still land after the till is switched off. They already happened \u2014\nthe customer has the goods and the receipt, and the money is in the drawer \u2014 so refusing\nthem would not undo the sale, only lose the record of it. The page at <code>\/pos\/<\/code> finds what\na device is still holding and sends it. New sales are refused; work already done is not<\/li>\n<li>Stopping a person selling is still a permission, not a switch. Take <code>codebold_use_pos<\/code>\noff their role: it applies to that person, immediately, and a bookmark does not get round\nit<\/li>\n<li><strong>Sales reports can be read one outlet at a time.<\/strong> They could not before, which was a\nproblem worth naming rather than quietly fixing: more locations is what the paid plugin\nis sold on, and every figure on the reports screen was answering for the whole business.\nA manager with two branches has one question \u2014 which one is making money \u2014 and the\nscreen could not answer it. Takings, sales, items, best sellers, hourly, daily, per\ncashier and the shifts table are all scoped now, including the fallback query used on\nhosts without MySQL's timezone tables<\/li>\n<li>The outlet picker only appears when there is more than one outlet, so a single shop sees\nnothing new<\/li>\n<li>Where the free plugin stops is now written down in one place rather than implied. One\nlocation, one register, thirty tracked products and fifty labels a print run, with the\ntill \u2014 offline selling included \u2014 complete and free. Restaurant service, transfers, stock valuation, more\nlocations and unlimited labels are CodeBold Commerce Pro, a separate plugin<\/li>\n<li>The Add-ons screen lists what Pro adds rather than hiding it, as a labelled row with a\nlink instead of a switch that does nothing when pressed<\/li>\n<li>Switching Pro off loses screens, never records. What a shop chose is remembered while it\nis gone, so renewing puts everything back rather than starting them over<\/li>\n<\/ul>\n\n<h4>0.9.5<\/h4>\n\n<ul>\n<li>No more \"translation loading was triggered too early\" in the log. Two places built a\ntranslated catalogue only to read its keys: the capability list, and the shop-type list\nbehind every \"what kind of shop is this?\" question. Both now answer from a plain list of\nnames, and the labelled versions are built only for the screens that show them<\/li>\n<li>Role names are stored untranslated, as WordPress core stores its own. add_role() freezes\nwhatever it is given, so translating it guessed the site language once and kept that\nanswer forever. CodeBold Members renames a role to anything you like, which is a better\nanswer than a guess<\/li>\n<\/ul>\n\n<h4>0.9.4<\/h4>\n\n<ul>\n<li>Barcode labels: a test sheet. It prints the same grid as outlines on plain paper with a\n100mm ruler, so the scale and the position can both be checked before a sheet of labels\nis committed. A test sheet costs one piece of paper; getting it wrong costs the labels<\/li>\n<li>The four print-dialog settings that decide whether a sheet is usable are now named on the\nscreen itself, where they are needed, rather than in a manual nobody opens<\/li>\n<li>The label size, quantity and chosen fields are remembered per user, so the daily job is\ntwo clicks. Remembered per user rather than per site: two people stocking shelves may be\nfeeding two different printers<\/li>\n<li>The screen says how many labels a run will produce before it is printed, so nobody meets\na limit for the first time on a printed sheet<\/li>\n<li>One run prints at most 50 labels. Over that it prints the first 50 and says how many were\nleft out and what to do about it \u2014 the purchase-order picker's rule, that truncation is\nreported rather than silent, applied here too. Every label size stays available<\/li>\n<\/ul>\n\n<h4>0.9.3<\/h4>\n\n<ul>\n<li>The inventory Dashboard opens. It was registered before the menu that owns it, so\nWordPress filed its page under one name and looked it up under another. The menu item\ndrew correctly and answered a click by refusing access<\/li>\n<li>Reports no longer come back empty when asked for a range that already carries a time.\nThe time was appended a second time, the result could not be parsed, and an unparseable\ndate was being read as 1970 \u2014 so a trading day reported nothing<\/li>\n<li>Units sold, best sellers and the X and Z reports count order lines rather than stock\nledger rows. A shop that does not track stock, or has not switched tracking on yet, now\nsees its real figures instead of zeroes beside real takings<\/li>\n<li>A product nobody has counted yet is no longer reported as out of stock. It was counted\ntwice over \u2014 once as untracked, and once, in red, as out<\/li>\n<li>The shifts table no longer prints the opening float under a heading reading \"Expected\".\nExpected cash is worked out when a shift closes; until then that column is blank, as the\ntwo columns beside it already were<\/li>\n<\/ul>\n\n<h4>0.9.2<\/h4>\n\n<ul>\n<li>The till beeps when an item goes on the sale, and gives a lower double note when\nsomething is refused. A shop floor is noisy and a cashier is looking at the customer,\nnot the screen<\/li>\n<li>The sound is synthesised rather than played from a file, so it still works with the\nregister offline and adds nothing to download<\/li>\n<li>A speaker button in the toolbar turns it off, remembered on that device<\/li>\n<\/ul>\n\n<h4>0.9.1<\/h4>\n\n<ul>\n<li>The till shows a garment's size as its own badge instead of appending it to the product\nname, where a two-line caption cut it off. A rail of one dress in six sizes is six tiles\nwith the same photograph \u2014 the size was the only thing telling them apart, and it was\nthe part being hidden<\/li>\n<li>Attribute values show the name the shop typed, not the slug: \"Extra Large\", not\n\"extra-large\"<\/li>\n<\/ul>\n\n<h4>0.9.0<\/h4>\n\n<ul>\n<li>Recipes. Set what a dish is made of on the product's own Recipe tab; selling it takes\nthe ingredients out of stock, through the same single write path as everything else<\/li>\n<li>Recipes can nest, and a recipe that would contain itself is refused when it is saved<\/li>\n<li>A dish's cost is worked out from its ingredients rather than stored, so it never\ngoes stale<\/li>\n<li>Refunding a meal returns its ingredients<\/li>\n<\/ul>\n\n<h4>0.8.0<\/h4>\n\n<ul>\n<li>Kitchen tickets: send a round to the kitchen, watch it on a screen, mark it started,\nready and served<\/li>\n<li>Sending is safe to retry. A till that lost its connection and sent again does not put\nthe same food on twice<\/li>\n<li>Cancelling a line after it was sent shows the kitchen a cancellation instead of\nremoving the row<\/li>\n<\/ul>\n\n<h4>0.7.5<\/h4>\n\n<ul>\n<li>Added this readme, and corrected the plugin description: product filters and memberships\nare separate plugins and were never part of this one<\/li>\n<li>The suite now tells any installed role editor what its permissions are called<\/li>\n<\/ul>\n\n<h4>0.7.4<\/h4>\n\n<ul>\n<li>Stock Central uses the full width of the screen, and its columns can be chosen<\/li>\n<li>The POS landing page explains itself, and opens the till in a new tab<\/li>\n<li>Purchase orders can be entered as a size-by-colour grid<\/li>\n<\/ul>","raw_excerpt":"Sell over the counter from the same WooCommerce shop you sell online from. One till, one stock figure, one set of orders.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/362556","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=362556"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/codeboldtech"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=362556"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=362556"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=362556"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=362556"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=362556"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=362556"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}