Skip to content

Representative engagementEcommerce operations

Giving ecommerce exceptions a durable operational lifecycle

Pinemark asked for a dashboard of late orders. Shopify knew the order, ShipStation knew the shipment and Gorgias knew the customer conversation, so staff rebuilt every shipping problem by hand on each sweep. Future Built added the one thing none of them owned: an exception that is detected, assigned, worked and resolved, while each platform keeps the data it already holds.

Pinemark is a representative engagement, not a historical client. It shows how Future Built approaches exception operations across existing platforms. The architecture is Future Built's design for this case; company facts and results are constructed project data, economics are calculated from stated assumptions, and orders and people are synthetic.

Engagement
Exception operations platform
Duration
Six weeks
Role
Discovery, architecture, implementation, rollout
Each row is an exception rather than an order, with its rule, age, owner, assignment SLA and source systems. The selected record shows why the rule fired, check by check, beside the Shopify order, ShipStation shipment and Gorgias ticket behind it, with notes, reassignment and a required resolution reason. Synthetic orders and people.

Each row is an exception rather than an order, with its rule, age, owner, assignment SLA and source systems

Representative engagement · constructed project results

median time from exception condition to assigned owner
6h 12m → 1h 08mmedian time from exception condition to assigned owner
hours a week of manual exception-management work
13.4 → 4.1hours a week of manual exception-management work
pilot false-positive rate after correcting the backfill model
18.0% → 6.7%pilot false-positive rate after correcting the backfill model
of exceptions resolved through the console
90%of exceptions resolved through the console

Summary

Pinemark's operations team asked for one dashboard combining Shopify and ShipStation. Discovery showed the team already had the data. What it lacked was a durable record of each problem, so exceptions were rediscovered and reassigned through a spreadsheet. Future Built's design uses a narrow exception layer: provider webhooks are normalized into a shared order-and-shipment state, four deterministic rules evaluate it, and each match becomes an exception with an owner, an assignment SLA, notes and a required resolution reason. Shopify, ShipStation and Gorgias stay authoritative. A pilot backfill exposed a wrong assumption about time, corrected before launch. In the representative results, time to owner fell from 6h 12m to 1h 08m, and manual exception work from 13.4 to 4.1 hours a week.

The operational gap

Pinemark, an 11-person direct-to-consumer home-goods brand, processed about 4,600 Shopify orders a month with no engineer and two people splitting operations and support. About 5.8% of orders, roughly 267 a month, became shipping problems handled by hand.

Future Built reviewed six weeks of the team's "Shipping Problems" spreadsheet, shadowed the morning sweep, read shipping-tagged Gorgias contacts and mapped fulfillment timestamps. The sweep was a loop: check Shopify for fulfillment, ShipStation for a label or tracking and Gorgias for a customer message, then update a row and ask a teammate to take it. Nothing held state between sweeps, so the next one started over, often with the same order.

Before, each morning sweep started from zero across three tools and a spreadsheet, and 31% of exceptions reached the team through the customer first. After, a provider event is normalized, evaluated and turned into a durable exception with an owner and a reason for closing.

Before, each morning sweep started from zero across three tools and a spreadsheet, and 31% of exceptions reached the team through the customer first

The loop cost 13.4 hours a week. The larger cost was delay: a median 6h 12m from exception condition to assigned owner, with 31% of tracked exceptions first discovered because a customer got in touch.

A dashboard would have made the loop easier to read without changing it. The missing object was the exception: when it started, why it qualified, who owned it and how it ended. An order cannot hold that state.

Designing exception truth

The first architecture decision was what not to own. Shopify owns order truth: order state, payment, fulfillment status, line items and addresses. ShipStation owns shipment truth: labels, carriers, tracking and execution. Gorgias owns support truth: tickets, conversations and replies. Replacing any of them would add risk without adding the missing capability.

Each platform keeps the truth it already owns. The new system owns only exception truth and deliberately excludes a WMS, OMS, help-desk replacement, returns platform, carrier-rate shopping, predictive delivery estimates and an AI operations agent.

Each platform keeps the truth it already owns

The new system owns exception truth: detection, instances, ownership and SLA, notes, and resolution with its reason. Its Postgres database mirrors only what rules read, keyed by immutable Shopify, ShipStation and Gorgias IDs, and each record still lives where it was created. The console opens source records by deep link; nothing in this scope writes back. That boundary keeps a new database from becoming a fourth system of record.

