If you've ever tried to order something online while living in Puerto Rico, you've probably hit the dreaded "we don't ship to your address" wall. It's frustrating, confusing, and — for the 3.2 million US citizens living on the island — maddeningly common.
But why? Puerto Rico is a US territory. Residents pay federal taxes, carry US passports, and use USPS with regular US ZIP codes (00XXX). So what's going on behind the scenes?
As someone who's dug into the technical side of e-commerce shipping, I can tell you: it's a mix of outdated legislation, lazy software defaults, and carrier API quirks that combine into a perfect storm of exclusion.
Let's break it down.
The Jones Act: A 100-Year-Old Law Still Causing Problems
The Merchant Marine Act of 1920 — better known as the Jones Act — requires that all goods shipped between US ports be carried on ships that are US-built, US-owned, and US-crewed. Since Puerto Rico is an island that receives almost all goods by sea, this law has an outsized impact.
The result? Shipping costs to Puerto Rico are significantly higher than they'd be in a free market. Studies estimate the Jones Act adds $1.1 billion in annual costs to Puerto Rico's economy. A container shipped from the US East Coast to Puerto Rico can cost double what it would cost to ship the same container to a foreign Caribbean island like Jamaica or the Dominican Republic.
For retailers, these elevated costs eat into margins. Many simply decide it's not worth the hassle and exclude PR ZIP codes entirely.
The Technical Side: Why Retailer Systems Fail Puerto Rico
Here's where it gets interesting for the dev crowd. A huge part of the problem is how shipping and address validation systems are built.
1. Address Validation APIs Treat PR as "International"
Many address validation services — including older versions of popular APIs — categorize Puerto Rico addresses as international. When a retailer's checkout flow hits the validation step, PR addresses get flagged or rejected.
This happens because:
- Country/state dropdowns don't include PR as a US state (it's a territory)
- ZIP code databases sometimes map 00XXX codes to "foreign" buckets
- Older USPS API integrations handle territories inconsistently
If you've ever built a checkout form, you know the pain. The address object expects state to be one of 50 values. Puerto Rico (PR), Guam (GU), US Virgin Islands (VI), and other territories get dropped.
// This is the kind of thing that breaks PR shipping
const US_STATES = [
'AL', 'AK', 'AZ', ... 'WI', 'WY'
// PR, GU, VI, AS, MP — missing!
];
function isValidUSAddress(address) {
return US_STATES.includes(address.state);
// Returns false for Puerto Rico 🙃
}
2. Carrier Rate APIs Return Errors or Inflated Rates
When retailers query carrier APIs (UPS, FedEx, DHL) for Puerto Rico shipping rates, they often get:
- Error responses because the integration doesn't handle territory-specific rate zones
- Wildly inflated rates because the API defaults to international pricing
- No available service levels because the retailer only configured domestic options
Rather than handle these edge cases, many engineering teams just... don't. Puerto Rico gets silently excluded.
3. Tax Calculation Complexity
Puerto Rico doesn't have a traditional state sales tax — it uses a Sales and Use Tax (IVU) system with different rates and rules. Tax calculation services like Avalara and TaxJar handle this, but retailers using simpler tax logic often can't compute PR taxes correctly and block orders rather than risk compliance issues.
4. Fulfillment Network Limitations
Major retailers with distributed warehouse networks optimize for the continental US. Their fulfillment software calculates shipping from the nearest warehouse, and when the destination is PR, the algorithms either:
- Can't find a valid shipping route
- Flag the order for manual review (which effectively kills it)
- Default to expensive air freight instead of ground shipping
The Wall of Shame: Retailers That Won't Ship to Puerto Rico
Here's an incomplete but telling list of major US retailers that either don't ship to Puerto Rico at all or severely restrict what they'll deliver:
| Retailer | Status |
|---|---|
| Target | Won't ship most items to PR |
| Wayfair | Restricted — many items excluded |
| Adidas | Does not ship to PR |
| Nike | Limited shipping to PR |
| Sephora | Does not ship to PR |
| Crate & Barrel | Does not ship to PR |
| Pottery Barn | Does not ship to PR |
| West Elm | Does not ship to PR |
| Restoration Hardware | Does not ship to PR |
| Chewy | Restricted shipping to PR |
| Dyson | Does not ship to PR |
| Bose | Does not ship to PR |
And this is just the tip of the iceberg. Hundreds of smaller retailers have the same restrictions baked into their checkout systems.
The irony? Many of these companies have physical stores in Puerto Rico or sell to completely foreign countries. They'll ship to Canada or the UK, but not to a US territory with US postal codes.
The Developer's Responsibility
If you're building e-commerce software, this is partially on us. Every time we hardcode 50 states, skip territory handling in our address validation, or don't test our shipping integrations with PR ZIP codes, we're perpetuating the problem.
Here's a quick checklist for devs:
Address Forms:
- Include all US territories in your state/region dropdowns (PR, GU, VI, AS, MP)
- Validate ZIP codes in the 00600-00988 range as domestic US
Shipping Integration:
- Test carrier API responses for PR addresses explicitly
- Handle territory-specific rate zones in your shipping calculator
- Don't silently fail — surface clear messaging if shipping is restricted
Tax Calculation:
- Use a proper tax service that handles PR's IVU system
- Don't block checkout because your tax logic can't handle territories
# Better approach
US_STATES_AND_TERRITORIES = [
'AL', 'AK', 'AZ', 'AR', 'CA', 'CO', 'CT', 'DE', 'FL', 'GA',
'HI', 'ID', 'IL', 'IN', 'IA', 'KS', 'KY', 'LA', 'ME', 'MD',
'MA', 'MI', 'MN', 'MS', 'MO', 'MT', 'NE', 'NV', 'NH', 'NJ',
'NM', 'NY', 'NC', 'ND', 'OH', 'OK', 'OR', 'PA', 'RI', 'SC',
'SD', 'TN', 'TX', 'UT', 'VT', 'VA', 'WA', 'WV', 'WI', 'WY',
# US Territories — don't forget these!
'PR', 'GU', 'VI', 'AS', 'MP', 'DC',
]
The Workaround: Package Forwarding
Until every retailer fixes their systems (don't hold your breath), people in Puerto Rico have found a practical workaround: package forwarding services.
The concept is simple — you get a US mainland address to ship to, and the service forwards your packages to Puerto Rico. It's the same idea as a mail forwarding service, but optimized for e-commerce.
One service worth mentioning is PackagePR, which gives you a Miami-based shipping address. You shop at any US retailer, ship to your PackagePR address, and they forward it to Puerto Rico. It effectively removes the "we don't ship to PR" barrier entirely.
It's a band-aid solution to a systemic problem, but it works — and for the millions of people dealing with this daily, that matters.
What Needs to Change
Short term:
- Retailers need to audit their shipping configurations and fix territory exclusions
- E-commerce platforms (Shopify, WooCommerce, BigCommerce) should ship with territory support enabled by default
- Carrier API documentation should include territory-specific examples and test cases
Long term:
- The Jones Act needs reform or repeal to bring shipping costs in line with market rates
- Address and shipping standards need to treat territories as first-class domestic destinations
- Tax calculation services need better territory support out of the box
For developers right now:
- Test your checkout with PR addresses today
- Add territories to your state lists
- File bugs against libraries and platforms that exclude territories
Wrapping Up
The fact that 3.2 million US citizens can't freely shop online from US retailers in 2026 is absurd. It's a problem with roots in century-old maritime law, compounded by software defaults that treat territories as an afterthought.
As developers, we can't repeal the Jones Act. But we can stop writing code that pretends Puerto Rico isn't part of the United States. Every state dropdown, every ZIP code validator, every shipping integration — these are small decisions that have real impact on real people.
Next time you're building a checkout flow, remember: there are 50 states, but there are 56 domestic destinations. Code accordingly.
Originally published at packagepr.com
Top comments (0)