{"id":853,"date":"2026-05-12T05:04:31","date_gmt":"2026-05-12T05:04:31","guid":{"rendered":"https:\/\/quickshipd.com\/blog\/?p=853"},"modified":"2026-09-03T10:10:52","modified_gmt":"2026-09-03T10:10:52","slug":"different-delivery-times-shipping-methods-woocommerce","status":"publish","type":"post","link":"https:\/\/quickshipd.com\/blog\/different-delivery-times-shipping-methods-woocommerce\/","title":{"rendered":"WooCommerce Delivery Options: The Complete Guide (2026)"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Configuring accurate <strong>WooCommerce delivery options<\/strong> for each shipping method \u2014 including express delivery \u2014 starts here. This is one of the most common questions from store owners who offer more than one shipping option: free standard shipping, express, local pickup, and so on.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Each one has a different transit time. Showing the same delivery estimate for all of them is misleading.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The short answer: yes, it&#8217;s possible &#8211; but how you do it depends on the tool you&#8217;re using. There are two routes. You can map each shipping method to its own delivery window in a short <code>functions.php<\/code> snippet, which costs nothing and gives you complete control. Or you can use a plugin and skip the maintenance. This guide covers both \u2014 the code method first, because you should know what you are replacing before you install anything.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">This is the complete rundown: every delivery option WooCommerce and its plugins give you, how a delivery estimate is actually calculated, and the exact settings for methods, zones, per-product times, order cutoffs, and non-delivery days \u2014 with both the code and the plugin path.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What delivery options can you offer in a WooCommerce store?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;Delivery options&#8221; covers two separable things, and conflating them causes most of the confusion around this topic. The first is the set of <strong>shipping methods<\/strong> a customer can choose at checkout. The second is the <strong>delivery timing information<\/strong> you display for each of those methods. WooCommerce gives you the first out of the box and none of the second \u2014 a shipping method tells the customer what they are paying, never when the parcel arrives. Everything below is a method; the estimate attached to it is something you add.<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Flat rate with a delivery window.<\/strong> The workhorse: a fixed charge with a standard transit time attached, typically 3-5 business days. Most stores start and end here.<\/li>\n\n<li><strong>Free shipping with a longer window.<\/strong> Free shipping is usually the cheapest, slowest service you buy, so give it a longer estimate than paid standard \u2014 5-7 business days against 3-5. If free and paid standard show the same date, you have removed the reason to pay.<\/li>\n\n<li><strong>Express or priority.<\/strong> In WooCommerce this is simply a second flat rate instance with a higher cost. It needs a visibly shorter window \u2014 1-2 business days \u2014 or the upgrade has nothing to sell.<\/li>\n\n<li><strong>Local pickup.<\/strong> No delivery date applies, because nothing is in transit. Frame it as readiness instead: &#8220;Ready for collection in 24 hours.&#8221;<\/li>\n\n<li><strong>Local delivery.<\/strong> Your own driver inside a defined radius, usually a same-day or next-day promise. Because you control the vehicle, this is the one estimate you can state with confidence.<\/li>\n\n<li><strong>Customer-selected date or time slot.<\/strong> Not a core WooCommerce feature \u2014 it needs a date-picker plugin. It also inverts the relationship: instead of you estimating, the customer commits you to a date you then have to hit.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">The first five are configured under WooCommerce \u2192 Settings \u2192 Shipping, one zone at a time, and each is independent of the others. The timing text that sits beside them is what the rest of this guide covers.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">How a Delivery Estimate Is Actually Calculated<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Before configuring anything, it helps to know what actually goes into the number you&#8217;re about to display. An accurate delivery estimate is built from four inputs, not one:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Processing time<\/strong> \u2014 how long it takes you to pack and hand the order to a carrier, starting from the moment it&#8217;s placed.<\/li>\n\n<li><strong>Order cutoff time<\/strong> \u2014 the point in the day after which an order rolls over to the next business day&#8217;s processing, rather than counting as placed &#8220;today.&#8221;<\/li>\n\n<li><strong>Carrier transit time<\/strong> \u2014 how long the shipping method itself takes once the parcel is actually collected.<\/li>\n\n<li><strong>Non-delivery days<\/strong> \u2014 weekends and holidays your store or carrier doesn&#8217;t move parcels on, excluded from the count rather than silently absorbed into it.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Leave any one of these out and the estimate drifts optimistic. The most common mistake is counting only carrier transit time and ignoring processing time entirely \u2014 that&#8217;s how a &#8220;3-5 day&#8221; promise quietly turns into a 6-7 day reality once packing time and a missed cutoff are factored in. The next two sections cover the two inputs stores most often get wrong: the cutoff time and non-delivery days. For the full mechanics of how these combine into a single date, see our guide to <a href=\"https:\/\/quickshipd.com\/blog\/what-is-an-estimated-delivery-date-guide\/\">what an estimated delivery date actually means<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Why Different Shipping Methods Need Different Estimates<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">When a customer chooses express shipping, they&#8217;re paying for speed. If your store shows the same &#8216;Get it in 5\u20137 days&#8217; estimate for both standard and express options, one of two things happens.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Either the customer wonders why they&#8217;re paying more for express, or they feel misled when express doesn&#8217;t arrive noticeably faster than your estimate promised.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Accurate per-method estimates help customers make an informed choice. They also reduce post-purchase complaints from customers who expected faster delivery and didn&#8217;t get it.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Setting different delivery times per shipping method in code<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This is the no-plugin route. Add the following to your <strong>child theme&#8217;s<\/strong> <code>functions.php<\/code> (never the parent theme \u2014 a theme update will wipe it) or to a code snippets plugin. It keeps a simple map of shipping method to delivery window and prints the matching window next to each method label at cart and checkout.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code>&lt;?php\n\/**\n * Map each shipping method to its own delivery window and show it\n * next to the method label at cart and checkout.\n *\/\nadd_filter( 'woocommerce_cart_shipping_method_full_label', 'qsd_method_eta', 10, 2 );\n\nfunction qsd_method_eta( $label, $method ) {\n\n\t$windows = array(\n\t\t'flat_rate'        =&gt; '3-5 business days',\n\t\t'free_shipping'    =&gt; '5-7 business days',\n\t\t'local_pickup'     =&gt; 'Ready in 24 hours',\n\t\t'flat_rate:2'      =&gt; '1-2 business days', \/\/ A specific instance ID.\n\t);\n\n\t\/\/ Instance-specific match wins over the general method match.\n\t$key = isset( $windows[ $method-&gt;get_id() ] )\n\t\t? $method-&gt;get_id()\n\t\t: $method-&gt;get_method_id();\n\n\tif ( empty( $windows[ $key ] ) ) {\n\t\treturn $label;\n\t}\n\n\treturn $label . sprintf(\n\t\t'&lt;small class=\"qsd-method-eta\"&gt;%s&lt;\/small&gt;',\n\t\tesc_html( $windows[ $key ] )\n\t);\n}<\/code><\/pre>\n\n\n\n<p class=\"wp-block-paragraph\">A few things worth understanding about this snippet:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong><code>get_method_id()<\/code> and <code>get_id()<\/code> are not the same thing.<\/strong> <code>get_method_id()<\/code> returns the method <em>type<\/em> \u2014 <code>flat_rate<\/code>, <code>free_shipping<\/code>, <code>local_pickup<\/code>. <code>get_id()<\/code> returns the specific instance, like <code>flat_rate:2<\/code>. That distinction is the whole key to per-zone control: the type is shared, the instance is not.<\/li>\n\n\n\n<li><strong>You find instance IDs in WooCommerce \u2192 Settings \u2192 Shipping.<\/strong> Open a zone, hover over a shipping method&#8217;s name, and read the number at the end of the edit link in your browser&#8217;s status bar \u2014 that is the instance ID. Combine it with the method type and you have the key to use in the array, such as <code>flat_rate:2<\/code>.<\/li>\n\n\n\n<li><strong>The same Flat rate method in two zones has two different instance IDs.<\/strong> Add Flat rate to your domestic zone and Flat rate again to your international zone and WooCommerce creates two independent instances. That is exactly how you give Zone A a 1-2 day window and Zone B a 10-day window \u2014 same method type, two array keys.<\/li>\n\n\n\n<li><strong>The lookup order matters.<\/strong> The snippet checks the instance ID first and only falls back to the method type. So <code>flat_rate<\/code> acts as your catch-all default for every flat rate instance you have not listed explicitly, and any instance you do list overrides it.<\/li>\n<\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">One caveat worth checking on your own store: <code>woocommerce_cart_shipping_method_full_label<\/code> is a classic-template filter. The Cart and Checkout blocks build their shipping options through the Store API rather than through this label filter, so verify the output on a block-based checkout rather than assuming it carries over.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">What about different delivery times per shipping zone?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">This is the most common follow-up question, and the answer is already sitting in the snippet above \u2014 it just is not obvious until you understand how WooCommerce structures zones.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Shipping zones are not a layer sitting on top of shipping methods. They <em>contain<\/em> them. When you add Flat rate to your Domestic zone and then add Flat rate again to your International zone, you have not created one method used in two places. You have created two separate method instances, each with its own settings, its own cost, and its own instance ID. That is why instance IDs are inherently zone-specific.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">So the domestic Flat rate might be <code>flat_rate:3<\/code> while the international one is <code>flat_rate:7<\/code>. Both return <code>flat_rate<\/code> from <code>get_method_id()<\/code>, which is why a map keyed on the method type alone can never tell them apart. Keyed on the instance ID, they are simply two different rows in the <code>$windows<\/code> array.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">To show a 2-day window for a domestic zone and a 10-day window for an international one using the same Flat rate method, you do not need a second plugin or a duplicate shipping method. You look up both instance IDs under WooCommerce \u2192 Settings \u2192 Shipping, add both as keys, and give each its own window. WooCommerce only offers a customer the rates belonging to the zone their address falls into, so each shopper sees exactly one estimate \u2014 the one that matches where the parcel is actually going.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">The Per-Product Override Approach<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Sometimes the variation isn&#8217;t about shipping method at all \u2014 it&#8217;s about product type. Handmade items take longer to dispatch than stock items, for example. In that case, the cleanest solution is per-product delivery day overrides.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">QuickShipD handles this at the product level. Inside any WooCommerce product, under the Shipping tab, there&#8217;s a QuickShipD section where you can set a minimum and maximum delivery days override specific to that product. This overrides the global settings for that product only. So a made-to-order item can show 7\u201310 days while a stock item shows 3\u20135, all from the same plugin configuration.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Setting Global Defaults That Reflect Your Primary Method<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">For most small WooCommerce stores with one main shipping method, the best approach is to configure your global delivery days to match your standard shipping transit time, then use per-product overrides for anything that deviates.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">In QuickShipD&#8217;s Delivery tab, set your Minimum and Maximum delivery days to match your standard carrier&#8217;s typical transit window.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"562\" src=\"https:\/\/quickshipd.com\/blog\/wp-content\/uploads\/2026\/04\/delivery-tab-1024x562.png\" alt=\"QuickShipD Delivery tab in the WordPress plugin settings\" class=\"wp-image-736\" srcset=\"https:\/\/quickshipd.com\/blog\/wp-content\/uploads\/2026\/04\/delivery-tab-1024x562.png 1024w, https:\/\/quickshipd.com\/blog\/wp-content\/uploads\/2026\/04\/delivery-tab-600x329.png 600w, https:\/\/quickshipd.com\/blog\/wp-content\/uploads\/2026\/04\/delivery-tab-300x165.png 300w, https:\/\/quickshipd.com\/blog\/wp-content\/uploads\/2026\/04\/delivery-tab-768x422.png 768w, https:\/\/quickshipd.com\/blog\/wp-content\/uploads\/2026\/04\/delivery-tab.png 1275w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Setting Your Order Cutoff Time<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">The cutoff time decides which day an order counts as &#8220;day zero&#8221; for processing. An order placed at 9am and one placed at 9pm the same day don&#8217;t deserve the same estimate if your warehouse stops packing at 4pm \u2014 the second one hasn&#8217;t actually started processing until the next business day, whatever the calendar date says.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Set this to match when your team actually stops fulfilling orders for the day, not an aspirational time. Add your cutoff in QuickShipD&#8217;s Delivery tab: any order placed after it automatically rolls into the next business day&#8217;s processing window, so the displayed estimate stays accurate without you touching it per order.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"439\" src=\"https:\/\/quickshipd.com\/blog\/wp-content\/uploads\/2026\/04\/order-cutoff-time-1024x439.png\" alt=\"QuickShipD order cutoff time setting in the plugin dashboard\" class=\"wp-image-729\" srcset=\"https:\/\/quickshipd.com\/blog\/wp-content\/uploads\/2026\/04\/order-cutoff-time-1024x439.png 1024w, https:\/\/quickshipd.com\/blog\/wp-content\/uploads\/2026\/04\/order-cutoff-time-600x257.png 600w, https:\/\/quickshipd.com\/blog\/wp-content\/uploads\/2026\/04\/order-cutoff-time-300x129.png 300w, https:\/\/quickshipd.com\/blog\/wp-content\/uploads\/2026\/04\/order-cutoff-time-768x329.png 768w, https:\/\/quickshipd.com\/blog\/wp-content\/uploads\/2026\/04\/order-cutoff-time-1536x658.png 1536w, https:\/\/quickshipd.com\/blog\/wp-content\/uploads\/2026\/04\/order-cutoff-time.png 1787w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">Excluding Weekends and Holidays<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">A &#8220;3-5 business day&#8221; estimate that silently counts Saturday and Sunday as transit days isn&#8217;t a 3-5 day estimate at all \u2014 it&#8217;s shorter than what you&#8217;ll actually deliver, every single week. The same applies to public holidays: a delivery window that spans a holiday your carrier doesn&#8217;t run on will land late unless the holiday is excluded from the count in advance.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Toggle on &#8220;Exclude weekends&#8221; in the Delivery tab if you don&#8217;t ship on Saturdays and Sundays, and add known public holidays to the Holidays field ahead of time \u2014 ideally at the start of each quarter, not the week before. Once a holiday is listed, QuickShipD skips it automatically in every estimate that would otherwise span it, every year it recurs.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"447\" src=\"https:\/\/quickshipd.com\/blog\/wp-content\/uploads\/2026\/04\/holidays-1024x447.png\" alt=\"QuickShipD holiday exclusion dates settings screen\" class=\"wp-image-730\" srcset=\"https:\/\/quickshipd.com\/blog\/wp-content\/uploads\/2026\/04\/holidays-1024x447.png 1024w, https:\/\/quickshipd.com\/blog\/wp-content\/uploads\/2026\/04\/holidays-600x262.png 600w, https:\/\/quickshipd.com\/blog\/wp-content\/uploads\/2026\/04\/holidays-300x131.png 300w, https:\/\/quickshipd.com\/blog\/wp-content\/uploads\/2026\/04\/holidays-768x335.png 768w, https:\/\/quickshipd.com\/blog\/wp-content\/uploads\/2026\/04\/holidays-1536x671.png 1536w, https:\/\/quickshipd.com\/blog\/wp-content\/uploads\/2026\/04\/holidays.png 1773w\" sizes=\"auto, (max-width: 1024px) 100vw, 1024px\" \/><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\">What If You Genuinely Need Method-Specific Estimates?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">If you want to show different delivery windows based on which shipping method the customer selects at checkout \u2014 Standard showing 5\u20137 days, Express showing 1\u20132 days \u2014 the snippet above is the simplest way to do it. It&#8217;s yours to maintain, though.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you&#8217;d rather not carry that maintenance, look for a plugin that hooks into WooCommerce shipping zones and rates directly and handles <a href=\"https:\/\/quickshipd.com\/estimated-delivery-date\/\">per-shipping-method delivery estimates<\/a> for you. Your shipping carrier&#8217;s own rate calculator is another option \u2014 it often includes transit time data too.<\/p>\n\n\n\n<figure class=\"wp-block-table\"><table class=\"has-fixed-layout\"><tbody><tr><td><strong>PRO TIP<\/strong> If you offer express shipping, consider setting your product-level override to match your express transit time and displaying that as the estimate when express is selected. Even if the plugin doesn&#8217;t switch estimates dynamically based on method selection, showing the fastest possible delivery option upfront \u2014 and noting standard takes longer \u2014 is often enough to set accurate expectations.<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">For most stores, the combination of global defaults and per-product overrides covers 90% of use cases without needing complex per-method logic.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Shipping Times &amp; Express Delivery Options, Explained<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Standard, express, and local pickup are not just price tiers \u2014 they&#8217;re different delivery options with different transit windows. If you offer an <strong>express shipping option<\/strong>, it should show a visibly shorter, separately calculated estimate rather than reusing your standard delivery window. Customers comparing shipping options at checkout use that time difference to decide whether the express upgrade is worth paying for.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Frequently asked questions<\/h2>\n\n\n\n<h3 class=\"wp-block-heading\">How do I find a shipping method&#8217;s instance ID?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Go to WooCommerce \u2192 Settings \u2192 Shipping and open the zone the method belongs to. Hover over the method name and look at the edit link \u2014 it ends in a number, and that number is the instance ID. A Flat rate with instance ID 2 is referenced in code as <code>flat_rate:2<\/code>.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Can I give the same shipping method a different delivery time in each zone?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Yes. Because each zone holds its own instance of the method, the same Flat rate added to two zones produces two different instance IDs. Key your delivery windows on the instance ID rather than the method type and each zone gets its own estimate \u2014 a short domestic window and a long international one, from one method type.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">What happens to methods I have not listed in the array?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Nothing. The snippet returns the original label untouched when there is no match, so an unlisted method simply displays as WooCommerce normally renders it. Listing a bare method type such as <code>flat_rate<\/code> gives you a catch-all default for every flat rate instance you have not named explicitly.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Should I use per-product overrides or per-method windows?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">It depends on where the delay actually comes from. If the variation is in how long <em>you<\/em> take to dispatch \u2014 made-to-order versus stock \u2014 use per-product overrides. If the variation is in how long the <em>carrier<\/em> takes \u2014 express versus standard, domestic versus international \u2014 use per-method or per-instance windows. Many stores end up using both.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Can I offer shipping and local pickup with different delivery dates?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Yes, and the mechanism is exactly the same one used for everything else. Local pickup is a shipping method like any other: you add it to a zone, WooCommerce gives it its own instance ID such as <code>local_pickup:5<\/code>, and it takes its own entry in the <code>$windows<\/code> array alongside flat rate and free shipping. Nothing special is required to give it a different window.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">What should change is the wording. A pickup is not a delivery: nothing is in transit, and no carrier is involved. A delivery date is the wrong frame, and it invites the wrong question at the counter.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">&#8220;Ready for collection in 24 hours&#8221; tells the customer the only thing that matters to them: when the order will be waiting.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">If you run two collection points, add local pickup twice \u2014 once per zone or once per location. Each instance gets its own readiness window and its own wording.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Can I set a different delivery time per product rather than per method?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Yes, and it answers a different question from a per-method window. A per-product delivery time is a <strong>lead time<\/strong>: a custom field on the product, stored in post meta and edited under the product&#8217;s Shipping tab, holding the number of days it takes you to get that item out of the door. A made-to-order item gets 7, a stock item gets 0. It describes your workshop, not the carrier.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The two do not compete \u2014 they compose. The total estimate is <strong>product lead time + method transit time<\/strong>. A made-to-order item with a 7-day lead time on a 2-day express method is a 9-day estimate; the same item on a 5-day free shipping method is 12. That is also why per-product alone is not enough once you offer express: the lead time is identical whichever method the customer picks, so only the transit half changes. When a cart holds several items, take the <em>highest<\/em> lead time in the cart rather than the sum \u2014 the order ships once, when the slowest item is ready.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Why do my delivery times not update when the customer changes shipping method?<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">There are two causes and they need different fixes. The first is that the estimate was rendered once and never re-rendered.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Selecting a different shipping method in the classic cart or checkout triggers an AJAX refresh of the shipping and totals area only. Anything printed <em>inside<\/em> the method label gets recalculated automatically. Anything printed elsewhere on the page \u2014 a standalone notice above the order review, say \u2014 keeps whatever value it was given on page load.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Either print the estimate inside the method label, as the snippet above does, or re-render your block on the <code>updated_checkout<\/code> and <code>updated_shipping_method<\/code> events.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">The second cause is architectural. <code>woocommerce_cart_shipping_method_full_label<\/code> is a classic-template filter and it does not fire in the Cart and Checkout blocks at all. The blocks request shipping rates through the Store API and render them in JavaScript, so a PHP label filter never runs \u2014 no error, no output, nothing to debug. If your estimate appears on a classic checkout and silently vanishes on a block-based one, this is the reason. The fix is not a different filter but a different mechanism: expose the window as rate metadata through the Store API and render it with a block integration.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Related Reading<\/h2>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/quickshipd.com\/blog\/set-different-delivery-dates-per-product-in-woocommerce\/\">How to Set Different Delivery Dates Per Product in WooCommerce<\/a><\/li>\n<li><a href=\"https:\/\/quickshipd.com\/blog\/delivery-dates-subscription-boxes-woocommerce\/\">Delivery Dates for Subscription Boxes: What&#x27;s Different?<\/a><\/li>\n<li><a href=\"https:\/\/quickshipd.com\/blog\/delivery-date-vs-shipping-date-vs-dispatch-date\/\">Delivery Date vs. Shipping Date vs. Dispatch Date: What&#x27;s the Difference?<\/a><\/li>\n<li><a href=\"https:\/\/quickshipd.com\/blog\/delivery-dates-multiple-carriers-woocommerce\/\">How Do I Calculate Delivery Dates for Multiple Shipping Carriers?<\/a><\/li>\n<\/ul>\n\n\n\n<script type=\"application\/ld+json\">\n{\n  \"@context\": \"https:\/\/schema.org\",\n  \"@graph\": [\n    {\n      \"@type\": \"BreadcrumbList\",\n      \"itemListElement\": [\n        {\n          \"@type\": \"ListItem\",\n          \"position\": 1,\n          \"name\": \"Home\",\n          \"item\": \"https:\/\/quickshipd.com\/\"\n        },\n        {\n          \"@type\": \"ListItem\",\n          \"position\": 2,\n          \"name\": \"Blog\",\n          \"item\": \"https:\/\/quickshipd.com\/blog\/\"\n        },\n        {\n          \"@type\": \"ListItem\",\n          \"position\": 3,\n          \"name\": \"WooCommerce Delivery Options: The Complete Guide (2026)\",\n          \"item\": \"https:\/\/quickshipd.com\/blog\/different-delivery-times-shipping-methods-woocommerce\/\"\n        }\n      ]\n    },\n    {\n      \"@type\": \"FAQPage\",\n      \"mainEntity\": [\n        {\n          \"@type\": \"Question\",\n          \"name\": \"How do I find a shipping method's instance ID?\",\n          \"acceptedAnswer\": {\n            \"@type\": \"Answer\",\n            \"text\": \"Go to WooCommerce \u2192 Settings \u2192 Shipping and open the zone the method belongs to. Hover over the method name and look at the edit link \u2014 it ends in a number, and that number is the instance ID. A Flat rate with instance ID 2 is referenced in code as flat_rate:2.\"\n          }\n        },\n        {\n          \"@type\": \"Question\",\n          \"name\": \"Can I give the same shipping method a different delivery time in each zone?\",\n          \"acceptedAnswer\": {\n            \"@type\": \"Answer\",\n            \"text\": \"Yes. Because each zone holds its own instance of the method, the same Flat rate added to two zones produces two different instance IDs. Key your delivery windows on the instance ID rather than the method type and each zone gets its own estimate \u2014 a short domestic window and a long international one, from one method type.\"\n          }\n        },\n        {\n          \"@type\": \"Question\",\n          \"name\": \"What happens to methods I have not listed in the array?\",\n          \"acceptedAnswer\": {\n            \"@type\": \"Answer\",\n            \"text\": \"Nothing. The snippet returns the original label untouched when there is no match, so an unlisted method simply displays as WooCommerce normally renders it. Listing a bare method type such as flat_rate gives you a catch-all default for every flat rate instance you have not named explicitly.\"\n          }\n        },\n        {\n          \"@type\": \"Question\",\n          \"name\": \"Should I use per-product overrides or per-method windows?\",\n          \"acceptedAnswer\": {\n            \"@type\": \"Answer\",\n            \"text\": \"It depends on where the delay actually comes from. If the variation is in how long you take to dispatch \u2014 made-to-order versus stock \u2014 use per-product overrides. If the variation is in how long the carrier takes \u2014 express versus standard, domestic versus international \u2014 use per-method or per-instance windows. Many stores end up using both.\"\n          }\n        },\n        {\n          \"@type\": \"Question\",\n          \"name\": \"Can I offer shipping and local pickup with different delivery dates?\",\n          \"acceptedAnswer\": {\n            \"@type\": \"Answer\",\n            \"text\": \"Yes, and the mechanism is exactly the same one used for everything else. Local pickup is a shipping method like any other: you add it to a zone, WooCommerce gives it its own instance ID such as local_pickup:5, and it takes its own entry in the windows array alongside flat rate and free shipping.\"\n          }\n        },\n        {\n          \"@type\": \"Question\",\n          \"name\": \"Can I set a different delivery time per product rather than per method?\",\n          \"acceptedAnswer\": {\n            \"@type\": \"Answer\",\n            \"text\": \"Yes, and it answers a different question from a per-method window. A per-product delivery time is a lead time describing how long it takes you to get that item out the door. The total estimate is product lead time plus method transit time \u2014 the two compose rather than compete.\"\n          }\n        },\n        {\n          \"@type\": \"Question\",\n          \"name\": \"Why do my delivery times not update when the customer changes shipping method?\",\n          \"acceptedAnswer\": {\n            \"@type\": \"Answer\",\n            \"text\": \"Usually one of two causes: the estimate was rendered once and never re-rendered on method change, or you're on a block-based checkout where the classic woocommerce_cart_shipping_method_full_label filter never fires at all, since the Cart and Checkout blocks fetch rates through the Store API instead.\"\n          }\n        }\n      ]\n    }\n  ]\n}\n<\/script>\n\n","protected":false},"excerpt":{"rendered":"<p>Every delivery option WooCommerce gives you \u2014 shipping methods, zones, per-product times, cutoffs and estimates \u2014 with a copy-paste snippet for per-method delivery windows and a no-code alternative.<\/p>\n","protected":false},"author":1,"featured_media":903,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[20],"tags":[],"class_list":["post-853","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-guides"],"blocksy_meta":[],"_links":{"self":[{"href":"https:\/\/quickshipd.com\/blog\/wp-json\/wp\/v2\/posts\/853","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/quickshipd.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/quickshipd.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/quickshipd.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/quickshipd.com\/blog\/wp-json\/wp\/v2\/comments?post=853"}],"version-history":[{"count":8,"href":"https:\/\/quickshipd.com\/blog\/wp-json\/wp\/v2\/posts\/853\/revisions"}],"predecessor-version":[{"id":1265,"href":"https:\/\/quickshipd.com\/blog\/wp-json\/wp\/v2\/posts\/853\/revisions\/1265"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/quickshipd.com\/blog\/wp-json\/wp\/v2\/media\/903"}],"wp:attachment":[{"href":"https:\/\/quickshipd.com\/blog\/wp-json\/wp\/v2\/media?parent=853"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/quickshipd.com\/blog\/wp-json\/wp\/v2\/categories?post=853"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/quickshipd.com\/blog\/wp-json\/wp\/v2\/tags?post=853"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}