- Platform
- Responsive Web App
- Duration
- 14 weeks
- Industry
- Shipping and logistics
- Read time
- 8 min
The short answer
RaftLabs was UrShipper's fifth attempt to build a multi-carrier shipping SaaS after four previous vendors failed to deliver a stable platform. RaftLabs rebuilt UrShipper from scratch in 14 weeks: stable API integrations for FedEx, DHL, UPS, and Aramex (built directly, including backend PDF invoice generation), a Shopify connector for automatic order fulfillment, and three role-specific portals for customers, staff, and admins. The rebuilt platform migrated 200+ existing customers without service disruption, attracted 92 new business signups in the first two months, and processed 2,000+ shipments across 70+ countries in year one. Built using Hasura, React, Next.js, and AWS.
Gil Nugraha built UrShipper because he ran an eCommerce brand and spent too much time comparing rates by hand, calling courier offices, and chasing tracking updates. He knew other small merchants had the same problem. Before us, he had tried four times to build the platform. Each attempt ended the same way: carrier integrations that broke silently, wrong rates returned with no error, and no shipment visibility once a parcel left the warehouse.
We were his fifth attempt. We rebuilt UrShipper into a production-ready multi-carrier SaaS with stable FedEx, DHL, UPS, and Aramex integrations, a Shopify connector for automated order fulfillment, and three role-specific portals. 200 businesses migrated without service disruption. 92 new merchants signed up in the first two months. 2,000+ shipments processed across 70+ countries in year one. The same pattern of carrier complexity, migration risk, and portal architecture applies to any logistics SaaS targeting eCommerce merchants, whether in Southeast Asia, the US, or the UK.

before & after
What changed
- Four previous development attempts had failed to produce a stable platform, each leaving Gil with the same carrier API problems, poor UX, and no clear path forward
- Carrier API integrations broke silently: FedEx, DHL, and UPS connections returned wrong rates or missing insurance details without surfacing an error, so merchants booked shipments on incorrect pricing
- No unified portal existed: customers created shipments in one interface, staff managed them in another, and admins in a third, with no shared data view and no way to see a complete record in one place
- Shopify orders had to be imported manually: staff copied order details one by one before shipping could begin, which made fulfillment volume a direct function of headcount
- Merchants received no proactive updates on delays or tracking changes; every status question became a support email or phone call
- Label generation, parcel re-measurement, and product grouping for delayed dispatches all required manual work for every affected shipment
- Aramex, FedEx, DHL, and UPS rates surface in real time for every shipment with accurate insurance details; API failures are caught and retried before the user sees a result
- Customer, staff, and admin portals share the same data layer: each role sees the information relevant to their function without duplicating work across separate systems
- Shopify stores connect directly: orders import automatically, and tracking numbers are fulfilled back to Shopify once a label is created, with no manual data entry
- Delay alerts and tracking status updates push to customers automatically; staff handle exceptions rather than fielding routine status questions
- Label generation, parcel grouping, and re-measurement are automated; staff time moves from routine processing to operations that actually need judgment
What we had to solve
- 01
Making carrier API integrations resilient when FedEx, DHL, and UPS return inconsistent or delayed responses
Carrier APIs, especially for international shipments, time out, return partial data, and occasionally change response schema without notice. A rate comparison that silently fails or returns an incorrect rate is worse than no rate at all; it erodes trust in a tool merchants are relying on to make cost decisions. The architecture used AWS SQS to queue carrier requests and Lambda to process them asynchronously, so slow or failed carrier calls could retry without blocking the user's interface. Response validation caught schema inconsistencies before they reached the rate display.
- 02
Migrating 200 active customers to the new platform without interrupting live shipments
A SaaS migration where customers experience downtime loses accounts. UrShipper had 200 live merchants when we started the rebuild, running active shipments who could not afford a gap in tracking access, label generation, or carrier booking. The migration ran in phases with account-level transitions, so each customer's data, history, and carrier account connections moved to the new platform before their access switched. Zero shipments were interrupted during the cutover.
- 03
Building the Aramex integration from scratch, including backend PDF invoice generation
Aramex was not available through the existing Shippo aggregator layer for tracking and invoicing, so we built the entire integration directly: rate calculator updates, order flow, label generation, and document upload. The hardest constraint was the commercial invoice. Aramex required the PDF to be generated in the backend at the moment of shipment creation and uploaded through the Aramex API as part of that call. The existing frontend invoice flow could not be reused. This forced a new backend document generation pipeline and direct handling of Aramex customs values, insurance thresholds, and goods description limits.
outcomes
What we achieved
The previous platform's carrier API failures meant bookings had to be recalculated manually and customers could not rely on rates being accurate for international shipments.
A fragile platform with no unified view across customer, staff, and admin roles created operational blind spots that grew harder to manage as shipment volume increased.
The old platform's poor UX and unreliable carrier rates prevented UrShipper from attracting new business customers at the pace the Indonesian eCommerce market demanded.
What clients say
What Our Client Say About Us
Three-year average engagement. Founders and operators describing the work in their own words. No marketing varnish.

