TillKit
TillKit turns your WooCommerce store into a mobile point of sale. Open the app from any phone or tablet browser, log in with a PIN, and start selling.
Free Features
- Mobile POS — Full-screen product grid with category filter chips, search by name / SKU, and cart drawer
- Till management — Open and close a till with float tracking and variance report on close
- Order history — Browse today’s orders with full item breakdown
- Cash payments — Take cash sales and track change
- PWA / Add to Home Screen — Install on Android (Chrome) or iOS (Safari) for a native app feel
- 2 staff members with PIN login — Cashier and Manager roles
- 1 active cart — Single cart per session
- Offline mode — Products cached; pending orders sync on reconnect
Upgrade to Pro
TillKit Pro adds:
- Unlimited staff and all roles (Supervisor, Scanner Only)
- Up to 10 simultaneous carts
- Card and custom payment methods
- Full & partial refunds from Order History
- Receipt emails sent to customers
- Barcode Scanner tab (Quagga2) with scan log
- Size Exchange with automatic stock adjustment on both sides
- Reports — Shifts & Till Summaries, Product Sales, Exchange Log
- Email Designer for branded receipts
- Priority support
PWA Shell Architecture
TillKit serves its point-of-sale interface as a Progressive Web App (PWA). When a user visits the configured suite URL, the plugin intercepts the request via the template_redirect action hook, outputs a complete standalone HTML document, and calls exit(). WordPress never proceeds to wp_head() or wp_footer(), so the assets registered via wp_enqueue_script()/wp_enqueue_style() for this request have nothing to print into automatically — they’re printed directly instead, as described below.
The scripts and styles for the PWA shell are registered and enqueued through the standard wp_register_script()/wp_enqueue_script() and wp_register_style()/wp_enqueue_style() APIs (see tillkit_pwa_register_script() and tillkit_pwa_register_style() in tillkit-main.php). Because wp_head()/wp_footer() never run for this request, the enqueued assets are printed directly via wp_print_scripts()/wp_print_styles() with an explicit handle array, rather than relying on those hooks. This only prints the exact handles this plugin registered — not a foreign theme’s full head output — and runs safely after init, since registration happens on template_redirect. Dynamic values (the inline config block and theme-colour CSS override) are attached via wp_add_inline_script()/wp_add_inline_style(). All values are sanitized: URLs through esc_url(), version strings through esc_attr(), and inline JS values through esc_js().
This is the same pattern used by any WordPress plugin that serves a full-page application (e.g. login pages, OAuth callbacks, app shells) via template_redirect. The relevant PHPCS rules are suppressed with // phpcs:disable WordPress.WP.EnqueuedResources at the function level with this explanation inline.
WordPress Core File Usage
TillKit loads two sets of WordPress core admin helper files using require_once. These are standard WordPress patterns and are used as follows:
-
wp-admin/includes/upgrade.php— loaded inTillKit_Databasemethods that calldbDelta()to create or update database tables. This is the documented WordPress method for plugin schema management. The file is loaded immediately beforedbDelta()is called. -
wp-admin/includes/file.php,image.php,media.php— loaded in theupload_mediaREST API endpoint when processing logo uploads. These files exposewp_handle_upload(),wp_generate_attachment_metadata(), andmedia_handle_upload(), which are called immediately after loading. The files are only loaded if the functions are not already available.
In all cases, require_once is used (not require), the files are WordPress core files (not third-party), and a function from each file is called immediately after loading — as recommended in the WordPress plugin guidelines.
Third Party Libraries
TillKit includes two pre-built third-party libraries as minified bundles. Both are unmodified upstream releases. Source code, license, and build instructions are provided below.
QuaggaJS v0.12.1
- Files:
app/js/quagga.js,suite/js/quagga.js - Purpose: Camera-based barcode scanning (live video stream barcode decoding)
- License: MIT
- Original source: https://github.com/serratus/quaggaJS (archived)
- Actively maintained fork: https://github.com/ericblade/quagga2
- NPM package: https://www.npmjs.com/package/@ericblade/quagga2
- License text: https://github.com/serratus/quaggaJS/blob/master/LICENSE
The included quagga.js is the unmodified dist/quagga.js output from the
upstream serratus/quaggaJS build at tag v0.12.1. To reproduce it from source:
git clone https://github.com/serratus/quaggaJS.git
cd quaggaJS
git checkout v0.12.1
npm install
npm run build
# Output at: dist/quagga.js
cp dist/quagga.js /path/to/plugin/app/js/quagga.js
cp dist/quagga.js /path/to/plugin/suite/js/quagga.js
Chart.js v4.5.1
- File:
admin/js/chart.umd.js - Purpose: Admin analytics charts
- License: MIT
- Source: https://github.com/chartjs/Chart.js
- License file: https://github.com/chartjs/Chart.js/blob/master/LICENSE.md
The minified file is the unmodified output of the Chart.js build. To reproduce it:
npm install chart.js@4.5.1
# Copy node_modules/chart.js/dist/chart.umd.js to admin/js/chart.umd.js
Or download directly: https://github.com/chartjs/Chart.js/releases/tag/v4.5.1
Source Code and Build Tools
Plugin Source Files (no build step required)
All TillKit JavaScript files are plain, unminified, human-readable source files included directly in the plugin package. No compiler, bundler, or transpiler is used for plugin code.
suite/js/app.js— App bootstrap, authentication, navigationsuite/js/pos.js— POS product grid, category chips, searchsuite/js/cart.js— Cart drawer, multi-cart managementsuite/js/scanner.js— Barcode scanner tab (Quagga2 wrapper)suite/js/history.js— Order history, refundssuite/js/exchange.js— Size exchange workflowsuite/js/store.js— Store/product management tabsuite/js/sw.js— Service Worker (offline cache, sync queue)admin/js/tillkit-admin.js— WordPress admin panel
To modify these files: edit them directly. No compilation step is needed. If you change sw.js or any file that may be cached, increment the CACHE_VERSION constant at the top of sw.js to bust the service worker cache.
Third-Party Libraries
Two third-party libraries are included as pre-built minified bundles. They are compiled by their own upstream build systems — not by this plugin. Instructions for reproducing each bundle from source are provided below.
QuaggaJS v0.12.1 — suite/js/quagga.js, app/js/quagga.js
- Purpose: Barcode scanning via camera feed
- License: MIT
- Upstream source: https://github.com/serratus/quaggaJS
- NPM package:
quagga(note: the actively maintained fork is@ericblade/quagga2at https://github.com/ericblade/quagga2)
To regenerate quagga.js from source:
git clone https://github.com/serratus/quaggaJS.git
cd quaggaJS
npm install
npm run build
# Output: dist/quagga.js
Copy dist/quagga.js to both suite/js/quagga.js and app/js/quagga.js.
Chart.js v4.5.1 — admin/js/chart.umd.js
- Purpose: Analytics charts on the admin Reports page
- License: MIT
- Upstream source: https://github.com/chartjs/Chart.js
To regenerate chart.umd.js from source:
npm install chart.js@4.5.1
# Output: node_modules/chart.js/dist/chart.umd.js
Copy node_modules/chart.js/dist/chart.umd.js to admin/js/chart.umd.js.
Alternatively, download the file directly from the Chart.js CDN or GitHub release: https://github.com/chartjs/Chart.js/releases/tag/v4.5.1
Summary
No custom build pipeline exists for this plugin. Future developers only need a text editor to modify plugin source files. The two minified files above are unmodified upstream releases and can be updated by following the steps above.