Case study · Copiara · 2026

Copiara

In development, and repositioned in August 2026 from a standalone platform into a Shopify app. The quoting, credit, cross-reference, and concierge layers now run against a merchant’s own store, admin, and theme.

In developmentVisit live ↗
Copiara hero
Fig. 01 · Copiara

Role

Studio · build + ship

Status

In development

Year

2026

Surfaces

Web

Live

In build

The problem

A wholesale distributor can already sell on Shopify, and its buyers still order by phone and email, because the store cannot negotiate a quote, route the approval a purchasing department requires, enforce a credit limit, or recognize the competitor part number the buyer is holding. Since April 2026 the core wholesale primitives ship on every paid Shopify plan: companies, payment terms, volume pricing, price lists, B2B checkout. Copiara rebuilds none of that. It carries only the work Shopify has no answer for on any tier, quote negotiation, buyer-side approval chains, credit limits and AR visibility, cross-referencing, and catalog enrichment, and it runs inside the merchant’s own admin and their own theme rather than beside them.

What we built

  • Quoting desk: request to negotiation to accepted quote, with a margin floor the server enforces
  • Buyer-side approval chains and spend limits, cleared before an order ever reaches checkout
  • Credit limits and live exposure, including approved but uninvoiced orders, on top of Shopify payment terms
  • Cross-reference: competitor and legacy part numbers resolved to the merchant catalog, fuzzy matches held for human review
  • Catalog enrichment layered over Shopify products instead of overwriting them, with field-level history
  • An AI concierge as a theme app embed, scoped to the buyer’s own company context, staging actions for a human to confirm
  • Negotiated quotes handed back as Shopify draft orders with locked prices, settled at Shopify B2B checkout

Shopify stays the system of record

Shopify owns its own fields: products, variants, inventory, companies, orders, and payment state. Copiara keeps a derived read model of those fields plus its own enrichment layer, because every query that makes the product useful is a join between the two. Sync runs one way. Webhooks are treated as signals to refetch rather than as the data itself, and a reconciliation sweep repairs drift, because Shopify does not guarantee delivery or ordering.

A negotiated quote goes back to Shopify as a draft order built on the real variants, with the agreed prices locked, and it settles at Shopify’s own checkout on the buying company’s terms. Copiara never touches the money; it reads payment state back from Shopify rather than writing it. The split between what Shopify ships and what Copiara adds is laid out on copiara.com.

Where each surface runs

The rep workspace is an embedded admin inside the merchant’s Shopify admin, built with App Bridge and Polaris web components, with quotes, orders, accounts, pricing, and settings. On the storefront, a theme app block puts self-serve ordering, quote requests, approvals, and cross-reference lookup on a page in the merchant’s own theme, and the concierge is a theme app embed that streams its answers directly from the backend. Buyer identity comes from Shopify’s Customer Account API, which carries the buyer’s company context. The backend behind all of it is FastAPI and Postgres on Cloud Run.

What was hard

The obvious way to put an app on a storefront could not carry this product. Shopify’s App Proxy cannot reliably identify a buyer on new customer accounts, carries no company context, buffers responses so the concierge cannot stream, and strips cookies, so we ruled it out early and built the storefront surfaces on theme app extensions talking to the backend directly.

Shopify’s own limits shape the design. A store below Plus gets three active catalogs, overlapping catalogs on one location resolve to the lowest price, and net terms never charge anything automatically when they expire, which is exactly the credit gap Copiara fills. The price writer has to guarantee catalogs never overlap.

The embedded admin ships as one bundle with a hard size cap and no code splitting. Merchant-facing wording is served by the backend when the app boots instead of shipped in the bundle, and CI fails any pull request whose build crosses the cap.

The concierge answers from the same company context the buyer already has, so it cannot quote a price or a stock position that account is not entitled to. The margin floor is enforced on the server and never shown to the buyer, cross-reference never auto-maps without an exact reference, and when the concierge wants to act it stages the action for a human to confirm.

Stack

Frontend
Shopify App BridgePolaris Web ComponentsTheme app blocksTypeScript
Backend
FastAPIPythonAlembic migrations
AI / ML
Catalog-grounded conciergeServer-side tool runtime
Data
PostgreSQL (multi-tenant)Derived Shopify read modelProduct revisions + provenance
Infra
Cloud RunAdmin GraphQL APICustomer Account API OAuthShopify webhooks

What we learned

Build on the platform’s primitives, not beside them. Every capability Copiara claims is something Shopify has on no tier, and anything Shopify already ships stays Shopify’s.

Webhooks are hints, not truth. Treating every delivery as a reason to refetch, with a reconciliation sweep behind it, is what keeps a derived read model honest.

Read the platform’s constraints before the feature list. App Proxy’s limits decided where the storefront surfaces run, and the admin bundle cap decided what the server sends at boot.

What’s next

Finish the buyer-facing surfaces, then submit to the Shopify App Store as a public app, unlisted at first, and open it up once the first merchants are running on it.

Have something that looks like this?

Tell us what is broken. We’ll tell you what the first week looks like.

Next case study →

Smile PreVue