Is there an app that will show a customer’s running balance on every invoice?
Do you mean a running balance across all unpaid orders for the customer, or only the remaining balance on each individual order? Shopify can show payment terms and the outstanding amount for an individual order, but a cumulative account balance on every invoice is a different requirement.
Are these Shopify B2B company accounts on Plus, or regular customers/draft orders? That distinction will determine whether native payment terms are enough or whether you need a customer-statement app.
Hey, native Shopify can show what’s still due on one order. It does not keep a running account total that reprints on every invoice.
Per invoice: open the order, add payment terms (net 7/15/30, due on receipt, due on fulfillment, or a fixed date), then Collect payment > Send invoice. That email is a checkout link for the remaining balance. On B2B, set those terms once under Customers > Companies on the location. The buyer can log into their customer account, open the order, and hit Pay now. Deposits work the same way, pay a percentage up front and the rest sits on that order.
A statement-style running balance across all unpaid invoices is not a native invoice field. Each order is its own balance.
Update for anyone landing here with the same need: we shipped this. Disclosure - I build Upright Net Terms, and this thread (plus a similar discussion at B2B / Net terms on Shopify — how do you currently track who still owes you?) is what moved it to the top of the roadmap.
What it does now: open net-terms orders are grouped per customer with a running balance, and when a payment arrives outside Shopify (bank transfer, cheque) you record the amount once - it spreads across that customer’s open orders oldest-due-first. An order the payment fully covers is marked paid in Shopify automatically; a partial amount shows as ‘received / left’ against the order; anything beyond the open balance stays as credit for the next order. So the statement-style payment that matches no single invoice - the exact case above - now has somewhere to live.
gotinker, if you’re still wrestling with this: I’d genuinely value your verdict on whether the flow matches how you actually reconcile. If it doesn’t, say so here and I’ll adjust - the feature exists because this thread described the gap precisely.
I was able to get this accomplished using Shopify FLOWS and editing my invoice template.
Glad you got it working, and thanks for coming back to say how. If you have a minute, would you mind outlining the Flow trigger and the invoice template edit you used? This thread ranks in search for running balance questions now, so a short recipe here would give the next merchant a complete answer.
One thing I am curious about: does your setup handle a single payment that covers several invoices at once? Spreading one bank transfer across multiple open orders was the part we could not get out of Flow plus template edits, which is what pushed us toward a ledger approach instead.
For others looking for same or similar functionality, without using Shopify Flow, some B2B apps can handle this.
B2B Marshal stores the running balance of a B2B company in a company metafield. B2B Marshal uses this to trigger threshold actions, block checkout, or just flag companies in its app.
You can use this stored value in emails however. You can use this:
{% if b2b? %}
{% assign b2b_company_balance = company.metafields.b2b_marshal.current_balance_minor %}
{% if b2b_company_balance != blank %}
<p>
<strong>Total current company balance:</strong>
{{ b2b_company_balance | money_with_currency }}
</p>
{% endif %}
{% endif %}
Full disclaimer: I built B2B Marshal. It offers this level of tracking free for up to 5 companies. And that comes with a sweet sweet dashboard.
You have to move to a paid plan to get more companies tracked or to get company/location level settings (discounts, shipping options, order and item restrictions) and enforcement actions.
Useful addition, and the metafield-in-template trick is neat. One distinction for readers, since the two routes are not interchangeable: company metafields exist only on Shopify Plus, where the B2B Companies object lives. On a non-Plus plan a wholesale buyer is a plain customer with payment terms on the order, there is no company record to hang a balance on, so the balance has to be kept per customer and computed from open orders and recorded payments. That is the case we built for (disclosure: I build Upright Net Terms), and it is also why Flow plus template edits run out of road there: nothing on a standard plan can spread one payment across several open orders.
So: on Plus with Companies, Josh’s route puts the number in your emails for free. Off Plus, you need a per-customer ledger, whichever app or spreadsheet keeps it.
One correction: company metafields aren’t Plus-only either.
Shopify’s native B2B Companies and Company Locations are now available on Basic, Grow, Advanced, and Plus. Apps can also write metafields to those Company records through the Admin API. Shopify’s metafieldsSet mutation uses the permissions of the owner resource, and Company writes require write_companies or write_customers plus access to B2B, not Shopify Plus.
That’s how B2B Marshal works: it calculates the company’s running balance and writes that value to the native Shopify Company as a metafield. So the approach I described works on Basic, Grow, Advanced, and Plus stores using Shopify B2B.
The Liquid example is only reading that stored value for use in the email; Liquid isn’t responsible for maintaining it.
A per-customer ledger is a different approach and can make sense for merchants operating wholesale relationships outside Shopify’s native B2B Company model, but it isn’t required simply because a merchant isn’t on Plus.
You are right, and I was out of date: Companies and company metafields have been on every plan since April, so the Plus line I drew is wrong. Thanks for the correction, better to have it on the record here than have someone plan around it.
The narrower version of my point still holds: a per-customer ledger is for merchants running wholesale outside the Companies model, which in practice means tagged customers and draft orders with payment terms, often set up before B2B reached their plan. If a store has moved its buyers into Companies, the balance belongs on the company record the way you describe, and the two approaches stop overlapping.
Unfortunately I did not document how I did it. I’m not a developer. I used sidekick to give the the step by step instructions and had sidekick create the flows. I did have to edit the html in my invoice template but I don’t have that code.
Going forward I’m going to start documenting things.