{"id":368983,"date":"2026-09-23T20:32:50","date_gmt":"2026-09-23T20:32:50","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/gradia-pos\/"},"modified":"2026-09-23T21:14:10","modified_gmt":"2026-09-23T21:14:10","slug":"gradia-pos","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/gradia-pos\/","author":23430168,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"10.03.05","stable_tag":"10.03.05","tested":"7.1.2","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"Gradia POS \u2013 Modern Point of Sale for WooCommerce","header_author":"Brian Agoi \u2013 Gradyzer","header_description":"A modern Point of Sale system for WooCommerce, with a touch and desktop terminal, cashier management, barcode scanning, offline support, and receipt printing.","assets_banners_color":"d0d1d2","last_updated":"2026-09-23 21:14:10","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/gradyzer.com\/gradia-pos\/","header_author_uri":"https:\/\/gradyzer.com\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":51,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"10.03.04":{"tag":"10.03.04","author":"briangradyzer","date":"2026-09-23 20:41:12","revision":3710154},"10.03.05":{"tag":"10.03.05","author":"briangradyzer","date":"2026-09-23 21:14:10","revision":3710178}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3710139,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3710139,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3710139,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3710139,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["10.03.04","10.03.05"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3710139,"resolution":"1","location":"assets","locale":"","width":1919,"height":912},"screenshot-10.png":{"filename":"screenshot-10.png","revision":3710139,"resolution":"10","location":"assets","locale":"","width":1919,"height":877},"screenshot-11.png":{"filename":"screenshot-11.png","revision":3710139,"resolution":"11","location":"assets","locale":"","width":1919,"height":873},"screenshot-12.png":{"filename":"screenshot-12.png","revision":3710139,"resolution":"12","location":"assets","locale":"","width":1919,"height":880},"screenshot-13.png":{"filename":"screenshot-13.png","revision":3710139,"resolution":"13","location":"assets","locale":"","width":1919,"height":875},"screenshot-14.png":{"filename":"screenshot-14.png","revision":3710139,"resolution":"14","location":"assets","locale":"","width":1916,"height":877},"screenshot-15.png":{"filename":"screenshot-15.png","revision":3710139,"resolution":"15","location":"assets","locale":"","width":1919,"height":880},"screenshot-16.png":{"filename":"screenshot-16.png","revision":3710139,"resolution":"16","location":"assets","locale":"","width":1919,"height":879},"screenshot-17.png":{"filename":"screenshot-17.png","revision":3710139,"resolution":"17","location":"assets","locale":"","width":1919,"height":879},"screenshot-18.png":{"filename":"screenshot-18.png","revision":3710139,"resolution":"18","location":"assets","locale":"","width":1919,"height":877},"screenshot-19.png":{"filename":"screenshot-19.png","revision":3710139,"resolution":"19","location":"assets","locale":"","width":1918,"height":878},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3710139,"resolution":"2","location":"assets","locale":"","width":1919,"height":912},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3710139,"resolution":"3","location":"assets","locale":"","width":1919,"height":874},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3710139,"resolution":"4","location":"assets","locale":"","width":1919,"height":879},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3710139,"resolution":"5","location":"assets","locale":"","width":1919,"height":880},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3710139,"resolution":"6","location":"assets","locale":"","width":1918,"height":880},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3710139,"resolution":"7","location":"assets","locale":"","width":1919,"height":880},"screenshot-8.png":{"filename":"screenshot-8.png","revision":3710139,"resolution":"8","location":"assets","locale":"","width":1918,"height":879},"screenshot-9.png":{"filename":"screenshot-9.png","revision":3710139,"resolution":"9","location":"assets","locale":"","width":1919,"height":875}},"screenshots":{"1":"Signing in to the POS terminal with a username and password","2":"Opening the cash drawer with a starting float before a shift begins","3":"The main POS terminal showing the product grid, categories, and basket","4":"Confirming a cash payment with the amount tendered and change due","5":"A printable receipt with itemized items and a barcode","6":"The payment confirmation screen after a completed sale","7":"Awarding reward points to a customer at checkout","8":"The Sales Report showing orders and totals for each cashier","9":"The X Report, a read only snapshot of sales taken mid shift","10":"Confirming the Z Report to close out the trading session","11":"The Stock Alerts log showing flagged and resolved inventory issues","12":"The Void and Refund log with approval details for each entry","13":"Sales Analytics showing daily trends and the top selling products","14":"The Inventory list showing stock levels with quick editing","15":"Account security settings, including password and PIN","16":"The Refund and Void screen for browsing past orders","17":"Shift Monitor showing active and unclosed staff shifts","18":"The Edit Product screen for updating price, stock, and other details"}},"plugin_section":[],"plugin_tags":[182488,26270,10229,26349,286],"plugin_category":[45],"plugin_contributors":[260105],"plugin_business_model":[],"class_list":["post-368983","plugin","type-plugin","status-publish","hentry","plugin_tags-cashier","plugin_tags-point-of-sale","plugin_tags-pos","plugin_tags-receipt","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-briangradyzer","plugin_committers-briangradyzer"],"banners":{"banner":"https:\/\/ps.w.org\/gradia-pos\/assets\/banner-772x250.png?rev=3710139","banner_2x":"https:\/\/ps.w.org\/gradia-pos\/assets\/banner-1544x500.png?rev=3710139","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/gradia-pos\/assets\/icon-128x128.png?rev=3710139","icon_2x":"https:\/\/ps.w.org\/gradia-pos\/assets\/icon-256x256.png?rev=3710139","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/gradia-pos\/assets\/screenshot-1.png?rev=3710139","caption":"Signing in to the POS terminal with a username and password"},{"src":"https:\/\/ps.w.org\/gradia-pos\/assets\/screenshot-2.png?rev=3710139","caption":"Opening the cash drawer with a starting float before a shift begins"},{"src":"https:\/\/ps.w.org\/gradia-pos\/assets\/screenshot-3.png?rev=3710139","caption":"The main POS terminal showing the product grid, categories, and basket"},{"src":"https:\/\/ps.w.org\/gradia-pos\/assets\/screenshot-4.png?rev=3710139","caption":"Confirming a cash payment with the amount tendered and change due"},{"src":"https:\/\/ps.w.org\/gradia-pos\/assets\/screenshot-5.png?rev=3710139","caption":"A printable receipt with itemized items and a barcode"},{"src":"https:\/\/ps.w.org\/gradia-pos\/assets\/screenshot-6.png?rev=3710139","caption":"The payment confirmation screen after a completed sale"},{"src":"https:\/\/ps.w.org\/gradia-pos\/assets\/screenshot-7.png?rev=3710139","caption":"Awarding reward points to a customer at checkout"},{"src":"https:\/\/ps.w.org\/gradia-pos\/assets\/screenshot-8.png?rev=3710139","caption":"The Sales Report showing orders and totals for each cashier"},{"src":"https:\/\/ps.w.org\/gradia-pos\/assets\/screenshot-9.png?rev=3710139","caption":"The X Report, a read only snapshot of sales taken mid shift"},{"src":"https:\/\/ps.w.org\/gradia-pos\/assets\/screenshot-10.png?rev=3710139","caption":"Confirming the Z Report to close out the trading session"},{"src":"https:\/\/ps.w.org\/gradia-pos\/assets\/screenshot-11.png?rev=3710139","caption":"The Stock Alerts log showing flagged and resolved inventory issues"},{"src":"https:\/\/ps.w.org\/gradia-pos\/assets\/screenshot-12.png?rev=3710139","caption":"The Void and Refund log with approval details for each entry"},{"src":"https:\/\/ps.w.org\/gradia-pos\/assets\/screenshot-13.png?rev=3710139","caption":"Sales Analytics showing daily trends and the top selling products"},{"src":"https:\/\/ps.w.org\/gradia-pos\/assets\/screenshot-14.png?rev=3710139","caption":"The Inventory list showing stock levels with quick editing"},{"src":"https:\/\/ps.w.org\/gradia-pos\/assets\/screenshot-15.png?rev=3710139","caption":"Account security settings, including password and PIN"},{"src":"https:\/\/ps.w.org\/gradia-pos\/assets\/screenshot-16.png?rev=3710139","caption":"The Refund and Void screen for browsing past orders"},{"src":"https:\/\/ps.w.org\/gradia-pos\/assets\/screenshot-17.png?rev=3710139","caption":"Shift Monitor showing active and unclosed staff shifts"},{"src":"https:\/\/ps.w.org\/gradia-pos\/assets\/screenshot-18.png?rev=3710139","caption":"The Edit Product screen for updating price, stock, and other details"},{"src":"https:\/\/ps.w.org\/gradia-pos\/assets\/screenshot-19.png?rev=3710139","caption":""}],"raw_content":"<!--section=description-->\n<p>Gradia POS turns your WooCommerce store into a fully-featured Point of Sale terminal \u2014 accessible directly from a browser, no dedicated hardware needed.<\/p>\n\n<p><strong>Key Features:<\/strong><\/p>\n\n<ul>\n<li>\ud83d\uded2 Fast product search by name, SKU, or barcode scan<\/li>\n<li>\ud83d\udcb3 Payment gateways pulled directly from WooCommerce (local or remote store)<\/li>\n<li>\ud83d\udda8 Receipt printing for both local and external WooCommerce orders<\/li>\n<li>\ud83c\udf10 Remote WooCommerce store bridge via REST API (Consumer Key \/ Secret)<\/li>\n<li>\ud83d\udce6 Add and edit products from within the POS terminal<\/li>\n<li>\ud83d\udcf7 WP Media Library image picker in product forms (with URL fallback)<\/li>\n<li>\ud83d\udc65 Role-based access: Administrator, Shop Manager, Supervisor, Cashier<\/li>\n<li>\ud83d\udcf6 Offline support with IndexedDB order queue and auto-sync<\/li>\n<li>\u2b50 Built-in customer rewards and loyalty points<\/li>\n<li>\u23f0 Shift tracking with clock-in\/clock-out, shift log, and live monitor<\/li>\n<li>\ud83c\udf81 Tips and gift cards at checkout<\/li>\n<li>\u2709\ufe0f Optional digital receipt by email, alongside printing<\/li>\n<li>\ud83c\udfa8 Glassmorphic UI with customisable accent colour and dark mode<\/li>\n<li>\ud83d\udd12 All API credentials encrypted at rest (AES-256-CBC)<\/li>\n<\/ul>\n\n<h3>External services<\/h3>\n\n<p>This plugin connects to the following third party services. Each one is used only for a specific, optional feature, and none of them run unless the relevant setting or feature is used.<\/p>\n\n<p><strong>Gravatar (Automattic)<\/strong>\nUsed to show a staff member's profile picture in the account panel of the POS terminal and the admin settings screen. Whenever a user's avatar is displayed, their email address is converted to an anonymized hash and sent to Gravatar to retrieve the matching image; if no Gravatar image exists for that address, a generated placeholder is shown instead. This is WordPress core's own avatar mechanism (\"get_avatar\"), not something specific to this plugin.\nTerms of Use available at https:\/\/en.gravatar.com\/site\/terms-of-service\nPrivacy Policy available at https:\/\/automattic.com\/privacy\/<\/p>\n\n<p><strong>Stripe<\/strong>\nUsed to process card payments, either through Stripe Elements at the register or through a connected Stripe Terminal card reader, when the store owner selects Stripe as a payment provider in Settings. Card details are sent directly to Stripe by Stripe's own SDK, never to this plugin; the plugin sends the order amount and currency to Stripe's API to create, capture, or cancel a payment when a Stripe transaction is started, completed, or cancelled at checkout.\nTerms of Service available at https:\/\/stripe.com\/legal\/ssa\nPrivacy Policy available at https:\/\/stripe.com\/privacy<\/p>\n\n<p><strong>Square<\/strong>\nUsed to process payments through a connected Square Terminal card reader, when the store owner selects Square as the terminal provider in Settings. The order amount and currency are sent to Square's API to create a checkout when a Square Terminal payment is started, and to poll or cancel it while it is in progress.\nTerms of Service available at https:\/\/squareup.com\/us\/en\/legal\/general\/developers\nPrivacy Policy available at https:\/\/squareup.com\/us\/en\/legal\/general\/privacy<\/p>\n\n<p><strong>Paystack<\/strong>\nUsed to process card payments at the register when the store owner selects Paystack as a payment provider in Settings. Card details are sent directly to Paystack by Paystack's own SDK, never to this plugin; the plugin sends the order amount and currency to Paystack when a payment is started.\nTerms of Use available at https:\/\/paystack.com\/terms\nPrivacy Policy available at https:\/\/paystack.com\/privacy\/merchant<\/p>\n\n<p><strong>Flutterwave<\/strong>\nUsed to process card payments at the register when the store owner selects Flutterwave as a payment provider in Settings. Card details are sent directly to Flutterwave by Flutterwave's own SDK, never to this plugin; the plugin sends the order amount and currency to Flutterwave when a payment is started.\nTerms of Service available at https:\/\/flutterwave.com\/us\/terms\nPrivacy Policy available at https:\/\/flutterwave.com\/us\/privacy-policy\/<\/p>\n\n<p><strong>PrintNode<\/strong>\nUsed for cloud receipt printing, when the store owner configures a PrintNode API key in Settings and chooses PrintNode as the print method. The receipt content and the selected printer ID are sent to PrintNode each time a receipt is printed through it.\nTerms and Conditions available at https:\/\/www.printnode.com\/en\/terms-conditions\nPrivacy Policy available at https:\/\/www.printnode.com\/en\/privacy-policy<\/p>\n\n<!--section=installation-->\n<ol>\n<li>Upload the <code>gradia-pos<\/code> folder to <code>\/wp-content\/plugins\/<\/code><\/li>\n<li>Activate the plugin through the <strong>Plugins<\/strong> menu in WordPress<\/li>\n<li>Navigate to <strong>WP Admin \u2192 Gradia POS<\/strong> to configure your store settings<\/li>\n<li>Assign users the <strong>Cashier<\/strong> role via <strong>WP Admin \u2192 Gradia POS \u2192 Cashier Users<\/strong><\/li>\n<li>Cashiers are automatically redirected to the POS Terminal on login<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"how%20do%20i%20connect%20an%20external%20woocommerce%20store%3F\"><h3>How do I connect an external WooCommerce store?<\/h3><\/dt>\n<dd><p>Go to <strong>WP Admin \u2192 Gradia POS \u2192 Settings<\/strong> and enable Remote Mode. Enter the external store URL and a WooCommerce Consumer Key \/ Secret with read\/write permissions.<\/p><\/dd>\n<dt id=\"what%20roles%20can%20access%20the%20pos%3F\"><h3>What roles can access the POS?<\/h3><\/dt>\n<dd><p>Administrator, Shop Manager, and Cashier. Administrators control which Cashiers can add or edit products via <strong>WP Admin \u2192 Gradia POS \u2192 Cashier Users<\/strong>.<\/p><\/dd>\n<dt id=\"can%20cashiers%20edit%20products%3F\"><h3>Can Cashiers edit products?<\/h3><\/dt>\n<dd><p>Yes \u2014 if explicitly enabled by the Administrator in POS Settings. Shop Managers and Administrators can always add and edit products.<\/p><\/dd>\n<dt id=\"does%20it%20work%20offline%3F\"><h3>Does it work offline?<\/h3><\/dt>\n<dd><p>Yes. Products are cached in IndexedDB. Cash orders placed offline are queued and synced automatically when the connection is restored.<\/p><\/dd>\n<dt id=\"can%20i%20print%20receipts%20for%20external%20store%20orders%3F\"><h3>Can I print receipts for external store orders?<\/h3><\/dt>\n<dd><p>Yes. A local receipt is generated for every order (local or remote) and includes the correct change calculation.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>10.03.05<\/h4>\n\n<ul>\n<li>Renamed the plugin to \"Gradia POS \u2013 Modern Point of Sale for WooCommerce\" (plugin header and readme both updated to match)<\/li>\n<li>The cash drawer no longer pops open automatically for card\/electronic payments \u2014 it now only fires the drawer-kick command (QZ Tray and PrintNode both) when the payment method was actually cash. A new machine-readable paymentMethod field was added alongside the existing display-label field everywhere receipt data gets built (local orders, remote orders, split payments \u2014 which check whether any of the combined payment parts was cash) so this can be checked reliably rather than guessed from tendered\/change values, which have edge cases (an exact-cash payment shows change=0, same as a card payment would).<\/li>\n<\/ul>\n\n<h4>10.03.04<\/h4>\n\n<ul>\n<li>Found and fixed the actual root cause of remote-mode charges failing whenever a customer was selected: \"Customer ID is invalid.\" A customer picked on the POS is always a local WordPress user (that's where reward-points meta lives), but in remote mode the order gets created on a completely separate WooCommerce install with its own separate customer table \u2014 the local ID meant nothing there, and WooCommerce's own REST API correctly rejected it.<\/li>\n<li>Fixed by resolving the local customer to a real remote customer by email at the point of order submission \u2014 looking them up on the remote store, creating one there if none exists yet, and caching the mapping so repeat customers only need this resolved once. Falls back to guest checkout on the remote order (rather than blocking the sale) if the local user has no email or the remote store can't be reached.<\/li>\n<\/ul>\n\n<h4>10.03.03<\/h4>\n\n<ul>\n<li>Checkout hardening on top of 10.03.02's fix: the order-creation response now goes through the plugin's own resilient JSON parser (already used elsewhere in this file) as an extra defensive layer against any future stray PHP output corrupting the response, on top of the actual root-cause fix already shipped. Phase 2 finalisation stays fire-and-forget (deliberately not awaited \u2014 blocking every sale on it would mean an error there looks identical to a failed charge, when the charge already succeeded, risking a duplicate), but now shows a toast if it fails instead of staying silent, and is skipped entirely for remote orders, which never use it.<\/li>\n<\/ul>\n\n<h4>10.03.02<\/h4>\n\n<ul>\n<li>Found the actual cause of remote-mode charges silently failing to produce a receipt (was diagnosed and fixed on the Pro side after live testing there, this plugin had the identical bug and is fixed the same way): two variables ($sub_pre, $subtotal_raw) in the remote order-creation code were only defined inside a conditional block or later in the function, but used unconditionally\/earlier elsewhere. A sale with a rewards redemption but no separate POS discount hit the first one directly; the second was always latent regardless of discount, silently zeroing out every tax line (VAT\/NHIL\/GETFund) on the receipt. On a site with PHP warnings set to display, either one gets echoed into the AJAX response ahead of the JSON, breaking it client-side. Both now compute unconditionally before their first use.<\/li>\n<\/ul>\n\n<h4>10.03.01<\/h4>\n\n<ul>\n<li>Fixed the previous fix: syncing a rewards-selected customer to the basket's customer field was also firing the same event used for selecting a customer before adding items, which independently triggers price-level re-pricing. With the payment modal already open and totals already fixed, that re-pricing happened silently mid-checkout, so the charge the server received no longer matched the modal's numbers, and Confirm &amp; Charge just failed silently instead of producing a receipt. The sync no longer fires that event, only the two fields it actually needs to set.<\/li>\n<li>Versioning correction (again \u2014 this one's on me): 10.02.21 should have wrapped to 10.03.01<\/li>\n<\/ul>\n\n<h4>10.02.21<\/h4>\n\n<ul>\n<li>Fixed a real bug: selecting a customer inside the Rewards redemption modal never updated the basket's own customer field, so the order was still created against Walk-in Guest even though the points redemption correctly happened against the right customer. Now syncs automatically, without overriding a customer the cashier deliberately selected separately.<\/li>\n<li>Removed the customer name\/reward-points receipt feature added in 10.02.20 \u2014 that's a Pro-only feature and shouldn't have shipped here.<\/li>\n<\/ul>\n\n<h4>10.02.20<\/h4>\n\n<ul>\n<li>Receipts now show the reward points a purchase will earn (when a customer is selected), alongside the points-remaining balance already shown. Clearly separate from the confirmed balance, since the cashier still confirms the actual award in a later step after the receipt prints \u2014 this is the same estimate that confirmation screen itself computes.<\/li>\n<\/ul>\n\n<h4>10.02.19<\/h4>\n\n<ul>\n<li>Added the missing Text Domain header (gradia-pos) \u2014 WordPress can derive it from the slug without one, but every translation call in the codebase already uses this literal string, so declaring it removes any ambiguity<\/li>\n<li>Trimmed this changelog, which was well over WordPress.org's 5,000 character limit and being silently truncated<\/li>\n<\/ul>\n\n<h4>10.02.18<\/h4>\n\n<ul>\n<li>Widened the option-migration fix to also catch options defined as class constants, not just literal strings; re-versioned the migration guard to run again for anyone who got the earlier, incomplete pass<\/li>\n<li>Extended role migration to also catch custom staff roles created before the prefix rename, not just Cashier\/Supervisor<\/li>\n<\/ul>\n\n<h4>10.02.17<\/h4>\n\n<ul>\n<li>Fixed data appearing to vanish after updating (empty products, blank categories) \u2014 added a one-time migration for options and role assignments left behind by the grdpos_ \u2192 gradia_pos_ prefix rename<\/li>\n<\/ul>\n\n<h4>10.02.16<\/h4>\n\n<ul>\n<li>Fixed a fatal error on every front-end page load when neither local WooCommerce nor a remote store was fully configured yet<\/li>\n<\/ul>\n\n<h4>10.02.15<\/h4>\n\n<ul>\n<li>Properly fixed the receipt print window's asset loading (enqueue + wp_print_styles\/scripts instead of raw tags) and remaining email-escaping findings<\/li>\n<\/ul>\n\n<h4>10.02.14<\/h4>\n\n<ul>\n<li>Removed dead 2FA and biometric sign-in code from the login page (inert markup and unreachable JS, no server-side path ever triggers either)<\/li>\n<\/ul>\n\n<h4>10.02.13<\/h4>\n\n<ul>\n<li>Renamed every grdpos_ identifier to gradia_pos_ (functions, options, roles, AJAX actions, JS globals\/events, CSS classes) to avoid a real collision with Portal Cloud 9 Pro<\/li>\n<li>Fixed a dead nonce field, a dead self-referential code block, and a real drawer-open AJAX action name mismatch found while verifying the rename<\/li>\n<\/ul>\n\n<h4>10.02.12<\/h4>\n\n<ul>\n<li>Removed a leftover AJAX action registration pointing at an undefined callback, a latent fatal-error risk<\/li>\n<\/ul>\n\n<h4>10.02.11<\/h4>\n\n<ul>\n<li>WordPress.org review remediation: receipt print window assets moved to external files, discount-label\/email escaping fixed, several phpcs:ignore suppressions replaced with proper wp_kses() calls, esc_attr() added to CSS-generating functions, esc_url_raw() corrected to esc_url()<\/li>\n<li>Renamed the p9PosData JS global to grdposData<\/li>\n<\/ul>\n\n<h4>10.01.31<\/h4>\n\n<ul>\n<li>Fixed the SKU\/Barcode scan button showing the theme's pink accent instead of the intended style, and swapped its icon for an actual barcode icon<\/li>\n<\/ul>\n\n<h4>Earlier versions<\/h4>\n\n<p>See the plugin's page at https:\/\/gradyzer.com\/gradia-pos\/ for the complete version history.<\/p>","raw_excerpt":"A modern Point of Sale system for WooCommerce with a touch and desktop POS terminal, cashier management, barcode scanning, and receipt printing.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/368983","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=368983"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/briangradyzer"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=368983"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=368983"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=368983"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=368983"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=368983"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=368983"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}