Before and after: a plain default admin with a flat menu, and the DesignMint Commerce admin, branded and grouped by My Storefront, System and Suppliers & Decorators
Platform

System customizations: turning a framework into one product

DesignMint Commerce runs on Medusa, but decorators shouldn’t notice. How we shaped its admin, catalogued 60 integrations (19 live) and built a wallet that can’t be overdrawn.

DesignMint Commerce · Oct 14, 2026 · 4 min read
Integrations
60 catalogued, 19 live
Admin wording changed
About 25 places
Credit packs
3

DesignMint Commerce, our hosted storefront and admin, is built on Medusa, an open-source commerce engine. (The DesignMint Studio SDK is a separate product: a React SDK that works with any backend.) Medusa gives Commerce a solid base: orders, products, payments and inventory. But out of the box it looks and feels like a general toolkit, organised the way a developer thinks. A decorator thinks in shops, print areas, suppliers and jobs.

This case study is about the work that closes that gap: reshaping the admin, connecting the outside services a decoration business depends on, and building a credit wallet that pays for the heavier features fairly.

An admin organised the way a decorator thinks

The sidebar is grouped by how people actually work: My Storefront (with Shop and Stores inside it), System (decoration pricing, markup, exchange rates, inventory defaults, tax codes and emails), Suppliers & Decorators, and then the tools.

One rule shaped more of the product than you’d expect. The sidebar only shows two levels, and a third level simply doesn’t appear. That’s why editing a microstore opens in a window instead of on its own page, and why Shopify Sync lives inside each store. Working with the platform’s limits, instead of fighting them, kept the admin predictable.

The rule
Two levels show. A third simply doesn’t.
  1. Level 1My StorefrontShown
  2. Level 2StoresShown
  3. Level 3A store’s edit pageNever appears
So the admin works with it
Editing a microstore opens in a window, over the Stores list.
Shopify Sync lives inside each store, not in the sidebar.
The two-level limit comes from Medusa, the engine underneath, so the admin was shaped around it instead of fighting it.

Branding took a few creative workarounds. The login, invite and password-reset screens offer no way to customise them, so a small invisible add-on loads a stylesheet that swaps in our logo on all three. About 25 bits of text were changed so the admin says “DesignMint” instead of “Medusa”. And the top bar hides menu items you can’t use, based on your role, your plan and the services you’ve connected.

An integration hub for 60 providers

A decoration business runs on outside services: payments, tax, shipping labels, file storage, suppliers, decorators and email. The integration hub is the one page where you connect them. It lists 60 providers: 19 are live today, and the rest, including every tax provider, are marked “coming soon”.

The integration hub with seven connected providers and categories of coming-soon integrations
The integration hub on our test account: seven providers connected here, out of 19 live and 60 catalogued across payments, tax, decorators, suppliers, shipping and more.
  • Login details are encrypted with AES-256-GCM and never shown again after you save them.
  • Some categories allow one provider at a time, because you only need one email service. Others stack, because you might work with several suppliers and shipping carriers.
  • A provider is only marked “live” when real code actually uses it. Brandfetch and Logo.dev stayed as “coming soon” because nothing called them yet. We’d rather show fewer live integrations than promise ones that don’t work.

The first nine providers we connected (Stripe, Resend, ShipStation, GCS, S3, Cloudinary, local storage, FulfillEngine and Slack) are deliberately left alone. New providers are built next to them, not by rewriting them. We learned that one the honest way: we refactored the Resend email integration, tested it, saw it worked, and rolled it back anyway. Changing something that already works carries risk, and the improvement wasn’t worth it.

A credit wallet that can’t be overdrawn

The bigger features, like AI images, embroidery files and extra stores, are paid per use. Instead of a confusing pile of separate fees, they all draw from one credit balance, and Stitch, lookbooks, mockups, stores and webhooks each have a clear price in credits.

Behind the scenes, the wallet works like a bank ledger: entries are only ever added, never edited or deleted, so the full history is always there. Every charge is a single database update that refuses to run if it would take the balance below zero. That matters when two things happen at once: two charges arriving together can’t both slip through and overdraw the account.

The trickiest part was charging for features we don’t fully control, like the lookbook engine. A charge there has to survive the feature failing, so it moves through a few steps:

One charge, start to finish
A lookbook, paid in credits
  1. ReserveNever below 0

    The admin reserves the charge in one database update, which refuses to run if the balance would go below zero.

  2. Checkpoint

    The request carries the charge’s reference. Just before the feature runs, the charge is marked as spent.

  3. Feature runs

    The lookbook engine, which the admin doesn’t control, does the work.

  4. If it succeeds

    The charge is linked to whatever the feature created.

  5. If it fails

    The charge is released, so trying again never costs twice.

The ledger
One failed try, one retry
Append-only
  1. Reserved10 heldLookbook, first try
  2. Spent10 usedCheckpoint, before the engine runs
  3. Released10 backThe lookbook failed, so the 10 come back
  4. Reserved10 heldLookbook, second try
  5. Spent10 usedCheckpoint, then linked to the lookbook
Paid once10 credits

Rows are only ever added. Nothing is edited or deleted, so the full history stays.

A lookbook costs 10 credits. When the first try fails, its 10 come back, so the only lookbook you pay for is the one you get.
The wallet page with the credit balance, the price of each feature and three credit packs
The wallet: your balance, what each feature costs and the three credit packs. Credits are paid to DesignMint, through Stripe or Razorpay.

What we learned

  • A platform’s limits are design decisions in disguise. Lean into them.
  • Only call something “live” when it really is.
  • Money code should make double-charging impossible, not just unlikely.

Common questions

What do credits pay for?

The pay-per-use features: Stitch designs (35 credits), lookbooks (10), mockups (10), publishing a store (5) and webhook endpoints after the first free one (5).

Are my integration login details safe?

They’re encrypted at rest with AES-256-GCM and never displayed again after you save them.

Can a failed action use up my credits?

No. If a feature fails after a charge has been reserved, the charge is released.

Filed under PlatformAll case studies
Case studies

Want it running
in your shop?

Book a call and we will walk through Stitch, lookbooks, mockups and microstores on your own products.