Changelog

What’s new in Shipnest

May 2026

198 updates

Friday, 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 updates

Thursday, 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
Changelog · Shipnest