Shipment Tracking Platform Development

Build custom app solutions with Scrums.com's expert development team. With an NPS (Net Promoter Score) of 82, Scrums.com crafts cost-effective, custom applications that drive results.

Engineering teams building shipment tracking platforms face compounding scale problems: polling hundreds of carrier APIs reliably, normalising wildly inconsistent event codes into a coherent status taxonomy, and triggering notifications at volume without duplicate sends. Scrums.com builds dedicated teams around your tracking domain: engineers who design carrier integration layers, tracking event pipelines, notification engines, and delivery analytics infrastructure. Every system is built for logistics SaaS companies and e-commerce platforms serving merchants, not for an individual consumer tracking a single package.

Carrier Integration and Shipment Ingestion Architecture

Multi-carrier tracking requires a connector architecture that isolates carrier-specific logic from the platform core. Each carrier adapter implements a standard interface: given a tracking number, return a list of tracking events in a normalised intermediate format. Carrier API credentials are stored per merchant, encrypted at rest: raw credentials never appear in application logs or unencrypted database columns. A carrier_connectors registry maps carrier codes to adapter classes with configuration for rate limits, retry policies, and supported event types.

Tracking events land in a tracking_events append-only table: event_id, shipment_id, carrier_id, event_code, normalised description, location, event timestamp, ingested timestamp, and a raw_payload JSONB column preserving the original carrier response. Preserving raw payloads means historical events can be re-parsed when a carrier changes their event codes without losing source fidelity. A UNIQUE constraint on (shipment_id, carrier_event_id) prevents duplicate events from both polling and webhook paths landing in the same table.

Polling schedules are configurable per carrier and service level: express shipments poll every 15 minutes, standard every two hours. A poll_log records each attempt with HTTP status, events returned count, and any error payload. Carriers that support push bypass polling entirely: their events write directly to tracking_events through the same ingestion path as polled events. The deduplication constraint handles the case where a shipment transitions to webhook delivery mid-journey after being set up as a polled shipment.

Shipment Status Normalisation and State Machine

Carrier event codes are inconsistent across providers and sometimes within a single carrier across service lines. The platform maintains a carrier_event_code_map table: carrier ID, raw event code, normalised platform status, and normalised description. This mapping is updateable without a code deployment: when a carrier adds or changes event codes, a data migration updates the map; no application release is required. Carrier-specific edge cases (a carrier that reuses the same code for both a delivery attempt and a successful delivery depending on accompanying text) are handled by pattern-matching rules in the normalisation layer.

The platform status state machine is: CREATED / CARRIER_PICKED_UP / IN_TRANSIT / OUT_FOR_DELIVERY / DELIVERED | EXCEPTION | RETURNED. A shipment_status_history append-only table records every transition: shipment ID, normalised status, source event ID, and transitioned timestamp. Current status is derived from the latest record; the shipments table never holds a mutable status column. ETA prediction is updated on each new tracking event: a model trained on historical transit data by carrier, lane, and service level writes a new row to shipment_eta_predictions with a confidence interval. Merchants consume the latest prediction via the API; older predictions are retained for model performance analysis.

Shipment tracking platforms like these are built and delivered by dedicated engineering teams through our mobile app development service.

Customer Notifications and Branded Tracking Pages

Notification rules are merchant-configurable in a notification_rules table: trigger status, channel (EMAIL, SMS, PUSH, WEBHOOK), template ID, optional delay in minutes, and active flag. When a shipment transitions to a trigger status, the notification engine evaluates all matching rules for the shipment's merchant and enqueues notification jobs. Template rendering is locale-aware: templates are stored in a notification_templates table with a locale column; the rendering engine selects the best match from the customer's locale preference or the merchant's default locale.

