Back to the Carter-Cash experience

Carter-Cash

Integrations & Data Flows

01 / 5

REQUIREMENTS & DATA MODELING

Turning data exchange requirements into a technical solution

Mapping an e-commerce order to the data expected by an external system

Carter-Cash wanted to send its orders to Datahub. Behind that goal was a set of information distributed across the existing model: orders, shipments, customers, stores, products, pricing, history, and fulfillment methods.

I analyzed these sources, identified the required information, and defined how it should be transformed into Datahub’s expected format. I then designed the complete exchange, from the triggering event in the order lifecycle to the construction and authenticated delivery of the data.

  • Data modeling
  • API
  • Business data

02 / 5

ASYNCHRONOUS ARCHITECTURE

Moving data without blocking the application

Decoupling order delivery so an external service could not slow down the main journey

Datahub delivery could not run directly during a customer action or an important business transition. A slow response or service outage could otherwise block the site unnecessarily.

I chose an asynchronous architecture based on Symfony Messenger. When an order reaches the relevant state, a message is placed on a dedicated queue. A worker later processes it independently, reloads the required information, and sends it to Datahub. The action that triggered the exchange can therefore complete normally, even when the external service is slow or unavailable.

  • Symfony Messenger
  • Asynchronous processing
  • Decoupling

03 / 5

ERROR HANDLING & TRACEABILITY

Never letting a data flow fail silently

Keeping enough context for every failure to be understood and the exchange to be retried

An asynchronous Datahub delivery can fail long after the order event that triggered it. Without dedicated tracking, an order’s data might never reach the service, while the failure remained difficult to see or reproduce.

I implemented persistent failure tracking for each affected shipment, including the returned status, number of attempts, and date of the latest attempt. Dedicated logs also retain the trigger source and context required for diagnosis. When a later delivery succeeds, the previously recorded failure is automatically cleared.

  • Traceability
  • Logging
  • Error handling

04 / 5

BACK OFFICE & OPERATIONS

Making integrations visible and actionable

Giving teams a clear view of failed exchanges and a safe way to retry them

Datahub delivery monitoring could not rely on logs alone. Access would have remained limited to developers, and incidents would have been difficult to find over time. I therefore proposed a dedicated back-office interface where failed processes are directly visible.

The view brings together the information needed for diagnosis: the related order, shipment, status, failure count, and latest attempt. An action lets the delivery be retried manually through the same service used by the automatic process. A successful retry clears the error; otherwise, its tracking is updated.

  • Sonata Admin
  • Observability
  • Manual retry

05 / 5

TECHNICAL IMPLEMENTATION

Under the hood of the integrations

The Datahub integration combines transformation of a rich domain model, an authenticated HTTP request, asynchronous processing, and operational tracking through the back office. I separated these responsibilities so each part could evolve and be diagnosed independently

  • Symfony
  • Messenger
  • Sonata

Construction and delivery

A builder transforms orders and their shipments into the expected format. A client built on Symfony HttpClient obtains an access token, sends the data, and interprets the external service’s response.

Asynchronous processing

A change in order state dispatches a Symfony Messenger message. A handler then reloads the shipment and delegates delivery to a shared service that is also used for manual retries.

Errors and operations

Doctrine persists failures and their attempts, while a dedicated Monolog channel provides technical context. Sonata Admin exposes this information and lets users retry a delivery without duplicating business logic.

Other integrations

I also explored the Woop API to replace a legacy source of pickup locations. I identified the required data: location, pickup-point identity, opening hours, and accepted package categories, then completed most of the integration into the delivery journey.

  • Symfony Messenger
  • HttpClient
  • OAuth 2.0
  • Doctrine
  • Monolog
  • Sonata Admin
  • Woop