Avery
RuntimeUse casesPricingHelpBlog
← All postsBlog

Build a custom shipping and logistics tracker (ShipStation alternative)

2026-06-10 · Avery NXR

ShipStation is fine. For most e-commerce stores moving fewer than 100 orders a day with standard carriers, it does the job and the price is reasonable.

It stops being fine when your workflow doesn't fit ShipStation's model. You have a regional carrier ShipStation doesn't support. You need a custom hand-off between two warehouses. Your label templates need branding that ShipStation can't produce. Your customer notifications need to flow through your CRM, not just email. You're now using ShipStation for 60 percent of orders and manually handling the other 40 percent in Google Sheets.

That is the moment a custom shipping and logistics tracker becomes economic. With Avery, the build is four days. With ShipStation, every workaround for your edge cases is a recurring tax on your operations team.

This post is for the founder or ops lead who has outgrown ShipStation. Not the one who's never used it.

What custom shipping software actually does

The functional requirements break into five areas:

Order ingestion. Orders come from your store (Shopify, custom, Stripe, manual entry). They land in your system as ready-to-ship orders with customer address, items, shipping method preference.

Label generation. For each order, generate a shipping label via your carrier (UPS, USPS, FedEx, regional carriers). Store the label PDF and tracking number.

Carrier integration. Multiple carriers, automatic routing based on rules (cheapest for under 2 lbs, fastest for orders flagged as priority, specific carrier for international). This is the part that gets messy with off-the-shelf tools.

Tracking updates. When the carrier updates tracking status, your system catches the webhook, updates the order status, and triggers customer notifications.

Internal dashboard. Ops team sees orders pending, in transit, delivered, with filters and bulk actions. Customer service team can look up any order quickly.

That's the system. Eight to twelve CRs depending on how many carriers you integrate.

When ShipStation is still the right answer

You ship under 50 orders per month and have standard carriers.

You don't have specific workflow needs that ShipStation can't accommodate.

You want vendor support and have no engineering capacity to maintain.

Most founders building their first product should stick with ShipStation. The custom build pays off when ShipStation becomes a workaround layer instead of a shipping tool.

The Avery build

CR 1: Order data model.

"Build an Order model with id, order_number (unique), customer_name, customer_email, ship_to_address (JSON: street, city, state, zip, country), items (JSON array: sku, quantity, weight_lbs, dimensions), preferred_shipping (enum: standard, expedited, overnight, international), priority_flag (boolean), status (enum: pending, label_generated, in_transit, delivered, exception, returned), created_at. Add migrations and types."

CR 2: Order ingestion endpoints.

"Build a Shopify webhook endpoint that receives order creation events and inserts into the Order model. Build a manual order entry form at /admin/orders/new. Build a Shopify webhook endpoint for order updates (cancellations, address changes)."

CR 3: Carrier integration via Shippo or EasyPost.

"Integrate with the Shippo API. Build a generate_label function that takes an Order, picks the appropriate carrier and service based on weight, destination, and priority_flag, and returns a Label object with tracking_number, label_pdf_url, cost. Store labels in S3."

CR 4: Carrier selection rules.

"Build a CarrierRule model: priority, condition_type (enum: weight_below, destination_country, priority_flag), condition_value, preferred_carrier (enum: USPS, UPS, FedEx, DHL), preferred_service. On generate_label, evaluate rules in priority order and pick the first match. Default to USPS Priority Mail."

CR 5: Custom label templates.

"Allow custom branding on shipping labels. Build a LabelTemplate model with logo_url, return_address, packing_slip_text. Generate a packing slip PDF separate from the carrier label. Include both PDFs in a single ZIP downloadable from the order detail page."

CR 6: Tracking webhook handler.

"Build a webhook endpoint at /api/tracking-webhook that receives Shippo's tracking update events. Parse the event, find the matching order by tracking_number, update the order status (in_transit, delivered, exception). Log every update to a TrackingEvent table."

CR 7: Customer notification engine.

"On TrackingEvent creation, trigger appropriate customer notifications: in_transit triggers 'your order is on its way' email with tracking link. Delivered triggers 'your order arrived' email. Exception triggers a CS team alert (not customer-facing). Use the existing email integration and template system."

CR 8: Ops dashboard.

