B2B / Net terms on Shopify — how do you currently track who still owes you?

I’m building a small Shopify app for B2B (invoice / Net terms) accounts receivable, and I’d rather check my assumptions with people who actually run this than keep guessing.

What it does so far: outstanding vs. overdue by company on one screen, an aging breakdown, per-company statements, and reminder drafts you preview before anything is sent — orders that have been paid drop out of the reminder list automatically, so you don’t chase someone who already settled.

I have not run a wholesale store myself. That’s exactly why I’m asking instead of telling. Three questions:

  1. How do you see total outstanding across your B2B customers today — Shopify admin, a spreadsheet, an accounting tool, something else?
  2. Has a payment reminder ever gone out to someone who had already paid? What broke — timing, a stale manual list, something else?
  3. What would a reminder tool have to do before you’d trust it to draft messages on your behalf?

For transparency, per the board rules: the app is in review and not published, so there is nothing to install today, and I’m not linking to anything or posting contact details here. It’s planned as freemium — a free tier plus paid plans.

Happy to summarise whatever I learn back into this thread.

On your second question, the failure I would expect is not timing. It is that the payment never happened inside Shopify at all. Wholesale money arrives by bank transfer or cheque, someone reconciles it in Xero or a spreadsheet, and nobody goes back and marks the order paid in admin. Shopify still says outstanding, so your reminder is correct against the data and wrong in the real world. Listening for orders/paid does not rescue you there because the event never fires. The interesting design question is what you do about payments recorded somewhere else, not how fresh your list is.

For the first question, most of the raw material is already sitting on the order. Payment terms on an order carry due, overdue and dueInDays, and under that each payment schedule has dueAt, issuedAt, completedAt, balanceDue and totalBalance. Aging per company falls out of dueAt and balanceDue without asking anyone to maintain a sheet.

One trap while you are building. Do not hang the reminder decision off the order financial status. A B2B order with a deposit plus a balance sits partially paid for weeks, and there is a real difference between the deposit schedule being settled and the whole order being settled. completedAt on the individual schedule is the flag that means stop chasing this one.

On trust, the thing I would want is being able to mark something paid from inside your reminder screen and have it write back to the order. Otherwise the tool becomes a fourth place the truth lives, which is the problem the merchant already had.

Are the merchants you have spoken to recording those bank transfers back into Shopify at all, or is admin already stale for them?

Good afternoon,

lumine’s write-back is the right cure, and there is a gap in front of it worth designing for.

Write-back fixes the record once somebody notices the payment landed. Between the money arriving in the bank and that person opening your screen, the order still says outstanding and your reminder is still armed. That window is days, and it is exactly when the wrong email goes out.

Which lands on your own line: paid orders drop out of the reminder list automatically. That is true only if Shopify learns they were paid. On lumine’s failure mode Shopify never learns, so they never drop out, and the safeguard reads as working precisely because it never fires.

So the state I would add is a third one. Outstanding, paid, and CANNOT TELL, with cannot-tell being any company whose orders are past due AND who has a history of settling outside Shopify. Chase the first, never the third, and show the third with a count so it is visible rather than silently folded into outstanding.

That turns your product question into matching. A transfer arrives with a reference somebody typed, wrong invoice number, or one payment covering four, or the right number short by the fee. Reference alone looks perfect in testing and fails on the first customer who settles three at once.

Disclosure first, since it matters here: I build Upright Net Terms, an app in exactly this space - so treat this as field notes from a competitor, shared because the thread deserves them and the space is big enough to think out loud in.

Two assumption-checks from what I have seen merchants actually do:

  1. The two replies above already found the real boss fight: reconciliation, not reminders. I will add the shape it takes in practice - B2B customers pay statements, not invoices. A wholesale buyer with four open invoices sends one bank transfer for a round number that matches nothing. Whoever records it has to decide how to spread it (oldest-first? customer’s remittance note?), and any app whose data model is strictly per-invoice paid/unpaid cannot represent the leftover. A per-company running balance with partial application is the feature that separates tools that survive contact with real AR from dashboards. There is live demand for this in the wild: someone asked for exactly a running balance on invoices here a few days ago - Running Balance on invoices - and no stock Shopify feature covers it.

  2. On reminders: the aging table is table stakes, and firms mostly do not want automation to send anything firm-toned without a human deciding. What they do want automated is the gentle tier (‘statement attached, all current’) because sending it feels like busywork. Escalation is a decision, not a schedule.

Good luck with the build - genuinely. The more tools take AR on Shopify seriously, the fewer merchants track net terms in a spreadsheet named final_FINAL2.xlsx.