I definitely recommend RaftLabs, especially to solo founders like me. Their clear communication and detailed discussions have always helped me make better decisions.
Your shipping platform has been rebuilt before and still isn't right?
the build
What we built
UrShipper is built for the operational reality of a small eCommerce team: one or two people processing dozens of shipments a day who need the platform to do the routine work without margin for error.
Merchants see final rates across all carriers before committing
Merchants compare rates from FedEx, DHL, UPS, and Aramex in real time for each shipment, with final prices shown upfront including insurance and no hidden fees. Merchants can use UrShipper's negotiated rates or connect their own carrier accounts. A consolidated invoice covers all carriers, so billing does not require reconciliation across separate carrier statements.

Order received to label generated, manual steps removed from the workflow
Merchants connect their Shopify stores and orders sync automatically, with no manual import. Once a shipment is created and a label is generated, the tracking number fulfils back to Shopify automatically. Live carrier rates display at checkout based on the buyer's address. The manual steps that previously consumed staff time between "order received" and "label generated" are removed from the workflow.

Customers, staff, and admins all work from the same data
The dashboard shows total shipments, spend by carrier, countries served, average delivery time, and monthly volume trends. Filters drill down by carrier, service type, or date range. Customers, staff, and admins each see the same underlying data through their role-appropriate view: no duplicated records, no version mismatches between what the customer sees and what operations is working from.

Shipping costs fall as volume grows: merchants move up automatically
Shipping costs decrease as volume grows through a four-tier discount structure. Merchants move up to the next tier automatically when they hit a spend threshold, and a grace period prevents them from losing their discount if one month falls short. The mechanic gives growing merchants a concrete commercial reason to consolidate their shipping volume through UrShipper rather than splitting across carriers directly.