Between providers and rules sits a normalization layer. Shopify and ShipStation describe the same order differently and on different schedules: a ShipStation label can push a fulfillment into Shopify, so an order reads Fulfilled before any carrier has the package. Webhooks are verified, acknowledged quickly and translated into domain events such as tracking.carrier_accepted, so rules evaluate one consistent order-and-shipment state.

Shopify, ShipStation and Gorgias remain systems of record. Webhooks are verified, de-duplicated by provider event ID and normalized before a versioned rule engine evaluates them. Postgres holds exception state and cross-system IDs; the console reads across the boundary and writes nothing back.

Shopify, ShipStation and Gorgias remain systems of record

How the team operates now

Take one illustrative order. #58214 is paid Monday at 10:02. Its label is created at 10:19, pushing a fulfillment into Shopify while nothing has moved. Because the system watched the label appear, the label-without-movement rule starts its clock there. At Tuesday's 10:30 sweep, 24h 11m have passed without carrier acceptance; EXC-2291 opens and operations is alerted.

Rae K. takes it at 11:24, 54 minutes after detection: the label was missing from Monday's pickup manifest. At 13:06 the customer's Gorgias ticket links on order number and email, so support sees the problem is already owned while the reply stays in Gorgias. Rae finds the package on the dock. The carrier accepts it at 18:41, the condition clears, and Wednesday at 08:12 she resolves it: re-tendered to carrier.

Nobody searched three systems to learn whether a problem existed. They opened them only to fix it.

Illustrative execution trace for synthetic order #58214, from the Shopify payment webhook through label creation, label-without-movement detection, assignment, Gorgias linking and carrier acceptance. The redelivered acceptance event is ignored, and the owner resolves the exception the next morning with a reason.

Illustrative execution trace for synthetic order #58214, from the Shopify payment webhook through label creation, label-without-movement detection, assignment, Gorgias linking and carrier acceptance

From events to work

Each webhook's provider and event ID is recorded once, so a redelivered event produces one row and no duplicate work. Raw payload references are kept for diagnosis; rules read only normalized state.

The launch design uses four rules: stale unfulfilled (a paid, non-preorder order past a 48-hour fulfillment window), label without movement (no carrier acceptance within 24 hours of the label), stale partial fulfillment (open line items beyond 72 hours) and carrier exception (a configured carrier-exception status). The thresholds are Pinemark's configuration, not ecommerce standards. Rules run on each event and on a scheduled sweep, because some triggers are things that did not happen.

Four constructed Pinemark rules with configurable 24h, 48h and 72h thresholds. Rule 2 shows each check it makes, including whether the system actually watched the label. Every condition is known state, threshold and history, so rules are auditable, testable and explainable.

Four constructed Pinemark rules with configurable 24h, 48h and 72h thresholds

Each condition is known state, a known threshold and known event history, so a deterministic rule answers it exactly. Every match stores the facts it checked and the rule version, and the console shows operators those checks. Asking a language model whether an order looks late would add variance and an explanation gap to a question with an exact answer.

A match creates an exception instance, its own record rather than a badge on an order, with one open per rule and subject. Its states are Open, Assigned, In progress, Condition cleared, Resolved and Dismissed. Assigning an owner stops the assignment-SLA clock. If an event clears the condition, owned work stays visible; only unowned exceptions auto-close. Resolving requires an owner and a reason, and dismissals feed the false-positive rate. Detection without ownership would still be mostly a notification.

One open instance per rule and subject. People assign, note, resolve and dismiss; the system clears and restores conditions. A cleared condition never deletes owned work, resolution requires an owner and reason, and dismissals feed the false-positive rate.

One open instance per rule and subject

The exception is a first-class entity with its own rule version, evidence, assignments, notes, support context and resolution. Mirrored order, shipment and tracking tables hold only what rules read, keyed by immutable external IDs, with observation start and event origin recorded explicitly.

The exception is a first-class entity with its own rule version, evidence, assignments, notes, support context and resolution

Where the first data model failed

The first version of the data model failed in pilot week one. Before go-live, the system imported a snapshot of open orders and shipments, and rule 2 opened a wave of false label-without-movement exceptions.

The rule was right for live events: when the system watches a label appear, it knows whether a carrier scan has arrived since. The import held only each label and its current status, not the scans the system would have seen had it been watching. Version one treated the snapshot as observed history. An illustrative shipment labeled four days earlier arrived with zero tracking rows, so its clock ran from label creation and fired, although the carrier had already scanned it.

