Case study

Custom orders moved from a message inbox into WooCommerce checkout

A direct-to-consumer gifting and accessories brand

Who this build was for

A direct-to-consumer gifting and accessories brand, selling customized pieces to paying customers in ten countries. Every order needed the customer’s own choices made first: size, colour, engraving, sometimes a reference photo.

The order arrives as a conversation

An order comes in as a message. Someone wants the medium size, six of them, in two colours, with a name engraved on each. They have attached a photo of what they mean. They send a payment screenshot. Then somebody on your team opens a spreadsheet and types all of it again: size, count, colours, engraving, address. Somebody books the courier by hand. When the customer asks where the parcel is, they ask you, because there is nowhere else to look.

That was this brand’s process before the build, and it ran fifteen to twenty minutes an order when nothing went wrong. Those minutes are the team’s own estimate of staff time rather than a timed study. The configuration questions arrive at eleven at night. One person holds the rules about which options can be combined, and that person cannot take leave. When a size gets typed wrong you remake the piece at your own cost. None of that is a discipline problem. The configuration was never captured as data, so a person has to carry it from the conversation to everyone downstream.

More on running a brand at this stage, for founders still running orders through a DM inbox.

Data entry errors per 10,000 fields

Copying a choice out of free text and into a field is where the error enters. Care does not remove it. Nahm, Pieper and Cunningham, writing in PLoS ONE in 2008, looked at 42 published studies. Transcribing unstructured source material into a database averaged 976 errors per ten thousand fields. Keying data that had already been captured in structured form averaged 14.

Data entry errors per 10,000 fieldsabout 70x fewer

976

Transcribing unstructured source material

Structured

14

Keying structured source data

The number that moves is the share of the order captured as structured choices when the customer makes them.

Show data table
Data entry errors per 10,000 fields (errors per 10,000 fields)
Optionerrors per 10,000 fields
Transcribing unstructured source material976
Keying structured source data14

Source: Nahm, Pieper and Cunningham, PLoS ONE, 2008

Those studies are clinical registries, not storefronts. The setting is different. The step is the same.

The authors put the difference down to how much of the data was structured at capture. Care on the part of the person typing was not the variable. Barchard and Pace reported something adjacent in Computers in Human Behavior in 2011. Checking your own entries visually produced 29 to 58 percent more errors than double entry. It was not significantly better than entering the data once.

Why WooCommerce: what the platform had to be able to do

Before anything was built we went through the options with them against four questions. Can the platform hold per-product customization natively. Does that customization fight the platform’s own variant system. What does the platform take per order. And how much platform are you taking on for a catalogue this size.

How five ecommerce platforms compared against this brand's four questions.
PlatformWhat we foundDecision
ShopifyHandles variants well and puts per-product customization in an app layer. On a product whose options multiply, that layer meets the variant system.Not chosen for this build.
Magento and Adobe CommerceCarried more platform than this catalogue needed.Not chosen for this build.
Zoho CommerceStands up quickly and left little room for a custom option engine.Not chosen for this build.
A Node.js storefrontGave full control of the configurator. It also put the whole order pipeline, payments and shipping included, on us to build.Not chosen for this build.
WooCommerceKept the customization inside the product itself and takes no transaction fee of its own. It left room for the plugins this store turned out to need.Chosen for this build.

That was our recommendation for this brand’s constraints at the time, not a ranking we apply to every build. The four questions are the portable part.

If you are weighing the same decision, here are the trade-offs between an all-in-one platform and a headless build.

Three people, and it did not end at go-live

Three people did this. A project lead, a WooCommerce developer and a QA engineer. That is the whole team, and it is the honest size for a build of this shape.

It did not end at go-live, and the reason is worth knowing if you are planning one. The founders had never run a WooCommerce admin. Adding a product with a dozen option rules had to be learned. So did checking that an order carried its configuration through to the packing slip. So did reading what the reporting layer was telling them. All of it happened on a live store with real orders in it. So the work carried on as maintenance instead of closing at handover. That is how the team learned the system they now own.

If you are commissioning one of these, plan for the period after launch. Treat it as part of the work rather than as a contingency.

