Why is one of my products not charging shipping at checkout?
If checkout skips shipping entirely for one product, the culprit is almost always the per-variant "physical product" flag or a shipping-profile assignment, not a checkout bug.
What's going on
A merchant notices that one specific product sails through checkout with no shipping charge and no shipping method selector — as if it were a digital download — even though it's a physical item that needs to go in a box and out the door. Everything else in the store shows normal shipping rates; this one product (or one variant of it) is the outlier.
Shopify treats every variant as either a "physical product" that needs to be picked, packed, and shipped, or a non-physical item (digital good, service, warranty, gift card, donation) that skips shipping address collection and rate calculation entirely. That flag lives on each variant individually, so it's easy to leave it in the wrong state on a newly duplicated product, a bulk-imported CSV, or a variant added after the original product was set up correctly.
Separately, Shopify routes physical products through shipping (delivery) profiles that map products to carrier or custom rates by zone. A product can have the physical-product flag on and weight set, and still show no shipping option at checkout if it isn't assigned to a profile that has a rate covering the customer's destination — which looks identical to the flag being off from the merchant's point of view.
Why it happens
The physical-vs-non-physical distinction is a per-variant setting, not a per-product one — so a product with several variants can have the flag correctly checked on the original variant and left unchecked on variants added later (via duplication, bulk edit, or a CSV import that didn't map the field).
Even a correctly-flagged physical product depends on its shipping profile assignment. Stores that start with only the default General profile and later add custom profiles (for oversized items, local delivery, or a separate warehouse) can end up with products that fall out of profile coverage during that transition, so the product technically has a weight and the physical flag on, but there's no rate configured for it in the zone being tested.
5 ways to fix it
Turn on "This is a physical product" for every variant
Open the product in Shopify admin, scroll to the Shipping card (or open each variant if the product has variants), and confirm "This is a physical product" is checked. On multi-variant products this setting lives per variant, so a merchant can fix it on variant 1 and never notice variants 2 and 3 are still marked digital. Save, then re-check by adding the item to a test cart and going to checkout — a shipping method should now appear.
Add a real weight to the variant
Shipping-eligible variants still need a non-zero weight (or Shopify falls back to treating them as weightless, which breaks weight-based shipping rates even when the physical-product flag is on). Set weight and unit under the same Shipping card, using the actual packaged weight rather than a placeholder like 0.
Confirm the product is assigned to a shipping (delivery) profile with rates for the customer's destination
Go to Settings > Shipping and delivery. Shopify auto-adds physical products to the General profile, but if the store uses custom shipping profiles the product must be explicitly moved into one that has rates for the zone the customer is shopping from. A product sitting in no profile, or in a profile with no rate for that country/zone, produces the same symptom as a non-physical product: no shipping option at checkout.
Check for rate conditions that exclude the order (weight- or price-based rates)
If shipping rates are set up with weight, price, or item-count conditions, a zero-weight variant or an order that falls outside the configured range won't return a rate even though the product is correctly flagged as physical. Review the conditions on each rate in the profile and widen or correct them if the test order falls outside every rate's range.
If the product should never ship (a service, warranty, or digital add-on), leave it unflagged and handle fulfillment manually
Not every listing is a shipping bug — if the item is genuinely a service or digital good, Shopify's non-physical designation is working as intended: no shipping address is collected and no rate is charged. In that case the fix is process, not settings: use a naming convention or a tag so staff can tell physical and non-physical listings apart at a glance.
Bottom line
Most "why isn't my product shipping" cases trace back to one of two toggles: the per-variant "This is a physical product" flag, or the product's assignment (and rate coverage) inside a shipping/delivery profile — both are native, free Shopify settings and don't require an app. Where this becomes a recurring headache is stores with large catalogs and multiple custom shipping profiles, where products silently drift out of profile coverage after bulk edits or CSV imports; a general product-data or store-QA audit app (the kind BesPoP builds) can catch that drift, but it's a convenience layer on top of a fix that's entirely doable in Shopify admin.
Browse the rest of the problem library, run a free storefront scan to catch issues like this automatically, or email us and we'll work out a custom solution for it.