Version one treated an imported snapshot as observed history, so labels with no imported scans looked stuck. Version two starts observation at the baseline and evaluates rules with reliable historical timestamps on day zero. The constructed pilot false-positive rate fell from 18.0% to 6.7%.

Version one treated an imported snapshot as observed history, so labels with no imported scans looked stuck

An imported record can prove a label exists. It cannot prove no scan happened. Rule 2 tests for an absence, and absence can only be established by observation.

The fix changed what the rule trusts as its clock, not its threshold. Each shipment records when observation began and whether its history is complete. Imported work is baselined at current status, and shipments with no status start their clock at the baseline. Rules with reliable historical timestamps still evaluate on day zero. Pilot false positives fell from 18.0% in week one to 6.7% before launch, not to zero.

Rollout and trust

New state had to earn trust before the old one was retired. After the day-zero baseline, a two-week pilot ran only rules 1 and 2, with the spreadsheet as a fallback compared daily. The launch gate was one full week of exceptions reconciled against it. Only then were the remaining rules enabled and the spreadsheet frozen read-only.

Baseline on day zero, two pilot weeks on rules 1–2 with the spreadsheet compared daily, then launch on all four rules. The gate was one full week reconciled against the spreadsheet; only then did it become read-only.

Baseline on day zero, two pilot weeks on rules 1–2 with the spreadsheet compared daily, then launch on all four rules

Constructed project data

Operational impact

The results measure different things and stay separate. Manual exception-management work fell from 13.4 to 4.1 hours a week; the 9.3 released hours were search and spreadsheet upkeep. Median condition-to-owner time fell from 6h 12m to 1h 08m, about 81.7%, because ownership begins at detection. Both carry high attribution.

Exceptions first found through customer contact fell from 31% to 17%. That measures how problems are discovered, not complaint volume, and attribution is medium. The launch false-positive rate was 6.7%, and 90% of exceptions were resolved through the console.

At a modeled $33 loaded hour, 9.3 hours × 52 weeks is $15,959 a year of released capacity, not a payroll or cash saving. Against the $12,600 engagement, modeled payback is about 9.5 months. No revenue, retention, refund, chargeback or satisfaction effect is claimed.

Constructed post-launch results in separate categories: 9.3 hours a week released, 81.7% faster assignment, customer-first detection from 31% to 17%, 90% console resolution and a 6.7% launch false-positive rate. Economics count released capacity, not cash saved.

Constructed post-launch results in separate categories: 9.3 hours a week released, 81.7% faster assignment, customer-first detection from 31% to 17%, 90% console resolution and a 6.7% launch false-positive rate

What this demonstrates

The console was the visible part, and the least difficult. The engineering was in deciding what deserved its own state, which system had authority over each fact, and what the software could honestly claim to know about time. Pinemark did not need another source of truth. It needed a place where exceptions became owned work.

Built with

Shopify · ShipStation · Gorgias · Next.js · Vercel · Supabase (Postgres) · PostHog

All work
Two swimlane diagrams comparing the same lead before and after. Before: visitor, generic form, shared inbox, coordinator, a missing-information loop that calls the customer back, manual re-keying into Jobber, then the estimator, with a 2h 47m median staffed first response. After: visitor with UTM context, conditional form, property and service selection, deterministic ZIP check with an out-of-area decline, structured Jobber client and request, office notification and estimator, with a 26m median and a dashed failure branch that retries, then alerts and emails the office.

Representative engagementHome services

Turning a quote form into an operational lead pipeline

Kept Jobber as the system of record and built only the missing handoff, the same integrate-before-reinventing boundary Pinemark draws around Shopify, ShipStation and Gorgias.

Median staffed first response 2h 47m → 26m (constructed)

View case study
Diagram split by a vertical automation boundary. On the automated side: receive email and preserve source, parse and extract candidate values, validate and resolve with an operator, create structured CRM handoff. On the human side, fragmented pricing inputs and account context such as negotiated multipliers and legacy concessions feed the salesperson or estimator, who produces the commercially approved quote.

Representative engagementIndustrial distribution

Automating RFQ intake without automating commercial judgment

Also turns fragmented input into owned operational work with explicit review states, but uses bounded AI because RFQ input is ambiguous; Pinemark's exact conditions called for rules.

82% of RFQs routed to shortened review · ~38 hours a month released (constructed)

View case study