Atyantik has been really helpful in building our website and understanding all our requirements. What we really appreciate is that the team doesn’t limit their support to just the website, they’ve also helped us with various other technical requirements whenever needed. They are always available, quick to respond, and often go out of their way to help us find a solution, even for small issues. It has been a really good experience working with the team, and we truly appreciate their support and willingness to help.

A co-founder

A client-supplied account of the support relationship, published with permission. It describes what working together has been like, not a measured result.

The pieces, drawn as one system

What the storefront talks toWhat the storefront had to talk to. The credentials and the catalogue stay in WooCommerce; every other piece reads from or writes to the order record.

What the WooCommerce storefront had to talk to

  • Feeds in

    Customization plugin

    Size, quantity, colours, engraving, add-ons and a reference photo, captured as structured fields that travel with the order.

  • Feeds in

    Back-order path

    A message order entered through a store-manager account, carrying the same customization data as a web order.

The centre

WooCommerce storefront

The storefront sits in the middle of four pieces, and most of the time on this build went into things a shopper never sees.

  • Sends to

    Courier integration

    The docket number generated from inside the order, the printed label, and tracking pulled back into WooCommerce.

  • Sends to

    Reporting layer

    Order data read straight from the WooCommerce REST API, answering the questions the standard dashboards were not.

Shipping came with the original build. The courier plugin generates the docket number from inside the order, so nobody retypes an address into a separate portal. The label prints from the order, and tracking comes back into WooCommerce. The person packing, the person answering messages and the customer all read the same status.

The payment rail was not part of that build. It came later, as its own piece of work, and it is the clearest example of where time goes. This store needed a bank’s UPI gateway. At the time there was no official SDK for it, and the community plugin that existed targeted an older version of the API. So the gateway was written from scratch. That means the payment request and the callback the bank sends back. It means a verification step that confirms a payment actually settled rather than trusting a redirect. And it means the paths for a payment that times out or is abandoned halfway. Sandbox testing came next. After that, live testing with small real amounts, and then client acceptance testing. Reconciling the sandbox against production took days nobody had estimated, because the two environments behaved differently under the same request. One payment method took three to four weeks.

When you estimate a build like this, expect the integration with the thinnest documentation to be the line that moves. It may not even be in the original scope.

How the build happened, in order

Three phases: the storefront that shipped first, the payment gateway that came later, and the maintenance that followed go-live.

  1. The storefront

    WooCommerce rebuilt with per-product customization, the courier integration and the back-order path, so every order became one record.

  2. The payment gateway

    A UPI gateway built from scratch over three to four weeks, since no official SDK existed at the time.

  3. After go-live

    The founders learned a WooCommerce admin they had never run, so the engagement continued as maintenance rather than closing at handover.

We built our own reporting layer, and it found a bug

We also built a small reporting layer of our own, in Python, reading the WooCommerce REST API directly. The standard dashboards were not answering the questions the founders were asking.

  • A WooCommerce bug assigning one customer ID to thousands of guest orders.
  • Instagram's in-app browser stripping the referrer, so that channel read as direct.
  • UTM parameters named inconsistently, so one source read as several.

It found three things on this store. The first was a WooCommerce bug we hit at the time, assigning a single customer ID to thousands of guest orders. Every report grouped by customer was wrong, and nothing in the interface said so. We have not retested it against current versions. Another was Instagram’s in-app browser stripping the referrer. Traffic arriving from Instagram was landing in analytics as direct, so that channel read smaller than it was and we could not size it honestly until the layer existed. The third was mundane and cost as much. UTM parameters were named inconsistently across campaigns, so the same source arrived under several names and no total was ever right.

Those are three things you can check on your own store this afternoon. We found them here. We are not telling you they are true of every WooCommerce install.

Ordering by message did not stop, and that was never the goal

A storefront does not end the conversations. People who have bought from you by message carry on doing it. Telling them to use the website instead costs you the sale and the relationship.

So the build included a back-order module. A store-manager account lets a staff member enter a message order straight into WooCommerce. It uses the same customization fields a customer fills in on the site: size, quantity, colours, engraving, add-ons, reference photo. From there it is an order like any other, with an identical record, packing slip, tracking and email updates.

40% to 50%Of this store's tracked orders, entered as a message through the back-order module

