- Platform
- Responsive Web App
- Duration
- 14 weeks
- Industry
- Shipping and logistics
- Read time
- 6 min read
Gil Nugraha built UrShipper because he ran an eCommerce brand himself and spent too much time calling courier offices, manually comparing rates across FedEx, DHL, and UPS, and chasing shipment updates. He knew other small eCommerce operators had the same problem. The first version of the platform he built with earlier vendors had carrier API integrations that broke silently, returned wrong rates, and gave customers no visibility once a parcel left the warehouse.
He came to us to rebuild it properly. We rebuilt UrShipper from a fragile first version into a production-ready multi-carrier SaaS: stable API integrations for FedEx, DHL, UPS, and Aramex, a Shopify connector that automates order import and tracking fulfilment, and three distinct portals for customers, staff, and admins. 200 existing customers migrated without a service disruption. 92 new businesses signed up in the first two months. 2,000+ shipments processed across 70+ countries in year one.

I definitely recommend RaftLabs, especially to solo founders like me. Their clear communication and detailed discussions have always helped me make better decisions.
before & after
What changed
- Carrier API integrations broke silently: FedEx, DHL, and UPS connections returned wrong rates or missing insurance details without surfacing an error, so customers made bookings on incorrect pricing
- No unified portal existed: customers created shipments in one interface, staff managed them in another, and admins operated in a third with no shared data view and no way to see a complete shipment record in one place
- Shopify orders imported manually: staff copied order details one by one before shipping could begin, which made fulfilment volume a direct function of staff hours
- Customers 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 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 customers when we started the rebuild, merchants 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.
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 carrier integration failures and customers are noticing?
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
- 01HasuraThree 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.
- 02ReactThe 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.
- 03Next.jsPublic-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.
- 04AWSSQS 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.
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 at scale 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.
We rebuilt UrShipper (stable API integrations for four carriers, Shopify connector with automatic fulfilment, three role-specific portals for customer, staff, and admin, tier-based discount engine, consolidated invoicing, and real-time tracking) in 14 weeks. The phased migration of 200 live accounts happened in parallel with the final build and launch. A platform covering fewer carriers or without the three-portal architecture would be faster. Adding carrier integrations for markets with less standardized APIs (some regional carriers in Southeast Asia) extends the timeline. Contact us to scope based on the carriers, markets, and portal structure your platform requires.