How to Find Inactive Customers in MySQL — Without Writing SQL
MySQL powers an enormous share of the world's stores and customer databases — WooCommerce shops, membership sites, custom CRMs on LAMP stacks. Which means the classic question “who used to buy from us and stopped?” is usually a MySQL question, tangled up in DATEDIFF math, order-status filtering, and (in WordPress-style schemas) customer facts scattered across meta tables. If you're the owner or ops person without a data team, ask these five questions instead of writing that query.
“Which customers have not placed an order in the last 90 days?”
Past buyers are the cheapest revenue you will ever re-acquire — they know you, they've paid you, and their email is already in your database. In WooCommerce-style schemas this means finding each customer's latest completed order while excluding cancelled and refunded statuses, which is exactly the fiddly filtering worth delegating.
You get: A table of lapsed customers ranked by days since last order, with lifetime spend and order count.
“How much did our now-inactive customers spend with us historically?”
The dollar total of dormant customers is the business case for every win-back campaign you'll ever run. If lapsed buyers account for a large slice of historical revenue, even a modest reactivation rate outperforms buying the same revenue through ads.
You get: A total of historical revenue from inactive customers, bucketed by how long they’ve been gone.
“Which previously frequent buyers have suddenly gone quiet?”
A customer who ordered monthly for a year and then stopped is a louder alarm than one who bought once and drifted. Comparing each customer's usual purchase rhythm to their current silence surfaces the highest-intent win-back targets first — the people most likely to come back with a single nudge.
You get: A list of formerly regular customers ranked by the gap between their usual cadence and current silence.
“What did inactive customers usually buy before they stopped?”
Knowing the last products lapsed customers purchased makes your win-back email specific instead of generic — a restock reminder, an accessory, a new version. If dormancy clusters around particular products, you may also have found a quality or repurchase-cycle issue worth fixing at the source.
You get: A breakdown of the most common last-purchased products among inactive customers.
“How many customers go inactive each month, and is the pace accelerating?”
Monthly dormancy flow tells you whether the leak is stable or widening — grouped by month, which in MySQL means DATE_FORMAT bucketing where an off-by-one on month boundaries quietly corrupts the trend. Get it computed consistently and check it alongside your acquisition numbers every month.
You get: A monthly count of newly inactive customers with the trend over the past year.
Stop reading. Ask.
Connect MySQL or start with sample data — first answers in under 2 minutes.
Ask this on your data — freeFree plan available · No credit card required
Frequently asked questions
I run the store, not the database — do I need SQL for any of this?
No. Ask the questions in plain English exactly as written; the AI writes the MySQL, runs it read-only, and hands back sortable tables you can export as CSV for your email platform.
Is pointing this at my live shop database risky?
No — the connection is read-only by default, so orders and customer records cannot be modified. If you want a hard guarantee, create a MySQL user with SELECT-only privileges or connect to a replica.
Guest checkouts mean some "customers" have no account. Are they included?
Yes, if you ask for it. Guest orders in WooCommerce-style schemas carry a billing email even without a user account, so the AI can group activity by email address instead of user ID and catch lapsed guest buyers too.
Related question packs
How to Find Inactive Customers in Postgres — Without Writing SQL
Find inactive customers in your Postgres database with plain English questions. Win-back lists, at-risk revenue, and dormancy trends — no SQL.
How to Find Inactive Customers in Supabase — Without Writing SQL
Find inactive users in your Supabase project with plain English. Use auth.users last sign-in data to build win-back lists — no SQL editor needed.
How to Track Stripe MRR in MySQL — Without Writing SQL
Track Stripe MRR from billing data in your MySQL database in plain English. Growth, plan mix, and failed payments — no SQL or date-math required.