Since the module has been in use, roughly 40 to 50 percent of this store’s tracked orders are entered this way. That figure comes from this store’s own order records, which we maintain, and it describes nothing beyond them. That share is not message ordering growing. It is message ordering becoming visible, because until the module existed there was nowhere to record it.

On time, these are the team’s own estimates rather than a timed study. A message order took fifteen to twenty minutes before, four to five of those just confirming the design. A message order handled through the module takes two to three minutes.

Prepaid share of orders, from this store's order records

When a customer pays before you make the piece, you stop funding your own production. You also stop absorbing the cost of a refused delivery. That share moved from 28 percent of orders to 45 percent across two fiscal years.

Show data table
Prepaid share of orders at two fiscal-year endpoints, read from this store's own WooCommerce order records. One catalogue, one kind of customer.
Item Share of orders
First full year measured 28%
Most recent full year 45%

All four are read out of this store's own order data rather than reported to us. We run and maintain this storefront, so these are numbers we can go and check. What we cannot do is tell you they generalise: they describe one catalogue with one kind of customer.

Prepaid share of orders across two fiscal years, from this store's order records Prepaid share of orders at two fiscal-year endpoints, read from this store's own WooCommerce order records. One catalogue, one kind of customer. This store's own WooCommerce order records, which Atyantik maintains directly. Two fiscal years.

Two things moved it. A customer can see their exact configuration priced on screen, with the engraving spelled out and the reference photo attached. That leaves less reason to hold payment until somebody sends a picture. A checkout that takes UPI natively removes a step. The customer no longer screenshots a payment and waits for a person to confirm it.

Three other figures come from the same records. Paying customers in 10 countries, refunds under 0.1 percent of orders, and cancellations around 12 percent in the most recent full year measured.

Measured by this store’s own WooCommerce order records, which Atyantik maintains directly.

The numbers we can open and read ourselves

These four come from Search Console on this store’s own property, an instrument anyone can open against a site they run.

~80,000Impressions a month, up from ~33,000

Search Console, this storefront’s own property.

Up ~80%Clicks

Search Console, this storefront’s own property.

360,000+Product rich result impressions

Search Console, this storefront’s own property.

~7Average position, from ~8 to 9

Search Console, this storefront’s own property.

*Disclaimer: Here ~ means approximately. Rates taken at two fiscal-year endpoints, not a monthly index.

The work behind them was ordinary. Product schema, so a listing can carry a price and availability. An XML sitemap submitted and watched, plus a Merchant Center feed. Category and price-band URLs that read as what they are, compressed images, and a styling-guide section.

The position movement is small and we are not asking it to carry anything. The impressions and the rich-result coverage are the part that changed.

Lighthouse performance, 2026, measured by Atyantik on this storefront

Here is our own weakest measurement, in the same detail as our best.

Show data table
Lighthouse performance scores measured by Atyantik on three surfaces of this storefront in 2026. Lighthouse bands performance 0 to 49, 50 to 89 and 90 to 100.
Item Lighthouse performance score
Desktop 93
Mobile home 74
Mobile category 66

Mobile performance is the standing item on this build. It is not finished, and publishing 93 on its own would tell you something untrue about the work.

Lighthouse performance scores on three surfaces of this storefront, 2026 Lighthouse performance scores measured by Atyantik on three surfaces of this storefront in 2026. Lighthouse bands performance 0 to 49, 50 to 89 and 90 to 100. Lighthouse, 2026, measured by Atyantik on this storefront.

Lighthouse scores a page from 0 to 100 and bands it. 0 to 49 is poor, 50 to 89 needs improvement, 90 to 100 is good. We ran Lighthouse on this storefront in 2026. Desktop measured 93, with largest contentful paint at 1.1 seconds. The mobile homepage measured 74, with largest contentful paint at 3.5 seconds. A mobile category page measured 66.

This brand grew on Instagram, and its checkout was built mobile-first for that reason. So 74 and 66 describe the surface its shoppers actually arrive on. Those are the two still open. Desktop at 93 is the least important of the three.

A related engagement, a storefront that outgrew its own rendering pipeline.

