Changelog
What’s new in Shipnest
May 2026
198 updatesFriday, May 29
9 updates- carrierskeep PLATFORM account number private (operator's account)
- carriersalways show the connected account number on each row
- loginfix tab order — Email → Password, not Email → Forgot password
- billinghide platform carriers on /carriers for Shopify orgs (Option A)
- billingOption A — no platform rates / Stripe wallet for Shopify orgs
- billinggate /api/stripe/portal on SHOPIFY (defence in depth)
- trackingdrop invalid carrier dates + prune RateQuote
- shipmentspropagate DELIVERED to the order across all delivery paths
- billingwallet auto-reload — off-session top-up when a currency runs low
Wednesday, May 27
1 update- billingdefault new App-Store-mode signups to Shopify Billing (Stripe opt-in)
Tuesday, May 26
4 updates- billingpoint "Open Shopify Admin" at the unified-admin billing URL
- shipmentsstrip leading # from order number in the row label + detail title
- shopifydrop `code` from base-UserError selections (fixes billing 502 + silent fulfillment/webhook breakage)
- billingShopify-billed orgs never reach the Stripe downgrade dialog/portal
Monday, May 25
6 updates- signuppreserve install context on email_exists "Sign in instead" CTA
- shopify installroute paid-plan signups to Shopify Billing post-mount
- shopify installcookie-based fallback for plan-card URL drop
- ebay compliancenormalise PEM newlines (root cause of all 401s)
- ebay compliancetry both ECDSA encodings (P1363 + DER)
- ebay complianceaccept ECDSA-SHA1 signatures (was hardcoded RSA-SHA256)
Saturday, May 23
12 updates- group 20round-5 — markDelivered order lock + /api/tracking limit + batch SKU-scoped + dispatchWebhook catch
- group 19round-4 MEDIUMs (batch findMany cap, overage catch, search q cap, EasyPost cache sweep)
- group 17round-3 MEDIUMs — Stripe buffer + billingProvider gates + markDelivered lock + bulk parallel
- group 14round-2 LOWs (M7, M9, L3)
- group 13round-2 MEDIUMs (M4, M5, M6)
- group 12round-2 HIGH + my-own-regressions (H1, H2, M2, M3, M8)
- group 10Shopify Billing — persist pending plan (no name string-matching)
- group 9catalog-sync + inventory-sync perf
- group 7AUTH_URL → appUrl() + /settings/billing parallelization
- oauth+cronAbortSignal on every external fetch (P1, P2)
- billingcross-provider state safety (B4, B7, B2)
- billing+installrevenue + compliance fixes for SHOPIFY-billed orgs
Friday, May 22
6 updates- smokeend-to-end test driver for Shopify install + billing + webhook routes
- preflightpre-submission verification script (71 checks, green)
- shopify-listingrewrite billing copy to Option A (Shopify Billing API)
- billingdual-provider mode — Stripe for direct signups, Shopify Billing API for App Store installs
- shopifymigrate every adapter call to GraphQL Admin API
- shopify oauthinstall from App Store, no shop-domain entry on our site
Friday, May 15
4 updates- mobile responsivehamburger menu on public headers
- customersbulk delete with eligibility filter on order-referenced rows
- mobilehide non-essential topbar buttons on phones (<640px)
- mobile2 top-level grids stack on phones instead of cramping
Thursday, May 14
6 updates- bundlesbulk delete with checkbox multi-select + sticky toolbar
- productsbulk delete with eligibility breakdown
- landingsper-carrier marketing pages for UPS / FedEx / DHL / USPS / Royal Mail / EasyPost
- productsper-row Make master action to swap master/alias roles
- productscompleteness KPI strip + filter chips + bulk weight/dims
- inventoryKPI strip, filter chips, restock report, bulk receive, status differentiation
Wednesday, May 13
20 updates- bundlesKPI strip, derived stock, parts-sum recap, duplicate, search, reorder
- tablehide action-only columns from the column chooser + CSV export
- batchper-item qty + per-unit weight editable in ProductsDialog
- batchbulk refund tracker — record refund intent across N orders
- batchbulk close manifest — one per carrier+warehouse across selected bought rows
- batchpost-buy pickup scheduler — schedule carriers right after Buy all
- batchbulk packing slips — print N orders' slips in one click
- batchbulk soft-cancel order — flips status + pushes channel cancel
- batchper-line customs editing in ProductsDialog for international rows
- batchexpand bulk dialog with 7 shipment options (Saturday, hold-at-location, notify, customs)
- batchsave bulk edits as a rule — closes the loop with the rule engine
- batchper-row void chip + bulk void with refund preview
- batchquote comparison popover — override the auto-pick per row
- batchbulk lifecycle fields — tag, priority, assignee, hold/unhold, append note
- batchsmart filter chips above the table — one-click sub-batching
- batchinline products dialog + click-to-edit destination on every row
- batchbulk apply a PackagePreset — one click swap dims + emptyWeight on N rows
- batchbulk parcel dimensions + per-row Parcels summary column
- batchper-row carrier pin + customs HS/origin edits, exhausting per-order shipping fields
- batchbulk edit dialog — apply weight/warehouse/signature/insurance/incoterms/billDuties/hazmat to N rows
Tuesday, May 12
15 updates- batchinline per-row editors for warehouse, signature, insurance, incoterms, hazmat
- pickupsshow pickup source (warehouse / saved address) in list, not just a dash
- addressescity ↔ postal-code coherence validation on address book save
- billingwire Stripe addons end-to-end (Checkout + webhook + Meter Events)
- remove stripe-setup.md — going interactive
- billingfailed-payment recovery — manual + auto-retry
- billing/upgrade — full feature matrix view
- billingdowngrade preview with cap checks
- billingtenant-wide payment-status banner
- billinginvoice CSV export
- billingadmin trial-extension control
- billingannual cycle with 2 months free
- billingper-warehouse addon
- billingper-seat addon (extra user slots)
- billingusage-metered overage on paid tiers
Monday, May 11
47 updates- fedexpickupAvailability — empty {} is inconclusive, not unavailable
- fedexpickup-availability serviceType uses FEDEX_ prefix
- fedexpickup-availability body per-country + defensive parse
- fedexfix pickup-availability URL path
- pickupssaved-address picker + visible carrierStatus + tipo de retorno
- rulesper-rule schedule (day-of-week + time-of-day window)
- rulesinsurance-by-value + signature-by-value detectors
- rulesuniqueSkuCount field
- rulescustomer.orderCount + customer.lifetimeSpendCents fields
- rulesHOLD_UNTIL_DATE action + cron sweep
- rulesASSIGN_TO_USER action + Order.assignedToUserId
- rulesLABEL_PURCHASED trigger
- shopifyadd read_inventory + read_locations scopes
- channelper-channel ship-by refinement
- channelinvoice number on commercial invoice
- channelmulti-location → multi-warehouse mapping
- channelpre-order / backorder auto-hold
- channelAmazon FBA vs FBM filter
- channelcustomer-update webhook (Shopify)
- channelinventory webhook entrante (Shopify)
- opscron-credential-check Railway Function + analytics docs
- analyticscomparative carrier mix what-if
- analyticssimple volume forecast (next 30 days)
- analyticscustomer cohort + repeat-rate
- analyticsSLA + handover cycle time
- analyticsreturn rate by channel + top returned SKUs
- analyticsper-warehouse performance
- analyticsrefund + chargeback rate
- analyticsservice on-time performance
- analyticssurcharge incidence breakdown
- analyticscost-per-shipment trend (12-week sparkline)
- shipmentslook up by carrier reference
- trackdrop-off finder on buyer-facing page
- carriersmultiple reference fields per package
- carriersinvoice retrieval framework + EasyPost impl
- carriersdaily credential health check + inline chip
- carriersmulti-tracking lookup batching in cron
- carriersDIM weight pre-flight hint
- carriersaddress classification (residential/commercial)
- carriershazmat surcharge in rate-shop
- carrierspickup availability pre-flight
- carriersitemised surcharge breakdown in rate-shop
- carriersService Guarantee refund tracking
- carriershazmat + drop-off finder + service-code picker + carrier ETA
- carriersPOD + hold-at-location + QR returns + adapter address-validate
- carrierscancel pickup API + push tracking webhooks + claim doc upload
- claimsreal carrier + insurance API filing (UPS / FedEx / Shipsurance / XCover)
Sunday, May 10
12 updates- manifestsreal carrier-side close (EasyPost SCAN form + FedEx Ground)
- pickupsreal carrier API integration (UPS/FedEx/DHL/EasyPost) + inline opt-in on label buy
- new labelfull Advanced options + parity with order-buy customs enrichment
- apiinsurance quote accepts Bearer + add address/validate to /docs + /#api
- rules editor'Describe with AI' assistant turns plain English into rule shape
- Support chatAI-powered widget on marketing + tenant surfaces, /admin/inbox
- rulesmine recurring operator behaviour, surface as one-click suggestions
- orders + shipmentsdelete row when integration is disconnected
- shipmentsbulk Void + Print labels disable when nothing actionable in the selection
- shipmentsrender "Quick label" badge for standalone (orderId-null) rows
- labelsship-to also gets the Warehouse mode (warehouse-to-warehouse + supplier-to-warehouse)
- labelsship-from / ship-to support address-book + new-with-save
Saturday, May 9
2 updates- labelsstandalone label flow at /labels/new — buy without an Order
- settingsgroup sidebar by concern (Workspace / Team / Billing / Operations / Developer)
Friday, May 8
4 updates- authopt-in passkey (WebAuthn) sign-in alongside password+TOTP
- gitignoreexclude .claude/ working directory
- etsyBYO clientId fallback when operator app isn't approved
- emailadd Shipnest brand mark + polish the html shell
Thursday, May 7
15 updates- carriersthread isDemoOrg into the realRows.map() CarrierRow too
- parcelsfilter Packaging dropdown to enabled carriers
- authforgot-password + welcome + invite + 2FA emails
- order detail + parcelsbump grid breakpoints to avoid cramped cards
- returnsper-tenant portal config (reasons, window, intro)
- returnssurface the portal URL on /returns
- order detailpin nav cluster to the left, arrow keys for prev/next
- returns portalblock returns until delivery
- returns portalmatch email case-insensitively
- order detailprev/next chevrons in topbar to skip the list bounce
- parcels editorstop labels and selects wrapping in narrow cards
- order detailtighten layout to fit more above the fold
- errorsparse API JSON bodies before surfacing in toasts
- logintwo-step sign-in — only ask for 2FA when enrolled
- logincollapse 2FA field behind a disclosure
Wednesday, May 6
12 updates- fedexpersist encodedLabel base64 instead of session-bound url
- orderspersist parcel edits per order so they survive navigation
- rate-shopcollapse PartialFulfillmentPicker by default + disambiguate
- guide + cookiesdrop residual USPS-OAuth claims, leave privacy/terms
- carriers + landingadmin can delete PLATFORM rows; clean USPS-OAuth copy
- fedexprefer ACCOUNT rate over LIST when Rate v1 returns both
- carriersdrop dead USPS-OAuth branches in ConnectDialog, update portal URL
- carriersprotect PLATFORM rows from merchant deletion
- uspsdrop operator-side OAuth path, keep tenant-BYO manual paste
- easypostspell out the most common NO_RATES root causes
- easypostthrow NO_CARRIERS_LINKED / NO_RATES on empty rate response
- carriersrender all CarrierAccount rows + offer "Connect your own"
Saturday, May 2
5 updates- ordersper-field local-edit protection across channel re-syncs
- uikeep Badges on a single line + bump orders Status column
- orderswarn when a split child's ship-to diverges from the parent
- orderssplit children inherit parent's channel identity
- shipmentsmove parseLineItems out of the use-server module
Friday, May 1
18 updates- guide + CLAUDE.mddocument partial fulfillment, splits, cancel-on-void
- ordersyellow "Partially shipped" badge
- orderspartial fulfillment + keep-original split
- split-dialogkeep the Total column status on one line
- orderssplit dialog handles same-SKU lines and per-line qty splits
- rate-shoptighten DDP / payer-picker UX
- rate-shopprecise DDP warnings keyed on the selected quote's source
- orderssurface channel-synced tags in the order detail Add-tag picker
- parcelsrender Value as decimal currency, drop the cents glyph
- shipmentscancel channel fulfillment on void, all 8 adapters covered
- ordersbadge disconnected channels in the Channel column
- shipmentsblock reprint + open + download on VOIDED labels
- shopifyadd always-on Re-authorize entry to Advanced menu
- shopifyswitch to granular fulfillment_orders scopes
- uiswitch modal centring to inset-0 + auto-margins
- uistabilise scrollbar gutter so modals stop flashing on open
- rulesgate /rules + /rules/[id] on automations feature flag
- upsparse track-API date+time correctly + guard page render
April 2026
235 updatesThursday, April 30
29 updates- upsmove SoldTo inside InternationalForms + add Shipment.InvoiceLineTotal
- upsfix InternationalForms child order to match XSD
- upsstringify BUY REQUEST log so the body actually shows
- upsbuild Shipment in XSD order + add Contacts.SoldTo
- upslog request body unconditionally + on error
- upspass warehouse phone + reorder Shipper fields
- upsrequire dimensions on international + add TaxIDType / weight desc
- upspre-flight EORI requirement + sanitize Shipment.Description
- upsdump full ship-request body on UPS rejection
- upsstrip non-alphanumeric chars from InvoiceNumber
- upsenrich commercial invoice + dump request body on rejection
- upsadd ProductWeight + sanitize HS code on commercial invoice
- shipmentspre-flight customs check + 0g item weight fallback
- carriershide markup card + redundant platform banner from merchants
- rate-shopfull service name on its own line, no more truncation
- rate-shopdemo quotes only on demo org + clear address-missing state
- shopify/oauthtrigger initial sync at install completion
- carrierssurface platform-overlap toast on customer-account connect
- billingenforce batchBuy / apiKeys / webhooks plan gates
- signupforward trial_period_days into Stripe Checkout
- signupdrop duplicate Workspace name field, derive placeholder
- rulestag autocomplete on ADD_TAG / REMOVE_TAG + demo example
- shipmentsper-shipment + rule-driven "Notify customer" control
- backfillskip automation rules during historical-order pull
- integrationsadd "Backfill all orders" action for full historical pull
- brand-markswap EasyPost tile for the icon-only variant
- brand-markswitch carriers to baked tiles + drop simple-icons
- brand-markrefresh all 8 channel tile assets
- brand-markswitch every channel to baked-tile artwork
Wednesday, April 29
6 updates- brand-markreplace eBay logo with high-res version
- brand-markreplace Magento logo with high-res version
- brand-markuse Amazon "a + smile" logo
- brand-markuse authentic eBay / Magento / Woo logos
- ebayadd Marketplace Account Deletion compliance endpoint
- dashboardsurface "Admin console" button to platform admins
Tuesday, April 28
10 updates- guideswitch to MarketingHeader so /, /guide, /contact share chrome
- contactuse the marketing landing header instead of PublicHeader
- contactswitch to shared PublicHeader for full chrome consistency
- contactalign header inner width with /guide /docs /status /changelog
- reports crondrop hourly heartbeat email
- settingspin sidebar to top-0 + full viewport height
- billingrender last 12 invoices inline with View + PDF links
- public-headerpin to max-w-6xl across all routes
- emailbump send timeout 10s → 30s to reduce false-positive fallback fires
- public-headershared chrome across /guide /docs /status /changelog
Monday, 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
6 updates- 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
Friday, April 24
31 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
- 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
- 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
- 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
- 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
- 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
46 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
- Customs declarationscurrency-aware, persisted, paperless-ready
- 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
- buyLabelForOrderactually consume rule hints
- Rulesunify fields/operators/actions in a single registry
- 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
- 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
46 updates- 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
- Fix Magento connect bug + product sync for Squarespace / Magento
- Gate tenant integrations by operator env config
Tuesday, April 21
58 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
- Integrationsreal connect / manage UI
- Batchwire to real quote + buy actions
- 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)
- 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
- Use persistNormalizedOrder in POST /api/orders/sync too
- 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