Shipping Cost on the Product Page: How PDP-004 Is Scored
Shipping cost on the product page means a shopper can see what delivery will cost, or get a concrete estimate, before they press add to cart. In our rule book this is PDP-004, a critical decision-stage rule. A page passes when the cost, a free-shipping threshold, or a working estimator sits within one scroll of the price. A page fails when the first mention of shipping cost is in the cart or checkout.
What PDP-004 checks, and why it is a critical rule
PDP-004 reads: shipping cost or estimate discoverable from PDP. The rule belongs to the decision stage of our 115-rule book, the moment where a shopper has found the product and is working out whether the total is acceptable. It is one of the rules we weight as critical, because failing it does not degrade the experience, it changes the outcome.
We check it against the DOM, which is why the rule is tagged dom rather than visual. The auditor loads the product page at a desktop and a mobile viewport, then looks for shipping information in the rendered text. It also inspects any structured data for shippingDetails on the offer. A visual designer can see a shipping banner in a screenshot; the audit needs to find it in the markup, because that is what screen readers, search engines and shopping agents also find.
The rule is deliberately narrow. It does not ask for the exact shipping cost to every address, which most stores cannot produce before they know where the shopper lives. It asks whether a shopper who has never visited before, and who has not typed anything, can answer the question "roughly what will this cost to get to me" without leaving the page.
If your answer to that question is "they find out in checkout", the rule fails. If the answer is "free over £50, and that is written next to the price", it passes. The full list of what we test is in All 115 Ecommerce Checkout UX Rules We Audit Against, and PDP-004 is one of the eleven we treat as critical at the product-page stage.
Why does shipping cost on the product page matter so much?
The shipping figure is not a detail, it is part of the price. A shopper comparing a £34 item on your store with a £38 item elsewhere is comparing totals, and if your total is unknown they either guess or leave to find out. Both outcomes cost you: the guess is usually pessimistic, and the leave is often permanent.
Baymard Institute has run a recurring survey on why US adults abandon checkout. Across its published rounds, the leading stated reason is extra costs being too high, with shipping, tax and fees grouped together. Nearly half of abandoners cite it. That is roughly double the next reason on the list, being forced to create an account.
What the number hides is timing. A shopper who is told the cost on the product page and decides against it never enters the cart, so they never appear in the abandonment figure. A shopper who is told in checkout has already invested three or four steps, and their exit is recorded as a checkout failure. Disclosure on the PDP does not make shipping cheaper. It moves the decision earlier, where the shopper is still cheap to lose and where the ones who continue are far more likely to finish.
There is also a trust effect that is hard to measure but easy to observe in session recordings. When shoppers reach a checkout total that is higher than they expected, a common behaviour is to go back to the product page and scroll, looking for the shipping information they assume they missed. When it is not there, they leave. We have written about the downstream version of this in Why Shoppers Abandon Their Cart Over Shipping Costs; this article is about stopping it before the cart.
What we count as discoverable
Discoverable has a precise meaning in the audit. The information has to be visible in the default page state, or one interaction away with an obvious trigger. A line under the price counts. A collapsed "Shipping & returns" accordion in the product details counts as partial, because the shopper has to know to open it. A link in the footer does not count, because no shopper looks there before deciding to buy.
We also test at a 375px mobile viewport, because that is where most of your traffic is. A shipping line that sits beside the price on desktop but falls below the fold after the gallery, the variant selector and two sticky bars on mobile is scored on the mobile result.
Fail, partial, pass: how we score PDP-004
The audit produces one of three results for this rule. Each one has a fixed definition, so two auditors looking at the same page should reach the same grade. Below is each tier with a representative example from our screenshot library.
Fail
Fail: the price, the variant picker and the button. Shipping is first mentioned on the cart page.
A page fails when none of the following are present anywhere in the main content: a shipping cost, a shipping cost range, a free-shipping threshold, a delivery estimate that includes cost, or an estimator that accepts a postcode or country. A footer link to a shipping policy does not rescue the grade. Neither does a site-wide banner that only reads "Fast shipping" with no number attached, because speed is not cost.
The most common fail pattern is not a store that hides shipping deliberately. It is a theme where the buy box template was never given a shipping field, and the store owner assumed the cart drawer covered it. In UXFix's last 250 audits, 61% of product pages landed here. The second most common pattern is a store that offers free shipping over a threshold and only says so in a rotating announcement bar, which is often paused, dismissed or missing on mobile.
Partial
Partial: the information exists on the page, but the shopper has to scroll past the description and open an accordion to find it.
A page scores partial when shipping cost information is on the page but requires effort or luck to find. Typical cases: a closed accordion below the fold; a tooltip on a small icon next to the price; a "See shipping options" link that opens a modal; a threshold that is only stated in the announcement bar; or a statement that is true but non-committal, such as "Shipping calculated at checkout" paired with a link to a rates table.
Partial also covers stores that give a cost but omit the qualifier that changes it. "Free shipping" with no mention that it applies only to mainland UK is partial, because a shopper in Belfast or Jersey will get a different answer in checkout. A range with no lower bound, such as "from £4.95", is partial when the realistic cost for most orders is well above that figure.
Pass
Pass: cost, threshold and delivery date sit directly beneath the price, visible without scrolling on desktop and mobile.
A page passes when a first-time shopper can read a shipping cost, a threshold, or use an estimator within one scroll of the price, without opening anything, on both viewports. The wording must be a number or a rule that resolves to a number. "Free delivery over £40, otherwise £3.95" passes. "£6.95 flat rate, 2 to 4 working days" passes. "Enter your postcode for delivery cost" with a working field passes, as long as the field is in the buy box and the result appears on the same page.
A pass does not require the delivery date, but the strongest pages we see include it, because the date is the second question the shopper asks after the cost. We score that separately under a different rule, covered in Why Shoppers Abandon Checkout When Delivery Dates Aren't Shown. Showing both in the same block is the pattern we recommend.
Where the shipping cost should sit on the product page
The rule says within one scroll of the price. In practice the best-performing placement is directly beneath the price or directly beneath the add-to-cart button, inside the buy box. These are the two places every shopper looks, in that order, and they are the two elements most themes keep visible in a sticky bar on mobile.
Price £34.00. Colour and size selectors. Add to cart. Below the fold, a closed accordion titled Shipping & Returns containing a 300-word policy.
Price £34.00. Directly beneath: "Free UK delivery on orders over £40, otherwise £3.95. Order by 3pm for delivery Thursday 14 March." Then selectors and add to cart.
The following table is how we rank common placements when scoring. Position matters, but so does what the text actually says.
| Placement | Typical wording | PDP-004 result |
|---|---|---|
| Line under price, inside buy box | "Free delivery over £40, otherwise £3.95" | Pass |
| Line under add-to-cart button | "£4.95 standard delivery, 2 to 3 days" | Pass |
| Postcode estimator inside buy box, result inline | "Enter postcode" then "£5.50 to SW1A" | Pass |
| Sticky announcement bar only | "Free shipping over £50" | Partial |
| Closed accordion below description | Full policy text | Partial |
| Icon with tooltip next to price | Truck icon, hover reveals cost | Partial |
| "Shipping calculated at checkout" with no link | No figure | Fail |
| Footer link to shipping policy | Policy page | Fail |
Two points on wording. First, lead with the outcome most shoppers will get. If most of your orders qualify for free shipping, say "Free delivery over £40" first and the fallback cost second. If most orders pay, put the paid rate first so the common case is never a surprise. Second, keep the country in the sentence when it matters. "Free UK delivery" avoids the checkout disappointment that "Free delivery" causes for an international shopper.
On mobile, check the sticky add-to-cart bar. Many themes collapse the buy box into a fixed footer with the price and button, and the shipping line gets left behind in the scrolled-away content. If the sticky bar is what the shopper sees at the decision moment, the shipping line needs to be in it, even as a single short string such as "Free delivery over £40".
Free shipping threshold on the PDP
A threshold is the most common way stores pass this rule, and it does double duty as an average order value lever. The audit looks for three things: the threshold amount, the fallback rate when the threshold is not met, and whether the threshold is repeated in the cart with a progress indicator. Only the first two affect PDP-004, but stores that do all three consistently show the smallest gap between product page views and completed orders in our data.
A threshold stated without the fallback is partial. "Free shipping over £50" leaves the £45 basket guessing. "Free shipping over £50, otherwise £4.50" answers everyone.
Edge cases: when you cannot show a single number
Most objections to this rule come from stores whose shipping genuinely varies. The rule accommodates that, but it does not accept silence as the answer. Here is how we score the common situations.
Rates vary by destination. Show the home-market rate and a working estimator. "UK delivery £3.95. Shipping elsewhere? Enter your country" passes. The estimator must return a figure on the page, not redirect to a policy. We test it by entering a plausible international destination; if it errors or returns "calculated at checkout", the grade drops to partial.
Rates vary by weight or cart contents. State the rate for this product alone, which you know. "Delivery for this item: £5.95. Add more items and pay one delivery charge" is honest and passes. Shoppers rarely need the exact cost of a hypothetical basket; they need to know that the single item they are looking at will not carry a £25 fee.
Large or freight items. These are the pages where hiding the cost does the most damage, because the fee can be a large share of the item price. "Delivered by two-person courier, £49, includes room of choice" passes and screens out the shoppers who would abandon at checkout anyway. A postcode-based freight quote in the buy box also passes. "Freight quote provided after purchase" fails, and in our experience is also the single biggest driver of cancellation requests for furniture and appliance stores.
Multiple shipping speeds. Show the cheapest, and label it. "Standard delivery from £3.95, express available" passes because the lower bound is real and the shopper knows a faster option exists. Listing all four speeds in the buy box is unnecessary; that belongs in the shipping selector at checkout.
Marketplace or multi-vendor stores. Each product page shows the shipping rules of the vendor selling that item, not a site-wide policy that may not apply. Where the vendor has not set a rate, the platform should display a default rather than nothing.
Pre-orders and made-to-order items. The cost rule is the same. The date rule changes: say "Ships from 12 April" rather than a delivery date you cannot commit to. An estimated dispatch window paired with a cost passes PDP-004.
Click and collect or local pickup. Mention it alongside delivery, not instead of it. "Free collection from our Leeds store, or £3.95 delivery" passes. "Free collection available" alone is partial, because the shopper who cannot collect still does not know the delivery cost.
What AI shopping agents need from your product page
UXFix scores every store twice: once for a human shopper and once for an AI shopping agent. For PDP-004 the two scores can diverge sharply, and the agent score is usually the lower one.
An agent acting for a shopper does not scroll, hover or open accordions the way a person does. It parses the DOM, reads structured data if present, and extracts a price. When it is asked to compare your product with a competitor's, it needs a total, and if your shipping cost is only present in an image banner, a CSS pseudo-element, or a JavaScript modal that never renders until clicked, the agent either omits your store from the comparison or assumes a cost. Neither helps you. We covered the pricing side of this failure in Why AI Shopping Agents Misread Your Prices; shipping is the same problem one line further down.
The fix has two parts. First, make the human-visible shipping line real text in the DOM, adjacent to the price element, not a background image and not injected only on interaction. Second, add shipping details to your product structured data using OfferShippingDetails, which is the vocabulary schema.org defines for exactly this and which Google documents under its product structured data guidance. Agents that read JSON-LD will pick it up directly; the ones that do not still get the visible text.
{
"@context": "https://schema.org",
"@type": "Product",
"name": "Merino Crew Neck Jumper",
"offers": {
"@type": "Offer",
"price": "34.00",
"priceCurrency": "GBP",
"availability": "https://schema.org/InStock",
"shippingDetails": {
"@type": "OfferShippingDetails",
"shippingRate": {
"@type": "MonetaryAmount",
"value": "3.95",
"currency": "GBP"
},
"shippingDestination": {
"@type": "DefinedRegion",
"addressCountry": "GB"
},
"deliveryTime": {
"@type": "ShippingDeliveryTime",
"handlingTime": {
"@type": "QuantitativeValue",
"minValue": 0,
"maxValue": 1,
"unitCode": "DAY"
},
"transitTime": {
"@type": "QuantitativeValue",
"minValue": 2,
"maxValue": 4,
"unitCode": "DAY"
}
}
}
}
}A free-shipping threshold can be expressed by adding a second OfferShippingDetails entry with a shippingRate value of 0 and a minValue on the eligible order amount, or more simply by stating the rule in visible text and letting the structured rate reflect the paid fallback. The visible text matters more than the schema for most agents today, because several of them render the page and read what a shopper would read. Both together is the state that passes the agent-side audit.
The agent audit also checks that the shipping string and the price are in the same container or in adjacent siblings. A shipping line placed in a sidebar widget 1,200 pixels away in the DOM order is technically on the page but is often not associated with the offer by a parser. Keep them together.
How to fix a PDP-004 fail this week
This is not a redesign. In most themes the change is one template edit and one settings decision, and the whole thing ships in an afternoon.
- Write one sentence that states the cost most shoppers will pay, plus the threshold or fallback, and place it directly under the price in the buy box.
- Repeat the same sentence, shortened, in the mobile sticky add-to-cart bar so it is visible at the decision moment.
- Add OfferShippingDetails to your product JSON-LD so agents and search engines read the same figure the shopper sees.
- Test a postcode estimator with three real destinations, including one outside your home market, and confirm each returns a number on the page.
- Rely on a rotating announcement bar as the only place the threshold appears; it is dismissed, paused or hidden on mobile more often than you think.
- Write "Shipping calculated at checkout" without a figure or a link to a rates table; it reads as a warning that the number is high.
- Put the shipping figure in an image, a background graphic or a hover-only tooltip; humans miss it and agents cannot read it.
- Say "Free shipping" without the country or the threshold if either condition exists; the checkout will contradict you.
The sequence we recommend is: decide the sentence, place it, then verify. Deciding the sentence is the part store owners underestimate. Pull your last 500 orders and check what shipping cost the median order actually paid. That is the number to lead with. If the answer is zero because most orders clear your threshold, lead with the threshold. If the answer is £4.95, lead with £4.95 and mention the threshold second.
Placing it is a theme edit. In Shopify themes it is usually a text block in the product information section; in WooCommerce it is a hook after the price or a short code in the single product template; in custom builds it is a line in the offer component. Whatever the platform, the requirement is that the text is in the server-rendered or hydrated DOM, not injected on scroll or click.
Verifying it means loading the page in a private window at 375px wide and asking someone who does not work for you what it costs to get the item delivered. If they can answer in under ten seconds without touching anything, you pass. Then run the page through a structured data validator to confirm the shippingDetails object parses.
One caution from the audits. A handful of stores respond to this rule by adding a shipping line that is technically true but engineered to look cheaper than the real experience, such as "Delivery from £1.99" where £1.99 is a ten-day untracked option almost nobody chooses. That passes PDP-004 on the DOM check and fails the shopper anyway, because the checkout default is £5.95. The rule exists to remove surprises. Choose the figure that removes them.
Questions we get asked
Where exactly should shipping cost appear on a product page?
Directly beneath the price or directly beneath the add-to-cart button, inside the buy box, as plain text. Those two positions are visible without scrolling on desktop, survive the collapse into a sticky bar on mobile, and sit next to the price in the DOM where parsers and screen readers associate them with the offer. An accordion, tooltip or announcement bar can repeat the information, but should not be the only place it lives.
Is a postcode or ZIP shipping estimator enough to pass?
Yes, if it sits in the buy box, returns a figure on the same page without a redirect, and works for the destinations your shoppers actually come from. It is stronger when paired with a default statement for your home market, such as "UK delivery £3.95, or enter your country for other rates", because most shoppers then never need to type anything. An estimator that errors, requires an account, or returns "calculated at checkout" is scored partial at best.
We offer free shipping on everything. Do we still need to say so on the product page?
Yes, and it is the easiest pass in the rule book. Shoppers who have been burned elsewhere assume there is a fee until told otherwise, so "Free UK delivery on every order" under the price removes a doubt you did not know you were carrying. Include the country if the offer is regional, and put the same string in your OfferShippingDetails with a rate of zero so agents read the same thing.
Does showing shipping cost on the PDP actually reduce abandonment, or just move it earlier?
Both, and the second is the point. Baymard's surveys put extra costs at 48% of stated abandonment reasons, the largest single cause, and that figure is measured at checkout where the shopper has already invested several steps. Disclosing on the product page lets price-sensitive shoppers self-select out before the cart, which lowers the recorded checkout abandonment rate, and it raises completion among the shoppers who continue because the total in checkout matches what they expected. The gain is not from hiding the cost; it is from never letting it be a surprise.