Engagement
How we worked together
- 01Weeks 1–2
Discovery and scoping
We map the problem before writing code. Two weeks of technical audit, stakeholder interviews, and prototype — so both teams align on scope and risk before sprint one. - 02Ongoing
Two-week Agile sprints
Each sprint ends with working software, not a status update. You review a real build, request changes, and approve before we move forward. No surprises at handover. - 03Ongoing
Daily async updates
Slack for daily progress, Asana for task visibility, weekly video calls for decisions. You have full visibility without needing to attend every meeting. - 04Final
Handover and warranty
Full code handover with deployment runbooks and documentation. Thirty-day warranty period for production issues at no extra cost.
stack
Why we chose this stack
- 01Three distinct portals (customer, staff, admin) each needed different data views over the same underlying shipment records. Hasura's role-based permission layer let us configure what each portal could read and write without building separate API surfaces. Real-time subscriptions pushed shipment status changes to all affected parties immediately.Hasura
- 02The customer, staff, and admin portals had significantly different interaction patterns (different workflows, different data densities, different action sets). React SPAs for each portal kept the interface logic isolated and allowed Ant Design components to deliver a consistent but role-appropriate experience across all three surfaces.React
- 03Public-facing pages and the Shopify storefront integration needed fast server-side rendering so merchant storefronts loaded instantly and the live carrier rate display at checkout did not delay the buyer's experience. Next.js served those surfaces with the performance the eCommerce context required.Next.js
- 04SQS queued carrier API requests so slow or failed calls could retry asynchronously without blocking the rate comparison UI. Lambda processed the queue and handled event-driven shipment status updates. Cognito managed authentication across three portals with separate access control per role.AWS
Common questions about UrShipper
When a merchant creates a shipment, they enter the parcel dimensions, weight, origin, and destination. UrShipper queries the connected carriers (FedEx, DHL, UPS, Aramex) simultaneously and returns their rates in a comparison view. Each rate shows the final price including insurance and surcharges with no hidden line items added at checkout. Merchants select the rate that fits their delivery requirement and cost preference; the platform books directly with the chosen carrier and generates the label. The merchant can also set rules to auto-select the cheapest or fastest option for specific routes without manual review.
Before the integration, staff manually copied order details from Shopify into the shipping platform for every order, a step that consumed significant time as order volume grew and introduced entry errors. After integration, orders sync automatically from the connected Shopify store. Staff review the imported order, confirm dimensions if needed, and create the shipment. Once the label is generated, the tracking number fulfils back to Shopify automatically and the customer receives the shipping confirmation from their store. The manual data transfer step is eliminated entirely.
Zero shipments were interrupted. The migration ran in account-level phases: each customer's data, shipment history, and carrier account connections were transferred to the new platform and verified before their access switched. We did not cut over all accounts simultaneously: the phased approach meant any issue with a specific account's migration could be resolved without affecting other accounts. Customers received clear communication before and during their transition. The migration was completed with no service disruption across 200 accounts.
Yes. Merchants who already have negotiated rates with specific carriers can connect their own carrier accounts and have those rates displayed alongside UrShipper's rates in the comparison view. Merchants choose which rate to book against on a per-shipment basis. For merchants who do not have existing carrier accounts or whose volume does not qualify for negotiated rates, UrShipper's consolidated rates apply automatically.
Most multi-carrier shipping platforms fail because carrier APIs are treated like simple plug-and-play integrations. In practice, each carrier has its own rules around rate calculation, insurance thresholds, tracking behavior, label generation, customs documentation, and invoice requirements. FedEx, DHL, UPS, and Aramex do not behave the same way. Some of these rules only surface during testing: even clients who understand their own product often do not know every carrier-specific constraint at the start. A reliable platform needs carrier-specific logic built for each integration, not a single generic flow. Platforms that force all carriers through one pattern encounter silent failures, wrong rates, and broken tracking that erode customer trust before they have a chance to grow.
We rebuilt UrShipper, covering integrations for five carriers (FedEx, DHL, UPS, Aramex, and Shippo), a Shopify connector with automatic fulfillment, three role-specific portals, a tier-based discount engine, consolidated invoicing, and real-time tracking, in 14 weeks. The phased migration of 200 live accounts ran in parallel with the final build and launch. A platform covering two or three carriers without the three-portal architecture would be faster. Adding carrier integrations for markets with less standardized APIs, including regional carriers in Southeast Asia, extends the timeline. Contact us to scope based on the carriers, markets, and portal structure your platform requires.
Cost depends on the number of carrier integrations, the portal structure, and how standardized those carrier APIs are. UrShipper required integrations for five carriers, three distinct portals for customers, staff, and admins, Shopify connectivity, a tier-based discount engine, consolidated invoicing, and real-time tracking built in 14 weeks on a fixed-price engagement. A platform covering two or three carriers with a simpler admin structure is a smaller scope and lower cost. Carriers with undocumented or unstandardized APIs add time and cost because integration and testing take longer. Contact us with your carrier list, target markets, and feature requirements for a scoped estimate.











