Introducing shopgen: months of order history for a Shopify test store

An empty Shopify development store makes every weekly report look flat. shopgen fills one with 90 days of realistic orders, and it's free and open source.

Oct 15, 2026 · 3 min read

A weekly report needs weeks behind it. Point one at an empty Shopify development store and every section reads the same: no trend, no best seller, nothing to act on. Orders you add by hand don’t fix it. They all land today, they have no history, and none of them get refunded.

So we built shopgen, and today we’re releasing it as free, open-source software under the MIT license.

What it does

shopgen fills a Shopify development store with months of order history that looks like a real store’s. It creates each order through the Shopify Admin API, dated on its historical day, so it lands on the right day in Shopify analytics, not today.

You describe the store in a short JSON profile: how many orders a day, how fast it grows, which days spike. shopgen works out the rest.

5,595Orders over 91 days
3,000Customers
1,339Bought more than once
$105Average order

From the example profile: 60 orders a day, 25% growth over the window, and a spike on Labor Day.

Orders per week from the example profile. Growth, plus the noise of a real store.

What the history looks like

  • Shape. Volume grows over the window, follows a weekly cycle, peaks in the evening, and jumps on the dates you mark as spikes.
  • Best sellers. A few products sell far more than the rest, as in a real catalog.
  • Repeat buyers. Customers come back, so repeat-purchase numbers mean something.
  • Seven outcomes. Most orders are paid and fulfilled. A few are refunded in full or in part, cancelled, left unpaid or still waiting to ship. Recent orders are more likely to be unfulfilled.
  • Tax and shipping. Orders include tax, and shipping is free over the threshold you set.
Outcome Share of orders
Fulfilled 82%
Unfulfilled 4%
Refunded 4%
Partly refunded 4%
Partly fulfilled 2%
Awaiting payment 2%
Cancelled 2%

Same profile, same orders

Give shopgen the same profile and the same catalog, and it makes the same orders every time. A report that looked wrong last week can be checked against exactly the same history this week.

Built to run overnight

Shopify lets development stores take five new orders a minute, so 90 days of history takes about 19 hours. shopgen tells you how long before it starts. You can stop it, or it can crash, and it picks up where it left off with no gaps and no duplicates.

shopgen doctor            # check login, store, products
shopgen plan              # preview every order
shopgen run --limit 3     # make three and check them in Shopify
shopgen run               # make the rest overnight
shopgen purge --run <id>  # delete what that run made

doctor and plan change nothing in your store, so you can run them as often as you like.

Safe by defaultshopgen only writes to Shopify development stores unless you tell it otherwise on the command line. It never emails anyone, never changes stock, and uses addresses that can’t reach a real inbox. purge only deletes what shopgen tagged, and asks you to type delete first.

What it doesn’t do yet

  • Refunds show up in sales totals but not in reports on returned items.
  • Every order uses today’s prices, and there are no discount codes.
  • Addresses are in the US only.

Try it

shopgen works with Shopify only. You need a development store with a few active products, and an app with the read_products, write_orders and write_customers scopes. The setup guide walks through it.

Then, with Go 1.24 or later:

go install github.com/weekwright/shopgen@latest
shopgen plan

plan works without a store, using a built-in catalog of 40 products, so you can design a profile before you connect anything.

The code, setup guide and example profiles are on GitHub, and the full docs are at weekwright.github.io/shopgen. Issues and pull requests are welcome.

This week’s action

Run shopgen plan with the example profile and see what 90 days of your Shopify test store could look like.