"Build /ops/dashboard showing: orders pending label generation (sortable by created_at), orders in transit (sortable by ship date), exceptions in last 7 days, today's shipped count, this week's shipped count. Quick actions: bulk generate labels, bulk mark exceptions reviewed."

CR 9: Customer service order lookup.

"Build /cs/orders/[order_number] showing full order details, label history, all tracking events with timestamps, customer notifications sent. Allow CS to re-send notifications, regenerate label (with reason logged), mark as resolved."

CR 10: Internal warehouse hand-off.

"Add a WarehouseAssignment model: order_id, warehouse_id, assigned_at, picked_at, packed_at. Build /warehouse/[id]/queue showing orders assigned to that warehouse with pick/pack workflow. On pack completion, trigger label generation."

That covers v1. Add carrier-specific CRs as needed (DHL for international, regional carriers for specific zones).

What ShipStation does better

Direct carrier negotiations. ShipStation has volume discounts with USPS, UPS, FedEx that small custom builds can't match without significant volume.

Plug-and-play marketplaces. Shopify, Amazon, eBay, Etsy all have native ShipStation connectors. Custom requires building each integration.

Mobile app. ShipStation has a usable mobile app for warehouse staff. Custom requires either responsive design (sufficient for most cases) or a separate mobile app (significant additional effort).

For 80 percent of small e-commerce, these matter more than custom workflow. For the 20 percent where workflow matters more, custom wins.

Where custom shines

Multi-carrier intelligent routing. ShipStation's routing rules are limited. Custom can route based on any combination of factors you define.

Custom warehouse hand-offs. ShipStation assumes one location. Multi-warehouse fulfillment with custom rules (item X always ships from warehouse 2, certain orders split across warehouses) requires custom logic.

Branded customer experience. Your tracking page, your notification emails, your branding throughout. ShipStation's branded tracking has limits.

Integration with your CRM and inventory. Custom is built on your data layer. ShipStation is a separate system you sync to.

Long-tail carrier support. Regional carriers, international specialists, white-glove delivery services. ShipStation supports the major carriers well; custom can support whoever you need.

Things that surprise people

Carrier APIs are not as clean as they should be. UPS, FedEx, USPS all have legacy APIs with quirks. Shippo and EasyPost wrap them, which is why I recommend going through Shippo first. Direct carrier integration is a project for later when you've outgrown Shippo's pricing.

Address validation is its own subproblem. Customers enter bad addresses. Shippo includes basic validation, but borderline cases (suite numbers, rural routes) need manual review. Build an address-validation step into the order ingestion flow.

International shipping has customs forms, duties, and tax implications. Don't try to handle international in v1. Add it in v1.1 with a dedicated CR per country if needed.

Returns are not in v1. Returns are a whole separate workflow with their own logic. Build the outbound shipping system first, get it working, then tackle returns.

What this costs to run

Vercel or Railway: $40 to $80 per month (more compute for label generation).

Postgres: $25 to $50 per month.

S3 for label storage: $10 to $40 per month at moderate volume.

Shippo or EasyPost: pay per label generated, similar to what ShipStation charges per shipment.

Total: $75 to $200 per month for the system, plus per-label costs.

Versus ShipStation paid plans starting at moderate per-month fees scaling with shipment volume.

The crossover point is around 500 shipments per month. Below that, ShipStation is fine. Above that, custom starts to pay back if you have specific workflow needs.

The strategic call

The decision usually breaks down to one question: are you fighting ShipStation more than you're using it?

If yes, that fight is a recurring tax that AI-assisted custom builds can eliminate. The custom build is a one-time cost. The ShipStation friction is forever.

If no, ShipStation is still the right answer. Don't over-engineer.

The breaking point is usually around 100 to 500 daily orders with non-standard workflow. Below that, ShipStation. Above that, custom.

The v1.1 additions

Returns workflow. Customer requests return, label generated, refund triggered on receipt. Three CRs.

Inventory integration. Reserve inventory on order, decrement on ship, restock on return. Two or three CRs.

Multi-store support. Same instance handles Shopify, Etsy, and Amazon orders. Two CRs per marketplace.

International with customs forms. Auto-generate commercial invoices, harmonized codes, duty estimates. Three or four CRs.

Predictive demand. Forecast shipping volume by day to staff the warehouse correctly. Two CRs once you have six months of data.

Each is incremental. Ship the v1 core and add as your operations grow.