How the storefront is put together

  1. Layer 1

    Platform

    WooCommerce on WordPress.com managed hosting, chosen because it keeps all customization inside the product itself.

    Hands upward

    A catalogue and an order record that every other layer in this stack reads from directly.

  2. Layer 2

    Customization

    A purpose-built plugin capturing size, quantity, colours, engraving, add-ons and a reference photo as structured fields.

    Hands upward

    An order that arrives priced and complete, with nothing left to type in from a message.

  3. Layer 3

    Back-order path

    A store-manager account letting staff enter a message order through the same structured fields a customer fills in.

    Hands upward

    The same record, packing slip, tracking and email updates a web order produces.

  4. Layer 4

    Payments

    A UPI gateway written from scratch, with no official SDK available, covering the payment request, the callback and verification.

    Hands upward

    A payment confirmed as actually settled, never a redirect trusted on its own.

  5. Layer 5

    Reporting

    A separate Python layer reading the WooCommerce REST API directly, answering questions the standard dashboards did not.

    Hands upward

    Numbers the founders could check themselves, including the bug it found in WooCommerce's own customer grouping.

The courier integration shipped with the original build; the payment gateway came later as its own piece of work, so payments is the newest and least proven boundary in this stack.

What we would do differently

Two things we would carry into the next one of these. The payment gateway’s sandbox-to-production reconciliation cost days nobody had estimated, because the two environments behaved differently under the same request; that risk belongs in the estimate next time, named, not discovered. And mobile performance, the surface this brand’s Instagram-grown shoppers actually arrive on, is still the open item: 74 on the homepage and 66 on a category page are not finished work.

When this is the wrong fix

  • This fits when the choices your customers make can be written down as options. Size, quantity, colour, engraving, add-ons, a reference photo. If the order can be expressed in fields like those, it can be captured where the customer makes it. From there it travels to everyone who has to act on it.

  • It also fits when you want message orders and website orders to produce the same record.

  • And when you are willing to own the admin afterwards, with help while you learn it.

Where it is the wrong build

We would be selling you the wrong outcome. Message ordering did not stop here, it got a record.

If you want those terms settled up front, start here. A scoped ecommerce build with the ownership and support terms fixed before the storefront goes live. Or read another engagement where a manual, spreadsheet-run process moved onto software.

Questions about how the customization works

Where does the customization land on the order, and can the person packing it read it?
Every choice the customer makes is stored as a field on the order rather than as a note in a comment box. Size, quantity, colours, engraving text, add-ons and the uploaded reference photo all sit on the order record, so they appear on the WooCommerce admin order screen and on the packing slip. The person packing reads the same values the customer picked and nobody retypes them. That holds for an order placed on the site and for a message order entered through the store-manager account.
Is this an app bolted onto the product page, or native to the platform?
It is a purpose-built WooCommerce plugin for this store, and the customization lives on the product itself rather than in a separate layer sitting over it. That matters because per-product options and a platform’s own variant system collide when the customization is bolted on, and a product with several option groups multiplies variants quickly. Price is calculated from the choices as they are made. This was built for one catalogue and is not a product you can install.
Can a customer reach checkout without filling in the personalisation?
The price is calculated from the choices, so the options that determine what an item costs have to be answered before it can be priced and added to the cart. Optional add-ons stay optional and the reference photo is not required. The point of the constraint is that an order should not reach the workshop needing a message thread to complete it. This describes how it was built for this store, not a setting every customization plugin exposes.
What happens to customers who still want to message you?
They carry on messaging, and it now produces the same record as the website. A staff member enters the order through a WooCommerce store-manager account using the same customization fields, and from there the customer gets the same email updates on the same schedule as a web order. On this store roughly 40 to 50 percent of tracked orders are entered this way. That figure is read from this store’s own order records, which we maintain, and it says nothing about how other brands’ customers behave.

Tell us what your customers actually choose

If you are running orders through a message inbox and a spreadsheet, tell us what the customer actually chooses. Sizes, colour rules, combinations that are not allowed. And the part one person on your team holds in their head, which nobody has written down. We will tell you whether that can be turned into structured options, and what it would take to get there.

Sometimes the answer is that it cannot. Some products really are a conversation and should stay one. If that is what we find, we will say so plainly rather than sell you a configurator.

Tirth Bodawala, founder of Atyantik Technologies
Tirth BodawalaFounder, Atyantik Technologies
  • Everything you share stays private.
  • No obligation to take it further.

Start the conversation

How we handle what you send is set out in our privacy notice.