Adding physical products to a digital-first store: the Shippo playbook | steep
Adding physical products to a digital-first store: the Shippo playbook
shippingphysical-productsshippostripeguide
## The hybrid store opportunity
If you sell digital products and have a brand people connect with, physical merchandise is one of the few low-effort revenue streams left. Stickers, t-shirts, prints, embroidered hats. Margins are fine; brand affinity is real.
The technical hard part: physical orders need shipping addresses, real-time carrier rates, label printing, tracking, and returns logic that digital products simply do not.
Shippo is the indie-friendly answer.
## Stack
- **Cart**: same cart UI handles digital + physical (an `is_physical` flag per product).
- **Address collection**: Stripe Checkout collects shipping address when you set `shipping_address_collection`.
- **Real-time rates**: Shippo rates API takes (origin, destination, parcel) and returns 5-10 carrier options.
- **Label generation**: after payment clears, hit Shippo purchase API → get tracking number + PDF label URL.
- **Tracking webhook**: Shippo posts to your endpoint as the carrier scans update.
Total new code: ~600 LOC if you do it from scratch, ~100 LOC if you start with a template that has it wired.
## The four mistakes
### 1. Showing rates without an address
New sellers display *free shipping over $X* or a flat rate at the cart and pretend that is real. Real rates depend on the destination ZIP. Showing a fake rate means the actual checkout total surprises buyers, which kills conversion.
Fix: either collect ZIP at the cart for an instant rate quote, OR delegate to Stripe Checkout (collects full address there) and let Stripe show shipping options after.
### 2. Not buying labels until you ship
Shippo charges you when you click *buy label*. If you wait to print until packing day, your label price might have changed (carriers update zone-based rates throughout the year).
Fix: buy labels at pack time, not order time. Do not buy speculatively for an order you might ship next week.
### 3. Miscalculating dimensions
USPS Priority Mail and UPS both charge dimensional weight (length × width × height ÷ 139). A *small* t-shirt in a 12×9×3 box is dimensionally 2.3 lb even though the actual shirt weighs 0.4 lb. New sellers miss this and lose 30%+ on margin.
Fix: weigh AND measure your real packaging. Update product dimensions in admin. Tools like the Shippo rate calculator factor this automatically.
### 4. No returns process
Digital products are non-refundable once delivered. Physical products are returned regularly (10-25% rate is normal for apparel). If your store has no return path, customers initiate Stripe disputes which damages your processor reputation.
Fix: clear return policy stating the timeframe (30 days is standard), who pays return shipping (usually buyer), and what condition triggers a full refund. Document the workflow in admin so you are not making decisions ad-hoc.
## What good looks like
- Customer adds physical item to cart
- Cart shows subtotal, no shipping yet
- Click checkout → Stripe Hosted Checkout
- Stripe collects address → fetches real Shippo rates → shows carrier choices
- Buyer picks USPS Priority $5.85 → pays
- Webhook fires → order goes to *pending fulfillment* in admin
- You pack + click *buy label* in admin → Shippo charges you, returns label PDF + tracking number
- Email goes out with tracking link
- Carrier scans update via Shippo webhook → order status flips to *shipped* → *in transit* → *delivered*
Every step above is automatable. The only manual touch is physically packing the box.
## Cost economics
- Shippo is $0/month at low volume (paid per label, ~$0.05/label)
- Carrier rates pass through (you do not mark them up usually)
- Packaging materials: budget $1-3 per shipment for boxes + dunnage
- Time: 5-15 minutes per package for pick + pack + label, so you must charge labor cost into your physical product margin
A $30 t-shirt with a $4 cost, $3 packaging, $7 carrier rate, and 10 minutes of labor at $30/hour ($5 labor) nets you $11 — about 37%. That is reasonable for indie merch but you have to account for it honestly.
## When to add physical
- After your digital store is profitable
- After you have ≥ 1,000 newsletter subscribers or ≥ 5,000 monthly visitors
- When you have a brand identity worth wearing — random sticker drops on a no-name store do not move
Until then, focus on digital. Physical is a brand amplifier, not a primary revenue driver.