Notification events are append-only: sent timestamp, delivered timestamp (from the channel provider's delivery receipt), opened timestamp (email pixel), and clicked timestamp (UTM link tracking). No notification record is overwritten. Deduplication logic prevents a status transition from triggering the same notification twice if a carrier emits duplicate events. A notification_suppression table handles opt-out preferences without requiring hard deletes (suppressed contacts are excluded at the routing stage, not deleted from the notifications table).

Branded tracking pages are configured per merchant: subdomain, brand colour, logo URL, and optional custom CSS URL. Each merchant's customers land on tracking.merchantdomain.com/trackingNumber for status updates without seeing the platform provider's branding. Page views are recorded using hashed IP and hashed user agent; no raw PII in the analytics table. An optional returns flow CTA surfaces on DELIVERED status if the merchant has returns enabled, initiating a return_request record linked to the original shipment.

Delivery Analytics, SLA Monitoring, and Carrier Scorecard

Delivery performance analytics are built as materialised views over append-only event tables. The delivery_performance view computes on-time delivery rate, average transit days, exception rate, and first-attempt success rate, sliced by carrier, service level, origin region, destination region, and time period. A carrier_sla_config table stores promised transit days by carrier, service level, and origin-destination zone pair; on-time calculation compares actual delivery timestamp against the promised window derived from this config at ship date, not at delivery date.

SLA breach events are written when actual delivery exceeds the contracted window: shipment ID, carrier ID, service level, promised delivery, actual delivery, and breach duration in hours. These feed a carrier scorecard (materialised view refreshed weekly) showing on-time rate, exception rate, average claims value, and average transit days per carrier per lane, designed as the primary input for carrier QBRs and contract renegotiation rather than requiring manual data extraction.

A claims workflow handles lost, damaged, and delay claims: claim ID, shipment ID, claim type enum, amount claimed, carrier reference, status lifecycle, and resolved timestamp. Multi-carrier rate shopping at label creation fetches quotes per carrier and service level, stores them in a rate_quotes table with a validity window, and logs the chosen option and selection reason in a carrier_selection_log. Outbound webhooks to merchant systems use HMAC-SHA256 request signing with per-merchant secrets and a configurable retry policy with exponential backoff.

Frequently Asked Questions

How do you handle inconsistent carrier event codes across multiple providers?

A carrier_event_code_map table maps each carrier's raw event codes to a normalised platform status. The table is updateable without a code deployment: when a carrier adds or changes event codes, a data migration updates the map. Carriers with ambiguous codes (same code, different meaning depending on context) are handled by pattern-matching rules in the normalisation layer, not hardcoded in application logic.

How do you prevent duplicate notifications when carrier data has anomalies?

Deduplication operates at two levels. A UNIQUE constraint on (shipment_id, carrier_event_id) in the tracking_events table prevents the same carrier event from being ingested twice. The notification engine also checks for an existing notification record in the same trigger-status window before enqueuing a new job. Duplicate status transitions caused by carrier data anomalies do not result in customers receiving multiple messages for the same event.

How does the ETA prediction model work at scale?

ETA predictions are updated on each new tracking event using a regression model trained on historical transit data segmented by carrier, service level, and origin-destination lane. Each prediction is written as a new append-only row to shipment_eta_predictions with a confidence interval. The model is retrained on a rolling window of delivery outcomes. Merchants always consume the latest prediction via the API; older predictions are retained for model performance analysis.

How is carrier performance measured for procurement decisions?

SLA breach events are written when actual delivery exceeds the contracted window and feed a carrier scorecard materialised view (refreshed weekly) showing on-time rate, exception rate, average claims value, and average transit days per carrier per lane. The scorecard is designed as the primary input for carrier QBRs and contract renegotiation rather than requiring manual data extraction from multiple reports.

How does multi-carrier rate shopping work at label creation?

Rate shopping at label creation fetches quotes per carrier and service level, stores them in a rate_quotes table with a validity window, and logs the chosen option and selection reason in a carrier_selection_log. The cheapest qualifying service level is selected, or overridden by a customer-account-level preference stored in account_shipping_rules. Outbound webhooks to merchant systems use HMAC-SHA256 request signing with per-merchant secrets and a configurable retry policy with exponential backoff.

Want to Know if Scrums.com is a Good Fit for Your Business?

Get in touch and let us answer all your questions.

Book a Demo

Don't Just Take Our Word for It

Hear from some of our amazing customers who are building with Scrums.com Teams.

"Scrums.com has been a long-term partner of OneCart. You have a great understanding of our business, our culture and have helped us find some real tech rockstars. Our Scrums.com team members are high-impact, hard working, always available, and fun to have around. Thanks a million!"
CTO, OneCart
On-demand marketplace connecting users and top retailers
"The Scrums.com Team is always ready to take my call and assist me with my unique challenges. No problem is to big or small. Great partner, securing strong talent to support our teams."
CIO, Network
Leading digital payments provider
"Finding great developers through Scrums.com is easier than explaining to my mom what I do for a living. Over the past couple of years, their top-tier devs and QAs have plugged seamlessly into Payfast by Network, turbo-charging our sprints without a hitch."
Engineering Manager, PayFast by Network
A secure digital payment processor for online businesses
"Our project was incredibly successful thanks to the guidance and professionalism of the Scrums.com teams. We were supported throughout the robust and purpose-driven process, and clear channels for open communication were established. The Scrums.com team often pre-empted and identified solutions and enhancements to our project, going over and above to make it a success."
CX Expert, Volkswagen Financial Services
Handles insurance, fleet and leasing
"The Scrums.com teams are extremely professional and a pleasure to work with. Open communication channels and commitment to deliver against deadlines ensures successful delivery against requirements. Their willingness to go beyond what is required and technical expertise resulted in a world class product that we are extremely proud to take to market."
Product Manager, BankservAfrica
Africa's largest clearing house
“Scrums.com Team Subscriptions allow us to easily move between tiers and as our needs have evolved, it has been incredibly convenient to adjust the subscription to meet our demands. This flexibility has been a game-changer for our business. Over and above this, one of their key strengths is the amazing team members who have brought passion and creativity to our project, with enthusiasm and commitment. They have been a joy to work with and I look forward to the continued partnership.”
CEO & Co-Founder, Ikue
World's first CDP for telcos
“Since partnering with Scrums.com in 2022, our experience has been nothing short of transformative. From day one, Scrums.com hasn't just been a service provider; they've become an integral part of our team. Despite the physical distance, their presence feels as close and accessible as if they were located in the office next door. This sense of proximity is not just geographical but extends deeply into how they have seamlessly integrated with our company's culture and identity.”
SOS Team, Skole
Helping 60k kids learn, every day
"Scrums.com joined Shout-It-Now on our mission to empower young women in South Africa to reduce the rates of HIV, GBV and unwanted pregnancy. By developing iSHOUT!, an app exclusively for young women, and Chomi, a multilingual GBV chatbot, they have contributed to the critical task of getting information & support to those who need it most. Scrums.com continues to be our collaborative partner on the vital journey."
CX Expert, iShout
Empowering the youth of tomorrow
"Scrums.com has been Aesara Partner's tech provider for the past few years; and with the development support provided by the Scrums.com team, our various platforms have evolved. Throughout the developing journey, Scrums.com has been able to provide us with a team to match our needs for that point in time."
Founder, Aesara Partners
A global transformation practice

Find Related App Types

Loan Management app

Financial app

Credit Spending App

Retail ERP system app

Financial Management System App