Most internal tools do not start with a roadmap. They start with a very specific annoyance that keeps wasting time.
Shopify Ops started as one of those.
The first version was simple: compare Shopify orders against ShipStation and tell me what did not match. That was it. No grand product vision, no fancy dashboard plan, no “platform” language. Just a practical audit because something in our shipping workflow was no longer trustworthy.
The Original Problem
ShipStation is useful, but in our case it became a source of uncertainty. Some order data was cached on their side, and orders that were delayed for more than two weeks started showing up incorrectly.
That sounds like a small edge case until you are the person who has to answer the operational question:
Is this order actually missing, delayed, on hold, already shipped, duplicated, or just stale in someone else’s system?
We tried to fix it through support. We went back and forth, tested the obvious things, waited, adjusted, checked again. Nothing really solved the underlying issue. At some point you have to stop treating the symptom as a support ticket and start treating it as a data reliability problem.
So I built the first audit.
From Comparison Script to Ops Dashboard
The first goal was not to replace ShipStation. It was to create an independent view of the truth.
Shopify is where the order begins. ShipStation is where fulfillment happens. When those two disagree, the business needs a fast way to see what changed, what is missing, and what can safely be ignored.
Once that comparison existed, other checks became obvious:
- Orders that exist in Shopify but never reached ShipStation
- ShipStation orders that no longer map cleanly back to Shopify
- Potential duplicate purchases
- Refunded orders and repeat refund patterns
- Address changes after placement
- High-value orders missing a phone number
- Partial fulfillments that have stalled
- Products with missing SKUs, images, or descriptions
- Inventory situations where awaiting shipment quantity is higher than available stock
This is how small internal tools grow when they are actually used. You do not sit down and design every page upfront. You run into another recurring audit, add it, and keep going.
Why Self-Hosted Matters Here
Shopify Ops is meant to run locally or inside your internal network. That is how we use it.
For this kind of tool, that matters. It deals with order data, customer details, fulfillment state, and operational exceptions. I do not want another SaaS layer sitting between systems just to tell me whether our own orders line up correctly.
The setup is intentionally boring:
- Plain PHP
- No framework
- No required build step
- Shopify access token as the core integration
- ShipStation credentials only when you need audit, matching, or push features
You can run it locally with php -S localhost:8080, or put it behind your normal internal web server. If all you need is Shopify lookup, most pages work with Shopify alone. If you want the full audit engine, connect ShipStation too.
The Useful Part Is the Boring Part
The most valuable internal tools are often not the clever ones. They are the ones that make a recurring question cheap to answer.
Before Shopify Ops, checking an odd order meant opening multiple tabs, searching in two systems, comparing dates, checking status fields, looking for fulfillment records, and hoping the cached view was telling the truth.
Now the tool gives us a more direct workflow:
- Run an audit for a date range
- Review genuinely missing orders
- Ignore known exceptions
- Export reports when needed
- Search across reports, ignored orders, and push history
- Spot-check individual orders without digging through both platforms manually
It is not glamorous. It is very useful.
A Note on Trust
The lesson here is not “ShipStation bad” or “build everything yourself.” That would be too easy and mostly wrong.
The real lesson is that operational systems drift. APIs, caches, manual edits, delays, fulfillment holds, refunds, and address changes all create gaps between what one system says and what another system thinks happened.
If your business depends on those systems agreeing, you need a way to audit the agreement itself.
That is what Shopify Ops is for.
Where It Is Now
The project is open source on GitHub: MrGKanev/Shopify-ops.
It now includes audit reports, trends, duplicate detection, refunds tracking, address checks, email checks, order timelines, metafield lookup, tag search, customer lookup, packing slip preview, push logs, ignored orders, and a few other small tools that came directly from real operational pain.
Use it locally. Put it on your internal network. Adapt it to your store’s quirks. That is the whole point.
It started because I got tired of asking whether an order was actually wrong or just cached wrong.
That question should not take half a morning to answer.