Hi all, I built ShopCanary after watching the same thing happen to store after store. A discount stops applying, or free shipping starts charging, and nothing errors. The admin looks fine and the orders keep going out until a customer happens to mention it.
You declare the rules that should always hold, like “orders over $100 ship free”. ShopCanary checks every order against them as the order arrives. When a rule does not fire, the alert names the order and the rule, with expected against actual.
It also watches your own Google Merchant Center account for new disapprovals and offer-count jumps. It flags mass product-ID rewrites too, before Google treats the catalogue as new. That access is read only, through your own Google login.
One thing I care about: if ShopCanary’s own checking stalls, it marks that check stale rather than showing green. A monitor that fails without saying so is worse than none.
It has no write access to your store, so it cannot change a discount, a price or a product. Free plan available. Pro is $19 a month flat with a 14-day trial.
It is on the Shopify App Store under ShopCanary, by HJB CodeForge.
Happy to answer questions about what it checks or how it works.
Hey @HJBCodeforge ,
The idea of monitoring things that can silently break is really useful. A lot of Shopify issues don’t necessarily throw an obvious error, so a merchant may not realize something is wrong until they start losing sales or a customer points it out.
I especially like the approach of showing the expected result versus the actual result, because that make it much easier to understand what went wrong instead of just getting a generic alert.
The read only setup is also a nice touch. For something monitoring discounts, shipping rules, or product data , I’d personally feel more comfortable knowing it can detect an issue without having permission to change anything in the store.
The stable check handling is another good idea. A monitoring tool should definitely make it clear when it hasn’t been able to check something rather than giving a false sense that everything is fine.
Thank You!
Thanks, that is a fair read of it.
Expected versus actual exists because a generic alert makes you go and find the order yourself. By then you have lost the thread. The alert carries the order name and the rule it broke, with both numbers, so you can act on it from your phone.
One thing the post does not say: a single failure will not email you. It takes two qualifying failures in a row before ShopCanary interrupts you. One odd order is often an odd order. Two is a pattern.
On read only, the app asks for three scopes and every one of them is a read: orders, products, discounts. There are no write scopes at all, so there is nothing it could change.
On stale checks, each one has its own window instead of a single timer. The hourly order re-check goes stale after three hours, the Google poll after six. The dashboard names the check that is behind, because a late backup sweep is a different problem to the feed monitor going blind.
I could not post a link when I started the thread, so here it is now: ShopCanary - Catch the store failures that throw no errors | Shopify App Store
Appreciate you taking the time.
Good question, and it’s a real gap today.
A rule has two conditions right now: a subtotal minimum, and an optional discount code. A code-based rule only judges orders where the shopper used that code, so a segment with its own code, wholesale or VIP for example, already excludes itself with no extra setup.
Product and market exclusions are different. If your Shopify discount excludes a product or a market, and the rule doesn’t carry the same exclusion, ShopCanary checks against a wider condition than the discount covers. You get a false alert on those orders.
Workaround for now: match the rule’s conditions to what the discount covers. Hold off declaring a rule for anything with product-level exceptions you can’t express yet. Mirroring exclusions on the rule itself is the right fix, and it’s on my list.
Thanks for pushing on this. It’s the kind of question that finds the edge of what the app checks.
Shipped. A rule can now carry a list of products it does not cover, and a list of currencies it does not cover.
An excluded order is skipped rather than passed or failed. It moves neither counter, so an exception cannot manufacture an alert and cannot hide a real one.
One choice worth naming. If an order contains an excluded product, the whole order is skipped. The other lines on it are left alone too. Take “orders over $100 ship free except oversized items”. On a mixed order the right shipping charge is a number I cannot work out from the order by itself. Skipping is honest. Judging it would mean inventing a threshold you never set.
Markets are matched on currency, not country. ShopCanary never reads the customer’s address, and I would rather keep that than gain a filter. So if your markets do not line up with currencies, this one will not help you.
Customer segments still cannot be excluded, for the same reason. The nearest thing is what you already have. A rule tied to a discount code is judged only on orders where the shopper used that code.
Thanks again for asking. It was a real gap and it was the right thing to point at.