Changelog
What’s new in Shipnest
April 2026
219 updatesMonday, April 27
1 update- emailPostmark provider + automatic fallback behind EmailProvider
Sunday, April 26
2 updates- Add /demo entry route — one-click demo workspace from any URL
- Legal docsGDPR + CCPA + Shopify App Store full coverage
Saturday, April 25
10 updates- Order detailsurface SET_CARRIER, SET_PACKAGE, SET_PAPERLESS hints
- Order detailsurface rule hints in CustomsForm + RateShopPanel
- /guidereal-world automation recipes + refresh existing sections
- Rulesderived "lane" field + testRule accepts # prefix
- testRuleaccept orderNumber + return discriminated union
- Rules"Apply to existing orders" backfill button
- Customsauto-fill HS code + origin from Product catalog per SKU
- Rulesadd SET_HAZMAT, SET_NON_DELIVERY, SET_SIGNER_NAME
- Ruleswire SET_CARRIER + SET_PACKAGE hints in buyLabelForOrder
- Customers hubmerge Address book in as a tab, close sidebar gap
Friday, April 24
37 updates- Scan stationunify Print / Pick / Handover into one /scan page
- Public pageslogo on /status + /docs, /guide visual redesign
- Public /guide — comprehensive user-facing app documentation
- DDP-on-PLATFORM gaterefuse sender-paid duties on operator carrier accounts
- Platform carrier auto-provisioning — operator's UPS/FedEx rates flow to every tenant
- Shopify GDPR compliance webhooksdata request + customer redact + shop redact
- Shopify Carrier Serviceopt-in toggle per store, not auto on install
- AddressValidatorwire /api/address/validate for live DPV verification
- Three quick wins vs ShipStationcarbon footprint, ship-by deadlines, live address verification
- Multi-currency visibilitysettings hint, landing tile, FAQ entry
- Multi-currency Plan Astop summing across currencies, remove USD default
- Etsy + eBayservice-name maps, eBay requestedService/Name swap fix
- Etsywire opts.since → min_last_modified so cron pulls delta-filter
- Public APIPOST /api/orders for headless-commerce / ERP push
- Public APIGET /api/orders, GET /api/orders/:id, GET /api/carrier-accounts
- Public APIBearer auth for POST /api/labels + landing/docs truthful
- Public REST APIvoid label, list + get shipments. /track surfaces refunds.
- Handover scan'Session feed' becomes per-date 'Scanned today' (org-wide)
- Dashboard 'Connect a channel' prompt: source from STORE_META, not hardcoded top-3
- Shopify'Migrate tokens' button for legacy non-expiring installs
- Shopify webhook re-registerrefresh the expired access token first
- Shopify webhook registrationaudit per-topic result + manual re-register
- Rate-shop caching — 30s LRU collapses checkout-polling spam
- Dunning flow — 14-day grace + day-3/7/14 email cascade + label-buy lock
- DPA + sub-processors registry for enterprise procurement
- Tenant 2FA — functional TOTP enrollment for regular users
- Public status page — /status + /api/status.json
- ShipStation import preset — auto-map columns + oz→g conversion
- Public API reference + Bearer auth on rates + tracking endpoints
- 14-day trial of paid plans via Stripe Checkout
- Branded tracking + returns portal — per-tenant logo, color, contact
- SET_NEAREST_WAREHOUSE rule action — route imports by postal-code prefix
- IOSS / UK-NI tax compliance — customs pre-clearance for EU + GB lanes
- Outbound webhook dispatch + delivery log
- Voids & refunds report: per-carrier breakdown + past-window rejections
- Insurance claims UIfile from shipment detail + third-party policy path
- Void-window pre-flightreject past-window voids with a concrete reason
Thursday, April 23
53 updates- GDPR account deletionOWNER-only org erasure with blast-radius preview
- Address pre-flightshare validator between UI + buyLabelForOrder
- Weight + dim limitspre-validate before the carrier rejects
- Productsbulk Link stock action on multi-select
- Dashboardhide channels the operator hasn't configured
- Insurancelive providers, policy persistence, shipment card
- Handover scanpersistent history + CSV export
- Handover scan pt 2list column, dashboard card, manifest filter
- Handover scanphysical checkpoint between print and carrier
- quoteOrder + buyLabelForOrderfall back to default warehouse
- quoteOrderfilter malformed quotes before persisting
- Order detailpaperless-setup nudge for international orders
- Signature uploadcontent validation + failure banner
- Customs settingsspell out signature format + size requirements
- FedEx ETD auto-upload + topbar menu + clearer enrolment notes
- Shipment detailsurface options, customs, applied rule hints
- RulesSET_INCOTERM, billing, HS code, paperless + friends
- Customs auditadapter shapes, save race, PDF preview
- Customs declarationscurrency-aware, persisted, paperless-ready
- Carrier optionsfix audit loss, RM/USPS rate-shop filter, docs drift
- Carrier optionsincoterms, third-party billing, signature levels
- Order detaileditable per-item weight
- Batch shiprow selection + per-selection Quote/Buy/Print
- Order detailpick the ship-from warehouse, fall back to org default
- Surface rate-shop warnings so missing carriers explain themselves
- USPS + EasyPostfriendly service names; EasyPost passes linked carrier accounts
- FedExpopulate estDeliveryDays from transitTime enum + service fallback
- UPS ratesenable negotiated pricing, restore service names + transit days
- Centralise Prisma Json-column casts via lib/prisma-json.ts
- Rulescase-insensitive text ops + placedAt/orderAgeHours fields
- Rulesadd STATUS_CHANGED + TAG_ADDED triggers
- Rules listswap the sidebar+detail layout for a DataTable
- Rulesaudit rule.hint_overwritten when a later rule clobbers state
- buyLabelForOrderactually consume rule hints
- Rulesunify fields/operators/actions in a single registry
- Rulesper-rule try/catch + rule.failed audit + snapshot/restore
- Rulesgate replays via AuditLog rule.matched, exempt MANUAL
- Rulesseed OrderTag catalogue on ADD_TAG
- Update remaining BulkTagDialog callers to the new API
- Order detailpick tags from the shared org catalogue
- Always expose Packages card on shipment detail, collapsed when single
- Stabilize Tags column layout in the orders list
- Responsive fixes for ParcelsEditor
- Terminal-order read-only treatmentbanner + hide dead cards
- Kill dead UX surfaces in shipping components
- Dedup orders/shipments primitiveslabels, AddressBlock, Dialog
- Portal the tag-color picker so it escapes table overflow clipping
- Replace demo notifications with real-activity feed
- Per-tag colors24-swatch palette, hash default, click-to-pick override
- Fix pixelated product thumbnailsDPR-aware srcSet + CDN URL rewrites
- Sync table preferences across devices via TablePreference rows
- Add product thumbnail column (visible on products, optional elsewhere)
- Order detailshow platform icon next to source channel badge
Wednesday, April 22
48 updates- Fix /admin/sign-ins crashDataTable needs a client wrapper
- FixRateShopPanel Toggle renders as two overlapping blobs
- persistNormalizedOrderadopt orphaned orders after store reconnect
- Live-feel updatesAutoRefresh polling on orders/dashboard/shipments
- Ordersdenormalize source channel + revalidate on webhook
- Shopify OAuthsend expiring=1 on token exchange + refresh
- Shopify testConnectionshow Shopify's raw response, not our guess
- testStoreConnectionecho persisted creds shape on failure
- Fix buildcreds.ts is \"use server\" — no non-async exports
- Shopify testConnectionsurface the real 403 body + detect PCD
- Shopifyhandle Token Rotation (expiring offline tokens)
- App shellwire topbar + sidebar to real session/org/plan
- Update CLAUDE.md for Stripe billing, admin billing/print-jobs, Shopify PCD
- Shopifyfriendly PCD error + setup-guide note
- syncStoreNownever throw — return { ok:false, error } instead
- syncStoreNowdefensive per-order error handling + failure surfacing
- Shopify syncwiden filter, auto-register webhooks, add Sync now
- Fix buildwiden Plan unions for Plan.PRO across admin surface
- Stripe phase Csignup → Checkout, billing rebuild, landing prices
- Stripe phase Bplan-limit enforcement
- Stripe phase Aschema, client, Checkout + Portal + webhook
- Signup pagecentered layout with sticky header
- Fix buildpersist labelUrl on ShipmentPiece + use it on print fallback
- Fix buildOrganization missing PrintJob back-relation + pdfkit bundler
- PrintNode phase 3PrintJob table, packing-slip auto-print, retry
- PrintNode phase 2warehouse routing, test print, history card
- PrintNode cloud-print integration (phase 1)
- Webhooksshort-code status mapping, NaN guard, wider retry window
- Rates / labelssurface errors + fix EASYPOST enum + HTTP status codes
- Public contact form at /contact → info@shipnest.app
- Update CLAUDE.md for marketing, SEO, legal and cookie work
- Legal packageprivacy, terms, cookies + GDPR banner
- Full SEO + AI-discoverability package for the marketing site
- Store adapters polishvalidation + descriptive errors
- eBayOAuth authorization-code install
- Etsyzero-field PKCE OAuth install
- Amazonone-click Seller Central OAuth install
- Fix buildEASYPOST missing from packaging map
- Carrier Connect polishinline validation + descriptive errors
- EasyPostfirst-class carrier (was registered but not connectable)
- USPSzero-field one-click OAuth install
- UPSone-click OAuth install (authorization_code)
- Carrier Connect dialogproduction default + help panels
- Add /admin/setup-guide with per-integration credential recipes
- Amazon product syncReports API for fetch, Listings PATCH for push
- eBay stock sync via sell.inventory scope + amazon sync-gap note
- Fix Magento connect bug + product sync for Squarespace / Magento
- Gate tenant integrations by operator env config
Tuesday, April 21
67 updates- Clean up Etsy / eBay / BigCommerce adapters + UI
- Amazonmulti-marketplace per store + platform LWA creds
- Fix DHL/EasyPost + one-click install for Shopify & WooCommerce
- Real brand logos in tables + dismissible filters + inline tag edits
- Require TOTP for every admin
- Expand /adminimpersonation, search, health, broadcasts, analytics
- Enforce User.disabled at sign-in + on every server request
- Fix dark-mode contrast and washed-out tinted surfaces
- Add operator admin panel at /admin
- Add nightly demo-reset cron
- Wire up topbar Create menu and Sparkles button
- Add one-click demo login
- Gate demo data behind Organization.isDemo
- Add Shipnest favicon matching sidebar brand mark
- Add brand marks for carriers and sales channels
- Email template editor + NOTIFY rule wiring
- Catalog syncadd Shipnest → channel push (Shopify, Woo)
- Inventorycross-channel broadcast on every sale / void
- Fix buildmove nextRun out of "use server" module
- Dashboardreal KPIs, spark chart, ready-to-ship list, channel prompt
- Onboarding + full /settings rebuild
- Analyticsreal metrics from shipment data
- Reportsreal scheduled CSV exports with email + download
- Importsreal CSV ingest for orders + products
- Claimsreal CRUD + status machine + evidence manager
- Returnsreal RMA flow — detail page, status machine, portal
- Manifestsreal CRUD with auto-include + warehouse resolution
- Pickupsfirst-class Pickup model + real scheduling UI
- Warehousesreal CRUD + country-aware editor + monthly count
- Inventoryreal on-hand / committed / available + adjust flows
- Catalog syncoptional pull from connected channels
- Productsstock-shared aliases ("link to master SKU")
- Products + Bundlesreal CRUD, detail page, bundle editor
- Address bookreal CRUD on a dedicated AddressBookEntry model
- Customersdetail page, CRUD actions, add dialog, bulk tag
- Rate calculatorcountry-aware fields + warehouse preset
- Scan-to-printreal order / shipment resolution + ship-on-scan
- Carriersmanage actions + markup editor + platform toggle
- Integrationsreal connect / manage UI
- Rulesclose audit findings
- Batchwire to real quote + buy actions
- Shipments auditclose bugs and gaps end-to-end
- Ordersclose the 4 remaining detail-page gaps
- Orders auditclose bugs and gaps end-to-end
- Country-aware address fields
- Add package-lock.json for reproducible installs
- Gate /(app)/* behind NextAuth; plan picker on signup
- Rebrand Shipwise → Shipnest; shipwise.app → shipnest.app; app URL my.shipnest.app
- Fix Prisma Json → typed cast in rules pages (must go via unknown)
- Automationsclose every gap end-to-end
- Finish /api/health rewrite (first commit missed the file write)
- Make /api/health + start command resilient so Railway health probe passes
- Swap prisma migrate deploy → prisma db push for first-time deploy
- Fix mixed ??/|| syntax error in normalizeParcels weight default
- Fix decryptJson default generic so creds are typed without casts
- Fix Order detail TSmerge AddressValidator suggestion into setShipTo
- Fix Next 15 breaking changeparams is a Promise
- Fix env modelplatform vs per-org. Webhook secrets per-store.
- Add CLAUDE.md — codebase guide for future Claude Code sessions
- Close tier-2 gapsstock sync, refund webhooks, auto-disable, idempotency, return labels, concurrency-safe upsert
- Use persistNormalizedOrder in POST /api/orders/sync too
- Close every channel gapimages, line-item IDs, gift/notes, customer address, billing address, real mark-fulfilled on 8 channels
- Close every carrier / multi-piece gappieces[] end-to-end + persisted
- Wire carrier adapters end-to-endreal packaging, real multi-piece, real rate-shop UI, test-connection, Connect-carrier dialog
- De-hardcode lists, add 2 channels, aggregator, claims, real TOTP, SSO, sidebar collapse, mobile nav, g+key nav, marketing mix
- Add auth, onboarding, 3 channels, insurance, imports, reports, UX polish
- Close ShipStation feature gapsPDFs, email, inventory, multi-piece, bundles, hazmat, custom fields, manifests, 2FA, RBAC, cron
Monday, April 20
1 update- Ship full ShipStation feature setorder flow, batch, scan, portals, settings