{"id":359449,"date":"2026-09-06T14:54:48","date_gmt":"2026-09-06T14:54:48","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/foodxpress-for-woocommerce\/"},"modified":"2026-09-06T14:54:37","modified_gmt":"2026-09-06T14:54:37","slug":"routemile-for-woocommerce","status":"publish","type":"plugin","link":"https:\/\/wordpress.org\/plugins\/routemile-for-woocommerce\/","author":23554762,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.6.3","stable_tag":"1.6.3","tested":"7.1","requires":"6.0","requires_php":"7.4","requires_plugins":null,"header_name":"RouteMile for WooCommerce","header_author":"MD MILLAT HOSEN","header_description":"Map-based delivery management for single-restaurant WooCommerce stores.","assets_banners_color":"e45f05","last_updated":"2026-09-06 14:54:37","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/github.com\/codermillat\/routemile-woocommerce","header_author_uri":"https:\/\/millat.is-a.dev\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":50,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.6.3":{"tag":"1.6.3","author":"codermillat","date":"2026-09-06 14:54:37","revision":3683563}},"upgrade_notice":{"1.6.3":"<p>Plugin Directory review fix: two remaining template outputs now pass through <code>wp_kses_post()<\/code>. No functional changes from 1.6.2.<\/p>","1.6.2":"<p>Plugin Directory review fixes only. No functional changes from 1.6.1.<\/p>","1.6.1":"<p>Security release: unpaid orders can no longer be marked completed (which WooCommerce records as paid) from the dashboard or the rider app. Recommended for all stores.<\/p>","1.6.0":"<p>New design system across all customer and rider pages, renameable order stages, and a custom brand colour. No settings migration needed \u2014 existing settings, riders and orders are untouched.<\/p>","1.5.0":"<p>Plugin renamed (display name, slug, folder) and WP.org review-blockers resolved. Settings, rider assignments, and order statuses migrate automatically on update from 1.4.x; no manual steps required.<\/p>"},"ratings":[],"assets_icons":{"icon-256x256.png":{"filename":"icon-256x256.png","revision":3683586,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3683586,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3683586,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.6.3"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3683563,"resolution":"1","location":"assets","locale":"","width":1185,"height":2217},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3683563,"resolution":"2","location":"assets","locale":"","width":1185,"height":1455},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3683563,"resolution":"3","location":"assets","locale":"","width":1185,"height":623},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3683563,"resolution":"4","location":"assets","locale":"","width":1200,"height":1000}},"screenshots":{"1":"Map location picker on the checkout with live delivery fee.","2":"Deliveries dashboard for store managers.","3":"Mobile delivery-rider app with cash-on-delivery totals.","4":"RouteMile settings inside WooCommerce."}},"plugin_section":[],"plugin_tags":[13827,149734,192385,20710,286],"plugin_category":[39,45],"plugin_contributors":[279411],"plugin_business_model":[],"class_list":["post-359449","plugin","type-plugin","status-publish","hentry","plugin_tags-delivery","plugin_tags-food-delivery","plugin_tags-local-delivery","plugin_tags-restaurant","plugin_tags-woocommerce","plugin_category-business","plugin_category-ecommerce","plugin_contributors-codermillat","plugin_committers-codermillat"],"banners":{"banner":"https:\/\/ps.w.org\/routemile-for-woocommerce\/assets\/banner-772x250.png?rev=3683586","banner_2x":"https:\/\/ps.w.org\/routemile-for-woocommerce\/assets\/banner-1544x500.png?rev=3683586","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/routemile-for-woocommerce\/assets\/icon-256x256.png?rev=3683586","icon_2x":"https:\/\/ps.w.org\/routemile-for-woocommerce\/assets\/icon-256x256.png?rev=3683586","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/routemile-for-woocommerce\/assets\/screenshot-1.png?rev=3683563","caption":"Map location picker on the checkout with live delivery fee."},{"src":"https:\/\/ps.w.org\/routemile-for-woocommerce\/assets\/screenshot-2.png?rev=3683563","caption":"Deliveries dashboard for store managers."},{"src":"https:\/\/ps.w.org\/routemile-for-woocommerce\/assets\/screenshot-3.png?rev=3683563","caption":"Mobile delivery-rider app with cash-on-delivery totals."},{"src":"https:\/\/ps.w.org\/routemile-for-woocommerce\/assets\/screenshot-4.png?rev=3683563","caption":"RouteMile settings inside WooCommerce."}],"raw_content":"<!--section=description-->\n<p>RouteMile turns a single-restaurant WooCommerce store into a full delivery operation. Customers drop a pin on a map at checkout; the store owner manages orders through a dedicated deliveries dashboard; riders work from an installable mobile web app.<\/p>\n\n<h4>Checkout<\/h4>\n\n<ul>\n<li>Interactive map location picker (Google Maps with an API key, or a free OpenStreetMap + Leaflet mode with no key required)<\/li>\n<li>Distance-based validation \u2014 orders outside your delivery radius are blocked before payment<\/li>\n<li>Distance-based delivery fee: flat rate, per-km rate, or distance tiers, with an optional free-delivery threshold and minimum order amount<\/li>\n<li>Live fee update in the Order summary as the customer moves the pin<\/li>\n<li>Store opening hours: per-weekday schedule, \"open all day\" \/ \"closed all day\" toggles, and a special-occasion override<\/li>\n<li>Estimated arrival time shown to the customer (kitchen prep time + travel time)<\/li>\n<\/ul>\n\n<h4>Store management<\/h4>\n\n<ul>\n<li>Deliveries dashboard listing unassigned, assigned, and out-for-delivery orders, including the customer's kitchen note<\/li>\n<li>Custom order statuses: In Kitchen \u2192 Assigned \u2192 Picked Up \u2192 Completed, each with its own WooCommerce email notification<\/li>\n<li>One-click assignment of delivery riders, with automatic reassignment handling<\/li>\n<li>\"Accept Order\" action to move new orders into the kitchen with one click<\/li>\n<li>Admin-bar toggle to open\/close ordering instantly<\/li>\n<li>Rename the five order stages (labels, colours, icons) to match your restaurant's wording \u2014 shown in the admin, the rider app and customer tracking; order data itself is untouched<\/li>\n<li>Set a brand colour once and every plugin surface (checkout, tracking, My Account, rider app) recolours automatically, with WCAG-checked text contrast<\/li>\n<\/ul>\n\n<h4>Delivery rider app<\/h4>\n\n<ul>\n<li>Installable PWA (Add to Home Screen) that looks and feels like a native app<\/li>\n<li>Live order list with New \/ In Progress \/ Delivered tabs and automatic refresh when new orders arrive or statuses change<\/li>\n<li>Per-order actions: call the customer, open the exact delivery location in maps, mark picked up \/ delivered<\/li>\n<li>Cash-on-delivery awareness: shows the amount to collect per order and a running \"cash in hand\" total<\/li>\n<li>Rider-initiated cash settlement requests that a manager or admin accepts or rejects, with a full audit ledger<\/li>\n<li>Riders see delivery instructions only \u2014 kitchen notes stay private to the store<\/li>\n<\/ul>\n\n<h4>Customer features<\/h4>\n\n<ul>\n<li>Order tracking page showing live status and, once assigned, the rider's name and phone number<\/li>\n<li>Reorder shortcut and an upgraded My Account dashboard with order stats and saved delivery address<\/li>\n<li>Thermal-printer-friendly receipt template<\/li>\n<\/ul>\n\n<h4>Privacy &amp; external services<\/h4>\n\n<p>This plugin contacts third-party services only when the map provider you choose requires them. The customer's chosen coordinates (latitude, longitude) and your store address are sent to whichever provider you select. The plugin stores no telemetry and contains no advertising or analytics tracking.<\/p>\n\n<ul>\n<li><strong>Google Maps<\/strong> \u2014 JavaScript is loaded from <code>maps.googleapis.com<\/code> on the checkout page; geocoding and routing requests are sent server-side to <code>maps.googleapis.com<\/code>. Service: <a href=\"https:\/\/cloud.google.com\/maps-platform\">Google Maps Platform<\/a>. Terms: <a href=\"https:\/\/cloud.google.com\/maps-platform\/terms\">Google Maps Platform Terms of Service<\/a>. Privacy: <a href=\"https:\/\/policies.google.com\/privacy\">Google Privacy Policy<\/a>.<\/li>\n<li><strong>OpenStreetMap tiles<\/strong> \u2014 map tiles are loaded from <code>tile.openstreetmap.org<\/code>. Service: <a href=\"https:\/\/www.openstreetmap.org\/\">OpenStreetMap<\/a>. Terms \/ licence: <a href=\"https:\/\/www.openstreetmap.org\/copyright\">OpenStreetMap Copyright and License<\/a>. Privacy: <a href=\"https:\/\/osmfoundation.org\/wiki\/Privacy_Policy\">OpenStreetMap Foundation Privacy Policy<\/a>.<\/li>\n<li><strong>Nominatim geocoding (OpenStreetMap mode only)<\/strong> \u2014 coordinate and address lookups are sent to <code>nominatim.openstreetmap.org<\/code>. Subject to the OpenStreetMap Foundation's <a href=\"https:\/\/operations.osmfoundation.org\/policies\/nominatim\/\">Nominatim Usage Policy<\/a> (1 request\/second application-wide). Privacy: <a href=\"https:\/\/osmfoundation.org\/wiki\/Privacy_Policy\">OSM Foundation Privacy Policy<\/a>.<\/li>\n<li><strong>Project OSRM routing (OpenStreetMap mode only)<\/strong> \u2014 driving-distance and travel-time queries are sent to <code>router.project-osrm.org<\/code>. Service: <a href=\"https:\/\/project-osrm.org\/\">Project OSRM<\/a>. Terms: <a href=\"https:\/\/project-osrm.org\/about\/\">Project OSRM Terms of Service<\/a>. Privacy: the OSRM public router is operated by the OSRM community on a best-effort basis; please review the operator notice linked on the OSRM project page.<\/li>\n<li><strong>MapTiler<\/strong> \u2014 map tiles and geocoding calls go to <code>api.maptiler.com<\/code>. Service: <a href=\"https:\/\/www.maptiler.com\/\">MapTiler<\/a>. Terms: <a href=\"https:\/\/www.maptiler.com\/terms\/\">MapTiler Terms of Service<\/a>. Privacy: <a href=\"https:\/\/www.maptiler.com\/privacy-policy\/\">MapTiler Privacy Policy<\/a>.<\/li>\n<li><strong>Geoapify<\/strong> \u2014 tiles, geocoding and routing calls go to <code>api.geoapify.com<\/code> and <code>maps.geoapify.com<\/code>. Service: <a href=\"https:\/\/www.geoapify.com\/\">Geoapify<\/a>. Terms: <a href=\"https:\/\/www.geoapify.com\/terms-and-conditions\/\">Geoapify Terms and Conditions<\/a>. Privacy: <a href=\"https:\/\/www.geoapify.com\/privacy-policy\/\">Geoapify Privacy Policy<\/a>.<\/li>\n<\/ul>\n\n<p>Each provider's \"Powered by ...\" attribution string is shown on the customer-facing map only when you tick \"Show provider credit\" under WooCommerce \u2192 Settings \u2192 RouteMile \u2192 Map Provider. The default is OFF per the WordPress.org Plugin Directory Guideline 10; you should turn it ON whenever your selected provider's licence requires visible credit.<\/p>\n\n<p>This plugin does not set its own cookies, embed tracking pixels, or otherwise contact the visitor's browser beyond what the chosen provider does directly.<\/p>\n\n<h3>Configuration<\/h3>\n\n<h4>Map provider: which one?<\/h4>\n\n<ul>\n<li><strong>OpenStreetMap (default, no key)<\/strong> \u2014 free, works instantly. Best for small\/low-volume stores; address lookups are throttled by OSM's usage policy.<\/li>\n<li><strong>Google Maps<\/strong> \u2014 best data quality and road distances; needs a Google Cloud account with billing enabled.<\/li>\n<li><strong>MapTiler<\/strong> \u2014 free key, 100k tile loads + geocodes\/month; no road routing.<\/li>\n<li><strong>Geoapify<\/strong> \u2014 free key, 3,000 requests\/day covering tiles, geocoding and road routing.<\/li>\n<\/ul>\n\n<p>You can switch providers at any time \u2014 orders already placed are not affected.<\/p>\n\n<h4>Getting a Google Maps key<\/h4>\n\n<ol>\n<li>Go to <a href=\"https:\/\/console.cloud.google.com\/\">Google Cloud Console<\/a> and create (or pick) a project.<\/li>\n<li>Enable <strong>Maps JavaScript API<\/strong>, <strong>Geocoding API<\/strong>, and <strong>Distance Matrix API<\/strong>.<\/li>\n<li>Create an API key under APIs &amp; Services \u2192 Credentials.<\/li>\n<li>Paste it into WooCommerce \u2192 Settings \u2192 RouteMile \u2192 Map Provider \u2192 \"Google Maps JavaScript API Key\".<\/li>\n<li><strong>Recommended:<\/strong> also paste a <em>second<\/em> key into the \"Server-side API Key\" field and restrict each one:\n\n<ul>\n<li>Browser key \u2192 restrict to your domain under Application restrictions \u2192 HTTP referrers (<code>https:\/\/*.yourdomain.com\/*<\/code>).<\/li>\n<li>Server key \u2192 restrict to your server's IP address. The plugin automatically uses this one for behind-the-scenes distance\/geocoding calls.<\/li>\n<\/ul><\/li>\n<\/ol>\n\n<h4>Getting a MapTiler or Geoapify key<\/h4>\n\n<p>MapTiler: sign up at <a href=\"https:\/\/cloud.maptiler.com\/account\/keys\/\">cloud.maptiler.com<\/a> and copy a key.\nGeoapify: sign up at <a href=\"https:\/\/myprojects.geoapify.com\/\">myprojects.geoapify.com<\/a> and create a project key.\nPaste either into the \"Provider API Key\" field that appears when you select that provider. Restrict the key to your domain in the provider's dashboard if it offers referrer restrictions.<\/p>\n\n<h4>Delivery fees<\/h4>\n\n<p>Choose flat rate, per-kilometre, or distance tiers under Delivery Fee Settings \u2014 only the fields relevant to your choice are shown. Optional free-delivery threshold and minimum order amount are on the same screen.<\/p>\n\n<h4>Opening hours<\/h4>\n\n<p>Set per-weekday times, tick \"Open all day\" for 24-hour days, or use the special-occasion override to stay open despite a closed schedule. The admin-bar \"Deliveries: Open\/Closed\" toggle is always the master switch.<\/p>\n\n<h3>Security Recommendations<\/h3>\n\n<p>This plugin handles real orders and real money (including cash on delivery). A few settings matter beyond the plugin itself:<\/p>\n\n<ul>\n<li><strong>Use HTTPS.<\/strong> Checkout coordinates, rider sessions, and admin logins must travel encrypted. Most hosts offer free Let's Encrypt certificates.<\/li>\n<li><strong>Restrict your map keys.<\/strong> Browser-exposed keys (Google JS, MapTiler, Geoapify tiles) should be locked to your domain in the provider's dashboard; the Google server-side key should be locked to your server IP. Keys without restrictions can be abused if extracted from your page source.<\/li>\n<li><strong>Limit who sees what.<\/strong> Managers\/admins need <code>edit_shop_orders<\/code> or <code>manage_woocommerce<\/code>; riders only need the \"Delivery Boy\" role \u2014 they see only their own assigned orders and never other agents' data.<\/li>\n<li><strong>Cash settlement is trust-based by design.<\/strong> The plugin records exactly how much cash each rider collected and what was handed over (with who approved what, when), but physical cash counts must still be reconciled by a human.<\/li>\n<li><strong>Back up before big changes.<\/strong> Standard WordPress database backups cover all RouteMile data (orders stay in WooCommerce's own tables).<\/li>\n<\/ul>\n\n<!--section=installation-->\n<ol>\n<li>Install and activate WooCommerce first.<\/li>\n<li>Upload the plugin files to <code>\/wp-content\/plugins\/routemile-woocommerce<\/code>, or install through the WordPress plugins screen.<\/li>\n<li>Go to WooCommerce \u2192 Settings \u2192 RouteMile and pick a map provider (see Configuration below for getting API keys).<\/li>\n<li>Set your restaurant location on the map, delivery radius, and delivery fee settings.<\/li>\n<li>Enable the RouteMile Delivery method in your shipping zone(s), or let the plugin add it automatically.<\/li>\n<li>Create users with the \"Delivery Boy\" role \u2014 their mobile app lives at the Delivery Dashboard link on their profile menu.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"do%20i%20need%20a%20google%20maps%20api%20key%3F\"><h3>Do I need a Google Maps API key?<\/h3><\/dt>\n<dd><p>No. Pick the OpenStreetMap provider and the plugin uses bundled Leaflet plus free OSM tiles and Nominatim geocoding. Use Google Maps if you prefer its data quality and already have a key.<\/p><\/dd>\n<dt id=\"how%20is%20the%20delivery%20fee%20calculated%3F\"><h3>How is the delivery fee calculated?<\/h3><\/dt>\n<dd><p>From the straight-line (haversine) distance between your restaurant coordinates and the customer's dropped pin. You choose flat, per-km, or tiered pricing, and can set a minimum order amount and a free-delivery threshold.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20hpos%20%28high-performance%20order%20storage%29%3F\"><h3>Does it work with HPOS (high-performance order storage)?<\/h3><\/dt>\n<dd><p>Yes. RouteMile declares full HPOS compatibility and reads\/writes order data only through WooCommerce CRUD APIs.<\/p><\/dd>\n<dt id=\"which%20payment%20methods%20work%3F\"><h3>Which payment methods work?<\/h3><\/dt>\n<dd><p>All of them. RouteMile handles fulfilment, not payment. For cash on delivery it additionally tracks how much each rider has collected and pending hand-over.<\/p><\/dd>\n<dt id=\"are%20my%20api%20keys%20safe%3F\"><h3>Are my API keys safe?<\/h3><\/dt>\n<dd><p>Keys are stored in your own WordPress database, never sent anywhere except the map provider they belong to, and never printed in frontend JavaScript data (only in the map-provider URLs that require them). Restricting keys to your domain\/server IP as described under Security Recommendations closes the remaining abuse vector.<\/p><\/dd>\n<dt id=\"can%20customers%20see%20the%20rider%27s%20contact%20details%3F\"><h3>Can customers see the rider's contact details?<\/h3><\/dt>\n<dd><p>Only after you assign a rider to their order, and only the rider's name and phone number, on the order-tracking page.<\/p><\/dd>\n<dt id=\"where%20do%20riders%20get%20the%20app%3F\"><h3>Where do riders get the app?<\/h3><\/dt>\n<dd><p>It is not a separate download. A rider logs into your site, opens the Delivery Dashboard page, and uses \"Add to Home Screen\" in their browser to install it as a PWA.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.6.3<\/h4>\n\n<ul>\n<li>Plugin Directory review fix (round 3): the two remaining \"escape late\" outputs are now wrapped in <code>wp_kses_post()<\/code> \u2014 the <code>woocommerce_my_account_my_address_description<\/code> filter result in the My Account address template and the <code>wc_get_email_order_items()<\/code> result in the order-status email. Both keep their WooCommerce semantics (legitimate filtered HTML passes, dangerous markup is stripped).<\/li>\n<li>Fixed: an undefined <code>$i<\/code> variable in the order-status email's totals rows (a PHP 8 warning under WP_DEBUG); the first totals row's thicker top border now renders as intended.<\/li>\n<\/ul>\n\n<h4>1.6.2<\/h4>\n\n<ul>\n<li>Plugin Directory review fixes: corrected 3 invalid external-service URLs in the readme (Nominatim, MapTiler, Geoapify); removed the duplicate \"Tested up to\" header from the main plugin PHP file (kept only in readme.txt); replaced the dynamic-label <code>_n_noop()<\/code> call in the order status registration (admin-configurable labels can't be in the .pot file, so the standard WP pattern is to drop <code>label_count<\/code> for custom statuses \u2014 our own deliveries dashboard renders per-status counts separately); and wrapped the 25 inline-SVG icon echoes with <code>wp_kses_post()<\/code> via a new <code>routew_agent_icon_e()<\/code> helper so Plugin Check's escaping audit passes.<\/li>\n<\/ul>\n\n<h4>1.6.1<\/h4>\n\n<ul>\n<li>Security: manual \"completed\" transitions are now gated on payment state. Previously a shop manager could mark an unpaid order completed from the deliveries dashboard, and an assigned delivery rider could do the same through the rider app on prepaid (bank-transfer\/cheque) orders \u2014 WooCommerce records any completed order as paid, so two button taps created a \"paid\" order with no payment and no transaction record. Gateway-paid orders, cash-on-delivery with confirmed cash collection, and zero-total orders are unaffected.<\/li>\n<li>Internal: new regression suite (PG1) guards the payment gate on all four transition paths and fails the build if any future action can set completed on an unpaid order.<\/li>\n<\/ul>\n\n<h4>1.6.0<\/h4>\n\n<ul>\n<li>Mile Zero design system: every customer and rider surface (checkout, order tracking, order-received, My Account, delivery-rider app) rebuilt on a fast, self-contained design system with bundled fonts \u2014 no more theme conflicts from generic Bootstrap styling.<\/li>\n<li>Order stage labels: rename the five delivery stages (label, colour, icon) from the settings screen; renames apply everywhere instantly and never touch stored order data.<\/li>\n<li>Brand colour: pick one colour and the whole plugin UI recolours, including the rider app's PWA theme; text contrast is checked automatically.<\/li>\n<li>Manager \"Accept Order\" action for newly placed orders; rider actions update the app in place with no page reloads; cash settlement banners update live.<\/li>\n<li>WordPress Plugin Check compliance: zero errors and warnings on the shipped zip.<\/li>\n<\/ul>\n\n<h4>1.5.0<\/h4>\n\n<ul>\n<li>Plugin renamed to \"RouteMile for WooCommerce\" (plugin slug <code>routemile-woocommerce<\/code>) \u2014 distinct from the existing commercial \"FoodXpress\" food-ordering plugin per the WP.org review feedback.<\/li>\n<li>WP.org plugin-directory compliance: text domain unified to the plugin slug; inline script\/style extracted to external files; <code>[order_number]<\/code> in the receipt title now escaped (defence against merchant-controlled sequential-order-number formats); explicit capability check added to all admin-side data-migration paths; menu moved under the WooCommerce top-level (was a top-level item at a high position); map-provider \"Powered by ...\" credit is now an opt-in checkbox; readme's privacy section links each provider's Terms of Service and Privacy Policy and discloses Project OSRM.<\/li>\n<li>One-time data migration copies every old <code>fxw_*<\/code> option, transient, post meta, user meta, and <code>wc-fxw-*<\/code> order status to the new <code>routew_*<\/code> keys on upgrade. Existing 1.4.x stores keep their settings, rider assignments, order statuses, and stored delivery addresses.<\/li>\n<\/ul>\n\n<h4>1.4.0<\/h4>\n\n<ul>\n<li>Customer My Account dashboard overhaul.<\/li>\n<li>Delivery-rider PWA: installable app, live auto-refreshing order list, COD collection totals and settlement workflow with manager approval.<\/li>\n<li>Settings redesigned for non-technical admins: fields appear based on the selected map provider and fee mode; masked API-key input; clearer opening-hours controls (\"open all day\", special-occasion override).<\/li>\n<li>Kitchen notes now visible only to managers\/admins; riders see delivery instructions only.<\/li>\n<li>Fixed: admin-bar open\/close toggle, weekly-hours saving, receipt printing, unassign crash, and more \u2014 see CHANGELOG.md.<\/li>\n<\/ul>\n\n<h4>1.3.9<\/h4>\n\n<ul>\n<li>Address deduplication on receipts and order screens; one-time migration normalises existing orders; free-delivery rates labelled clearly.<\/li>\n<\/ul>\n\n<p>Earlier releases: see CHANGELOG.md in the repository.<\/p>","raw_excerpt":"Map-based delivery management for single-restaurant WooCommerce stores: pin-drop checkout, distance-based fees, custom order statuses, rider app.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/359449","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=359449"}],"author":[{"embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/codermillat"}],"wp:attachment":[{"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=359449"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=359449"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=359449"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=359449"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=359449"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=359449"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}