{"id":359415,"date":"2026-08-31T15:09:18","date_gmt":"2026-08-31T15:09:18","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/post-purchase-hub-for-woocommerce\/"},"modified":"2026-09-06T14:19:29","modified_gmt":"2026-09-06T14:19:29","slug":"wpmake-post-purchase-hub","status":"publish","type":"plugin","link":"https:\/\/ky.wordpress.org\/plugins\/wpmake-post-purchase-hub\/","author":23163452,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.1.0","stable_tag":"1.1.0","tested":"7.1","requires":"6.5","requires_php":"8.1","requires_plugins":null,"header_name":"Order Tracking, Cancel & Return for WooCommerce \u2013 Post-Purchase Hub","header_author":"WPMake","header_description":"Order timeline, self-service post-purchase actions and a merchant request queue for WooCommerce stores.","assets_banners_color":"152337","last_updated":"2026-09-06 14:19:29","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/www.wpmake.net\/post-purchase-hub\/","header_author_uri":"https:\/\/wpmake.net\/","rating":0,"author_block_rating":0,"active_installs":0,"downloads":84,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.0.0":{"tag":"1.0.0","author":"wpmakedev","date":"2026-08-31 15:09:03","revision":3674529},"1.1.0":{"tag":"1.1.0","author":"wpmakedev","date":"2026-09-06 14:19:29","revision":3683512}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3674529,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3674529,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3674529,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3674529,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":{"wpmphub\/order-lookup":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"wpmphub\/order-lookup","title":"Order lookup","category":"woocommerce","icon":"search","description":"Lets a customer without an account ask for a secure link to one of their orders.","textdomain":"wpmake-post-purchase-hub","supports":{"html":false,"align":["wide"]},"editorScript":"file:.\/index.js"},"wpmphub\/orders":{"$schema":"https:\/\/schemas.wp.org\/trunk\/block.json","apiVersion":3,"name":"wpmphub\/orders","title":"Order timeline","category":"woocommerce","icon":"list-view","description":"Shows the signed-in customer's orders with their delivery timeline.","textdomain":"wpmake-post-purchase-hub","supports":{"html":false,"align":["wide","full"]},"attributes":{"limit":{"type":"number","default":10}},"editorScript":"file:.\/index.js"}},"tagged_versions":["1.0.0","1.1.0"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3674529,"resolution":"1","location":"assets","locale":"","width":1280,"height":613},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3674529,"resolution":"2","location":"assets","locale":"","width":1280,"height":637},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3674529,"resolution":"3","location":"assets","locale":"","width":1280,"height":800},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3674529,"resolution":"4","location":"assets","locale":"","width":1280,"height":315},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3674529,"resolution":"5","location":"assets","locale":"","width":1280,"height":800},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3674529,"resolution":"6","location":"assets","locale":"","width":1280,"height":955},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3674529,"resolution":"7","location":"assets","locale":"","width":1280,"height":2054},"screenshot-8.png":{"filename":"screenshot-8.png","revision":3674529,"resolution":"8","location":"assets","locale":"","width":1280,"height":1329},"screenshot-9.png":{"filename":"screenshot-9.png","revision":3674529,"resolution":"9","location":"assets","locale":"","width":1280,"height":343}},"screenshots":{"1":"Every order gets an order status timeline on the customer's own my account page, with an estimated delivery date wherever you have set shipping times.","2":"The My Account order list gains a Progress column, and shows only the actions that actually apply to each order.","3":"Customers ask to cancel and you approve or decline. Nothing is cancelled automatically, and the plugin never issues a refund.","4":"The request queue: every cancellation request waiting on a decision, with the order it belongs to and the reason the customer gave.","5":"A setup wizard that asks what you need and skips what you do not. Nothing reaches your storefront until you finish it.","6":"The settings screen, with a status panel that says plainly whether everything is working.","7":"Map your own order statuses onto the stages customers see, and set handling and transit times per shipping method.","8":"Choose what customers can do for themselves, and the rules around cancellation requests.","9":"Guest order lookup: customers without an account reach their order through a secure link emailed to the address already on it."}},"plugin_section":[],"plugin_tags":[144997,21484,45369,2286,286],"plugin_category":[45],"plugin_contributors":[234352],"plugin_business_model":[],"class_list":["post-359415","plugin","type-plugin","status-publish","hentry","plugin_tags-cancel-order","plugin_tags-order-status","plugin_tags-order-tracking","plugin_tags-reorder","plugin_tags-woocommerce","plugin_category-ecommerce","plugin_contributors-wpmakedev","plugin_committers-wpmakedev"],"banners":{"banner":"https:\/\/ps.w.org\/wpmake-post-purchase-hub\/assets\/banner-772x250.png?rev=3674529","banner_2x":"https:\/\/ps.w.org\/wpmake-post-purchase-hub\/assets\/banner-1544x500.png?rev=3674529","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/wpmake-post-purchase-hub\/assets\/icon-128x128.png?rev=3674529","icon_2x":"https:\/\/ps.w.org\/wpmake-post-purchase-hub\/assets\/icon-256x256.png?rev=3674529","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/wpmake-post-purchase-hub\/assets\/screenshot-1.png?rev=3674529","caption":"Every order gets an order status timeline on the customer's own my account page, with an estimated delivery date wherever you have set shipping times."},{"src":"https:\/\/ps.w.org\/wpmake-post-purchase-hub\/assets\/screenshot-2.png?rev=3674529","caption":"The My Account order list gains a Progress column, and shows only the actions that actually apply to each order."},{"src":"https:\/\/ps.w.org\/wpmake-post-purchase-hub\/assets\/screenshot-3.png?rev=3674529","caption":"Customers ask to cancel and you approve or decline. Nothing is cancelled automatically, and the plugin never issues a refund."},{"src":"https:\/\/ps.w.org\/wpmake-post-purchase-hub\/assets\/screenshot-4.png?rev=3674529","caption":"The request queue: every cancellation request waiting on a decision, with the order it belongs to and the reason the customer gave."},{"src":"https:\/\/ps.w.org\/wpmake-post-purchase-hub\/assets\/screenshot-5.png?rev=3674529","caption":"A setup wizard that asks what you need and skips what you do not. Nothing reaches your storefront until you finish it."},{"src":"https:\/\/ps.w.org\/wpmake-post-purchase-hub\/assets\/screenshot-6.png?rev=3674529","caption":"The settings screen, with a status panel that says plainly whether everything is working."},{"src":"https:\/\/ps.w.org\/wpmake-post-purchase-hub\/assets\/screenshot-7.png?rev=3674529","caption":"Map your own order statuses onto the stages customers see, and set handling and transit times per shipping method."},{"src":"https:\/\/ps.w.org\/wpmake-post-purchase-hub\/assets\/screenshot-8.png?rev=3674529","caption":"Choose what customers can do for themselves, and the rules around cancellation requests."},{"src":"https:\/\/ps.w.org\/wpmake-post-purchase-hub\/assets\/screenshot-9.png?rev=3674529","caption":"Guest order lookup: customers without an account reach their order through a secure link emailed to the address already on it."}],"raw_content":"<!--section=description-->\n<p>Most WooCommerce order tracking plugins sell you a carrier integration: you open\nan account with a shipping API, pay a monthly SaaS fee, and your customers'\ndelivery data travels through somebody else's servers. <strong>This plugin does not\ncompete there, and does not try to.<\/strong> It puts customer self-service on the order\npage your customers already open \u2014 an order status timeline, an estimated\ndelivery date, and the buttons to cancel order, reorder, find an invoice or ask\na question \u2014 with no carrier account, no monthly fee, and no outbound HTTP\nrequests of any kind.<\/p>\n\n<p>Every WooCommerce store gets the same email, over and over: <strong>where is my\norder?<\/strong> The customer already has the answer in their account \u2014 an order status\nlike \"processing\" \u2014 but that word means nothing to them. So they write to you,\nand you answer by hand.<\/p>\n\n<p>Post-Purchase Hub turns that status into something a customer can actually read:\na stage-by-stage timeline on the my account page they already visit, with a\ndelivery estimate where you have told it your shipping times. Then it gives them\nthe few things they would otherwise have emailed you about \u2014 cancelling,\nreordering, finding an invoice, asking a question \u2014 as buttons that route into a\nqueue you control.<\/p>\n\n<p>It adds all of this to the pages your theme already draws. It does not take them\nover unless you ask it to.<\/p>\n\n<h4>Features<\/h4>\n\n<p><strong>Order status timeline<\/strong><\/p>\n\n<ul>\n<li><strong>Stage-by-stage progress<\/strong> on the single order page and in My Account, built\nfrom status changes recorded as they happen \u2014 so the dates shown are real.<\/li>\n<li><strong>A Progress column<\/strong> on the My Account order list, so a customer with several\nopen orders sees all of them at a glance.<\/li>\n<li><strong>Stages mapped from your own statuses<\/strong> \u2014 the plugin reads the statuses your\nstore actually uses, including custom ones added by other plugins.<\/li>\n<li><strong>Internal statuses stay internal.<\/strong> Any status can be set to \"not shown to\ncustomers\" and contributes nothing to the timeline.<\/li>\n<li><strong>Honest blanks.<\/strong> Where a date is not known, it says so rather than inventing\none.<\/li>\n<\/ul>\n\n<p><strong>Estimated delivery date<\/strong><\/p>\n\n<ul>\n<li><strong>Handling time<\/strong> in business days, set once for the store and overridable per\nshipping method.<\/li>\n<li><strong>Transit time as a range<\/strong> per shipping method, so customers see \"arrives\nbetween the 26th and the 28th\" rather than a single date that will sometimes be\nwrong.<\/li>\n<li><strong>Your non-working days and holidays<\/strong> are excluded from every calculation.<\/li>\n<li><strong>Real tracking wins.<\/strong> As soon as a tracking plugin supplies a real tracking\nnumber, the estimate steps aside automatically. Works with <strong>Advanced Shipment\nTracking<\/strong> and <strong>WooCommerce Shipment Tracking<\/strong> out of the box, and any other\nsource through a filter.<\/li>\n<\/ul>\n\n<p><strong>Customer self-service<\/strong><\/p>\n\n<ul>\n<li><strong>Cancel order<\/strong> \u2014 the customer gives a reason and an optional note. It becomes\na request you approve or decline.<\/li>\n<li><strong>Reorder<\/strong> \u2014 re-adds a past order to the cart, after a screen showing what\nchanged: what is out of stock, what no longer exists, what costs more.<\/li>\n<li><strong>Invoice<\/strong> \u2014 links to the invoice your invoice plugin already generated.\nSupports <strong>PDF Invoices &amp; Packing Slips<\/strong>, and falls back to the printable\norder page when no invoice plugin is present.<\/li>\n<li><strong>Get help with this order<\/strong> \u2014 a message form that reaches you with the order\nnumber, status and items already attached. This is also where a customer's\nreturn request arrives today; see the FAQ below for what is and is not\nincluded.<\/li>\n<li>Each action can be switched off, and switching one off removes it from the page\n<strong>and<\/strong> refuses it at the API.<\/li>\n<\/ul>\n\n<p><strong>Merchant request queue<\/strong><\/p>\n\n<ul>\n<li><strong>One queue<\/strong> under WooCommerce, with a count in the menu of everything waiting\non you.<\/li>\n<li><strong>Approve or decline<\/strong> with an internal note the customer never sees.<\/li>\n<li><strong>Optional restocking<\/strong> when you approve a cancellation.<\/li>\n<li><strong>Rules you set<\/strong> \u2014 which statuses are cancellable, how many times one order\nmay be the subject of a request, how long a customer waits before asking again,\nand the response time you promise them.<\/li>\n<li><strong>Requests show on the order screen<\/strong> too, so you are never surprised by one\nyou did not know about.<\/li>\n<\/ul>\n\n<p><strong>Guest order lookup<\/strong><\/p>\n\n<ul>\n<li><strong>For customers who checked out without an account<\/strong>, off until you switch it\non deliberately.<\/li>\n<li><strong>Nothing is revealed by guessing.<\/strong> The form emails a signed link to the\naddress already on the order \u2014 never to the address typed into the form.<\/li>\n<li><strong>Rate limited<\/strong>, with a link lifetime you control.<\/li>\n<\/ul>\n\n<p><strong>Setup and configuration<\/strong><\/p>\n\n<ul>\n<li><strong>A setup wizard<\/strong> that asks what you need and skips what you do not. Nothing\nreaches your storefront until you finish it \u2014 activating the plugin changes\nnothing on its own.<\/li>\n<li><strong>A settings screen organised into cards<\/strong>, with a search box that filters as\nyou type.<\/li>\n<li><strong>A status panel<\/strong> that says plainly whether everything is working, and what to\ndo when it is not.<\/li>\n<\/ul>\n\n<p><strong>Placement for developers and site builders<\/strong><\/p>\n\n<ul>\n<li><strong>Shortcode<\/strong> \u2014 <code>[wpmphub_orders]<\/code> renders the timeline view on any page.<\/li>\n<li><strong>Shortcode<\/strong> \u2014 <code>[wpmphub_order_lookup]<\/code> renders the guest lookup form.<\/li>\n<li><strong>Block<\/strong> \u2014 an Order timeline block for the block editor.<\/li>\n<li><strong>WP-CLI<\/strong> \u2014 <code>wp wpmphub backfill-timeline<\/code> fills in what can be derived for\norders placed before you installed the plugin.<\/li>\n<li><strong>Filters throughout<\/strong>, including the stage map, action availability, tracking\ndetection and invoice sources.<\/li>\n<li><strong>High-Performance Order Storage and legacy post storage<\/strong> both supported, and\nthe test suite runs against both.<\/li>\n<\/ul>\n\n<h4>What this plugin deliberately does not do<\/h4>\n\n<p>Being plain about the edges matters more than a longer feature list.<\/p>\n\n<ul>\n<li><strong>It is not a carrier integration.<\/strong> It opens no account with a shipping API,\nbuys no labels and fetches no carrier scans. WooCommerce order tracking here\nmeans showing the customer where their order stands in <em>your<\/em> process, and\nstanding aside the moment a real tracking number exists.<\/li>\n<li><strong>It has no RMA workflow yet.<\/strong> There is no returns portal, no return merchandise\nauthorisation number and no return label. A return request reaches you through\nthe help form as an ordinary message.<\/li>\n<li><strong>It never issues a refund<\/strong>, and never touches a payment gateway. Approving a\ncancellation changes the order status and optionally restocks; refunding stays\nin WooCommerce, one click away on the order itself.<\/li>\n<li><strong>It never cancels an order by itself.<\/strong> A cancellation is always a request a\nhuman approves.<\/li>\n<li><strong>It does not create tracking numbers.<\/strong> It reads what your tracking plugin\nalready stores. With no tracking plugin there is nothing to show, so it shows an\nestimated delivery date instead and says so.<\/li>\n<li><strong>It generates no PDFs.<\/strong> The invoice action links to what another plugin\nproduced.<\/li>\n<li><strong>It does not replace your theme's order pages<\/strong> unless you turn that on \u2014 and\nit refuses to turn on while your theme already customises those templates,\nrather than producing a broken page.<\/li>\n<\/ul>\n\n<h4>No monthly fee, no outbound requests, no data sharing<\/h4>\n\n<p>There is no subscription, no per-order pricing and no usage tier. This plugin\nmakes <strong>no outbound HTTP requests of any kind<\/strong>. No telemetry, no update pings,\nno remote fonts or images, no analytics. Nothing about your store or your\ncustomers leaves your server, because nothing is ever sent anywhere.<\/p>\n\n<p>Order data is read and written only through WooCommerce's own CRUD layer, and the\nplugin never writes to another plugin's data.<\/p>\n\n<h4>Source code and build tools<\/h4>\n\n<p>The plugin is GPL, and everything it ships can be read and rebuilt. The zip\ncontains the unminified source of every compiled asset alongside the compiled\nfiles themselves:<\/p>\n\n<ul>\n<li><code>assets\/src\/<\/code> \u2014 the JavaScript and SCSS sources for every bundle in\n  assets\/build\/, including the setup wizard's React app.<\/li>\n<li><code>webpack.config.js<\/code> and <code>package.json<\/code> \u2014 the build configuration and the\nscript that runs it.<\/li>\n<\/ul>\n\n<p>To rebuild the compiled assets from the sources in the zip:<\/p>\n\n<pre><code>npm install &amp;&amp; npm run build\n<\/code><\/pre>\n\n<p>The build uses <a href=\"https:\/\/www.npmjs.com\/package\/@wordpress\/scripts\">@wordpress\/scripts<\/a>,\nWordPress's own webpack configuration, and no other bundler. Nothing is\nobfuscated, and no compiled file has a source that is not in the zip.<\/p>\n\n<p>Development happens at https:\/\/github.com\/wpmake22\/post-purchase-hub, where the\nPHP source, the test suites and the release script live as well.<\/p>\n\n<p>Install it, spend two minutes in the wizard, and stop answering the same email.<\/p>\n\n<!--section=installation-->\n<p><strong>From your WordPress dashboard<\/strong><\/p>\n\n<ol>\n<li>Go to <strong>Plugins \u2192 Add New<\/strong> and search for \"Post-Purchase Hub\".<\/li>\n<li>Click <strong>Install Now<\/strong>, then <strong>Activate<\/strong>.<\/li>\n<\/ol>\n\n<p><strong>Uploading the zip<\/strong><\/p>\n\n<ol>\n<li>Go to <strong>Plugins \u2192 Add New \u2192 Upload Plugin<\/strong> and choose the zip file.<\/li>\n<li>Click <strong>Install Now<\/strong>, then <strong>Activate<\/strong>.<\/li>\n<\/ol>\n\n<p><strong>After activating<\/strong><\/p>\n\n<p>WooCommerce must be active first \u2014 the plugin will not activate without it.<\/p>\n\n<p>Activating changes nothing on your storefront. A notice appears pointing at the\nsetup wizard, and until you finish it your customers see exactly what they saw\nbefore.<\/p>\n\n<ol>\n<li>Click <strong>Run the setup wizard<\/strong>, or go to <strong>WooCommerce \u2192 Post-Purchase Hub\n\u2192 Settings<\/strong> and start it from there.<\/li>\n<li>Choose what you want to set up first. Every question can be skipped, and a\nskipped question keeps a sensible default you can change later.<\/li>\n<li>Map your order statuses onto the stages customers will see.<\/li>\n<li>Set your handling time, and the transit time of each shipping method if you\nwant delivery estimates.<\/li>\n<li>Choose which self-service actions customers get.<\/li>\n<li>Choose whether the plugin adds to your order pages or replaces them. Additive\nis the safe default.<\/li>\n<li>Press <strong>Finish and go live<\/strong>. That is the moment your customers start seeing\ntheir timelines.<\/li>\n<\/ol>\n\n<p><strong>Optional<\/strong><\/p>\n\n<ul>\n<li>To offer guest order lookup, enable it under <strong>Settings \u2192 Guest Access<\/strong>, then\nadd <code>[wpmphub_order_lookup]<\/code> to a page and link it from your footer or your order\nemails.<\/li>\n<li>To place the timeline somewhere of your own, use the <code>[wpmphub_orders]<\/code> shortcode\nor the Order timeline block.<\/li>\n<\/ul>\n\n<!--section=faq-->\n<dl>\n<dt id=\"what%20data%20does%20the%20plugin%20collect%3F\"><h3>What data does the plugin collect?<\/h3><\/dt>\n<dd><p>Nothing, unless you opt in. On activation you are asked once whether to share usage data. If you skip that screen, or never answer it, the plugin sends nothing at all and every feature works exactly the same \u2014 none of it is gated on opting in.<\/p>\n\n<p>If you do opt in, the following is shared with WPMake through Freemius:<\/p>\n\n<ul>\n<li>Your WordPress user's first name, last name and email address<\/li>\n<li>Your site's homepage URL and title, WordPress version, PHP version and site language<\/li>\n<li>This plugin's version, the Freemius SDK version, and whether it is active or uninstalled<\/li>\n<li>The names, slugs and versions of your other plugins and themes, and whether each is active<\/li>\n<\/ul>\n\n<p>The last three groups are optional and can be switched off individually on the opt-in screen before you accept. If you deactivate the plugin you are offered a short form asking why \u2014 answering it is optional, and you can close it and deactivate without saying anything.<\/p>\n\n<p>You can withdraw consent at any time by deactivating the plugin. To switch the whole integration off in code, so no opt-in is ever shown:<\/p>\n\n<pre><code>add_filter( 'wpmphub_enable_freemius', '__return_false' );\n<\/code><\/pre><\/dd>\n<dt id=\"how%20do%20i%20turn%20off%20the%20review%20request%20notice%3F\"><h3>How do I turn off the review request notice?<\/h3><\/dt>\n<dd><p>The notice appears once the plugin has been active for a week, on the Dashboard and the plugin's own settings screen only, and only for administrators once the store has received at least one request. \"Don't ask again\" removes it for good, and each administrator answers for themselves. To switch it off in code for everyone \u2014 useful on client stores \u2014 drop this in a plugin or your theme's functions.php:<\/p>\n\n<pre><code>add_filter( 'wpmphub_show_review_notice', '__return_false' );\n<\/code><\/pre><\/dd>\n<dt id=\"how%20do%20i%20add%20woocommerce%20order%20tracking%20to%20the%20my%20account%20page%3F\"><h3>How do I add WooCommerce order tracking to the my account page?<\/h3><\/dt>\n<dd><p>Install the plugin, run the setup wizard, and map your order statuses onto the\nstages you want customers to see. From then on every order shows an order status\ntimeline on the my account page and on the single order page, and the My Account\norder list gains a Progress column. You do not have to edit a template or place a\nshortcode, though a <code>[wpmphub_orders]<\/code> shortcode and a block are there if you want\nthe timeline somewhere else.<\/p><\/dd>\n<dt id=\"do%20i%20need%20a%20carrier%20account%20or%20a%20paid%20tracking%20service%3F\"><h3>Do I need a carrier account or a paid tracking service?<\/h3><\/dt>\n<dd><p>No. This plugin is not a carrier integration and has no monthly fee. Without a\ntracking plugin, customers see an estimated delivery date worked out from your\nhandling and transit times, which is the honest answer rather than a fabricated\ntracking number. If you do have a tracking plugin, its real tracking data replaces\nthe estimate automatically and you do not have to do anything.<\/p><\/dd>\n<dt id=\"can%20customers%20cancel%20an%20order%20themselves%3F\"><h3>Can customers cancel an order themselves?<\/h3><\/dt>\n<dd><p>They can ask to. A <strong>cancel order<\/strong> button appears on their order while the order\nis in a status you allow, and pressing it creates a request in your queue with the\nreason and note they gave. Nothing happens to the order until you approve it. If\nyou decline, the order is left exactly as it was.<\/p><\/dd>\n<dt id=\"can%20customers%20submit%20a%20return%20request%3F\"><h3>Can customers submit a return request?<\/h3><\/dt>\n<dd><p>Not through a dedicated returns portal \u2014 this plugin has no RMA workflow, no\nreturn authorisation numbers and no return labels. A customer wanting a return\nuses the <strong>Get help with this order<\/strong> form, and the return request arrives in your\nrequest queue with the order number, status and items already attached, so you can\nanswer it in one place with everything in front of you.<\/p><\/dd>\n<dt id=\"can%20customers%20reorder%20a%20past%20order%3F\"><h3>Can customers reorder a past order?<\/h3><\/dt>\n<dd><p>Yes. The reorder button re-adds a past order's items to the cart, and shows a\nconfirmation screen first listing anything that changed since they bought \u2014 what\nis out of stock, what no longer exists and what now costs more \u2014 rather than\nsilently building a different basket.<\/p><\/dd>\n<dt id=\"how%20is%20the%20estimated%20delivery%20date%20calculated%3F\"><h3>How is the estimated delivery date calculated?<\/h3><\/dt>\n<dd><p>From your handling time in business days plus the transit time range you set on\neach shipping method, with your weekends and holidays excluded. Customers see a\nrange \u2014 \"arrives between the 26th and the 28th\" \u2014 rather than a single date that\nwill sometimes be wrong.<\/p><\/dd>\n<dt id=\"why%20is%20no%20estimated%20delivery%20date%20showing%3F\"><h3>Why is no estimated delivery date showing?<\/h3><\/dt>\n<dd><p>Almost always because the shipping method on that order has no transit time set.\nA method with no transit time configured shows no estimate at all \u2014 a deliberate\nblank rather than a guess. Set it under <strong>Settings \u2192 Timeline \u2192 Delivery\nestimates<\/strong>.<\/p><\/dd>\n<dt id=\"why%20does%20an%20old%20order%20have%20no%20dates%20on%20its%20order%20status%20timeline%3F\"><h3>Why does an old order have no dates on its order status timeline?<\/h3><\/dt>\n<dd><p>WooCommerce does not keep a history of status changes, so a plugin can only\nrecord them from the moment it is installed. Older orders show their stages\nwithout dates rather than showing invented ones. <code>wp wpmphub backfill-timeline<\/code> fills\nin what can be derived from the dates WooCommerce does store.<\/p><\/dd>\n<dt id=\"will%20this%20break%20my%20theme%27s%20my%20account%20page%3F\"><h3>Will this break my theme's my account page?<\/h3><\/dt>\n<dd><p>It is designed not to. The default mode adds sections through WooCommerce's own\nhooks and leaves your templates alone. Full template replacement is opt-in, and\nthe plugin checks first whether your theme has customised those templates \u2014 if it\nhas, replacement stays off rather than producing a broken page.<\/p><\/dd>\n<dt id=\"does%20it%20issue%20refunds%3F\"><h3>Does it issue refunds?<\/h3><\/dt>\n<dd><p>No. Approving a cancellation changes the order status and optionally returns the\nitems to stock. Refunding is done in WooCommerce, on the order itself. This\nplugin never touches a payment gateway.<\/p><\/dd>\n<dt id=\"can%20guests%20track%20an%20order%20without%20an%20account%3F\"><h3>Can guests track an order without an account?<\/h3><\/dt>\n<dd><p>Only if you enable guest order lookup, which is off by default. When it is on, a\ncustomer enters their order number and billing email and the plugin emails a\nsigned link to the address <strong>already on the order<\/strong> \u2014 never to the address typed\ninto the form. Guessing an order number therefore reveals nothing.<\/p><\/dd>\n<dt id=\"why%20can%20one%20of%20my%20customers%20not%20request%20a%20cancellation%3F\"><h3>Why can one of my customers not request a cancellation?<\/h3><\/dt>\n<dd><p>The button is hidden, correctly, when the order is not in one of your cancellable\nstatuses, when a request is already pending on it, when the order has hit its\nper-order request limit or is inside the waiting period, or when you have switched\nthe action off.<\/p><\/dd>\n<dt id=\"where%20do%20i%20change%20the%20emails%20this%20plugin%20sends%3F\"><h3>Where do I change the emails this plugin sends?<\/h3><\/dt>\n<dd><p>With all your other WooCommerce emails, at <strong>WooCommerce \u2192 Settings \u2192 Emails<\/strong>.\nThey are ordinary WooCommerce emails, so they inherit the header, footer and\ncolours you have already set, and there is one place to change them rather than\ntwo.<\/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. All order data is read and written through WooCommerce's CRUD layer, and the\ntest suite runs against both HPOS and legacy post storage.<\/p><\/dd>\n<dt id=\"what%20happens%20to%20my%20data%20if%20i%20delete%20the%20plugin%3F\"><h3>What happens to my data if I delete the plugin?<\/h3><\/dt>\n<dd><p>Nothing is deleted unless you ask for it. Deleting the plugin leaves your settings\nand request history in place, so reinstalling picks up where you left off. If you\nwould rather it cleaned up after itself, switch on <strong>Delete all data when\nuninstalling<\/strong> under <strong>Settings \u2192 Advanced<\/strong> first.<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.1.0    - 06\/09\/2026<\/h4>\n\n<ul>\n<li>Added opt-in usage tracking and a deactivation feedback form, through Freemius. Nothing is transmitted unless you accept the opt-in screen shown once on activation; skipping it leaves every feature working, and <code>add_filter( 'wpmphub_enable_freemius', '__return_false' )<\/code> removes the integration entirely. The FAQ lists exactly what is shared.<\/li>\n<li>Added a review request notice for administrators, on the Dashboard and this plugin's settings screen only, once the plugin has been active for seven days and the store has handled at least one request. \"Don't ask again\" is permanent and answered per administrator, and <code>add_filter( 'wpmphub_show_review_notice', '__return_false' )<\/code> switches it off for everyone.<\/li>\n<li>Replaced the two WooCommerce submenu entries with a single entry named after the plugin, carrying a count of the requests waiting on you, and a navigation bar shared by the request queue and the settings screen.<\/li>\n<li>Added a sidebar beside the settings screen with documentation, blog and support links, and cards for other WPMake plugins. Every entry is a plain link; nothing is fetched from wpmake.net unless you click one.<\/li>\n<li>Restyled the navigation bar and the request queue table.<\/li>\n<li>Rewrote readme.txt around what customers search for, and said plainly in the description that this is not a carrier integration and carries no monthly fee.<\/li>\n<\/ul>\n\n<h4>1.0.0    - 31\/08\/2026<\/h4>\n\n<ul>\n<li>First public release.<\/li>\n<li>Order progress timeline on My Account and single order pages, built from status changes recorded as they happen.<\/li>\n<li>Timeline stages mapped from the order statuses your store actually uses, with any status hideable from customers.<\/li>\n<li>Delivery estimates from your handling time and per-shipping-method transit times, excluding your non-working days and holidays.<\/li>\n<li>Real tracking data replaces the estimate automatically wherever a supported tracking plugin provides it.<\/li>\n<li>Self-service actions on the customer's order page: request cancellation, buy the order again, view an invoice, and get help.<\/li>\n<li>Cancellation requests arrive in a merchant queue to approve or decline, with optional restocking on approval.<\/li>\n<li>Guest order lookup, off by default, sending a signed link to the billing address already on the order.<\/li>\n<li>Setup wizard that keeps the storefront unchanged until it is finished.<\/li>\n<li><code>[wpmphub_orders]<\/code> shortcode and an Order timeline block.<\/li>\n<li><code>wp wpmphub backfill-timeline<\/code> for orders placed before installation.<\/li>\n<li>Works with both High-Performance Order Storage and legacy post storage.<\/li>\n<\/ul>","raw_excerpt":"Customer self-service order tracking, cancel order, reorder and an order status timeline on the my account page. No carrier account needed.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/359415","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=359415"}],"author":[{"embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/wpmakedev"}],"wp:attachment":[{"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=359415"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=359415"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=359415"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=359415"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=359415"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/ky.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=359415"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}