Configure flexible payment terms for B2B customers with net-30/60/90 options, early payment discounts, credit limit management, and automated collections
Payment terms define when a B2B customer must pay for goods delivered on credit: net-30 (due 30 days after invoice), net-60, net-90, or early-payment variants like "2/10 net-30" (2% discount if paid within 10 days). Offering flexible payment terms is a competitive advantage in B2B commerce — it reduces friction in the purchase decision — but introduces credit risk that must be carefully managed.
The right tools depend on your platform. Shopify Plus, BigCommerce B2B Edition, and several WooCommerce plugins provide native net-terms support. For smaller setups, a combination of your ecommerce platform and an invoicing tool (Invoiced, Stripe Invoicing) is the most practical approach.
| Platform | Recommended Tool | Native Support |
|---|---|---|
| Shopify (Standard) | Invoiced app or Balance app | No native net-terms; use an app |
| Shopify Plus | Shopify B2B (native) + Invoiced for advanced dunning | Net-30/60/90 built into Shopify B2B; credit limits and company accounts native |
| WooCommerce | WooCommerce B2B plugin + WooCommerce PDF Invoices | WooCommerce B2B adds payment terms per customer group |
| BigCommerce | BigCommerce B2B Edition (native) | Net-terms, credit limits, and company accounts built in |
| Custom / Headless | Stripe Invoicing + Stripe Billing for terms enforcement | Stripe Invoicing supports net-30/60/90 natively |
Early payment discounts on Shopify Plus: Shopify B2B does not natively support "2/10 net-30" early payment discounts. Use Invoiced app for early payment discount terms — configure in Invoiced → Settings → Payment Terms → Early Payment Discount.
Credit limit enforcement in WooCommerce:
Use Stripe Invoicing for net-terms enforcement without building a credit system from scratch:
// Create a customer with payment terms in Stripe
const customer = await stripe.customers.create({
email: customerEmail,
name: companyName,
metadata: { payment_terms: 'net_30', credit_limit: '50000' },
});
// Create an invoice with net-30 terms
const invoice = await stripe.invoices.create({
customer: customer.id,
collection_method: 'send_invoice',
days_until_due: 30, // Net-30
auto_advance: true, // Automatically finalize and send
description: `Invoice for Order ${orderNumber}`,
metadata: { order_id: orderId, po_number: poNumber },
});
// Add line items, then finalize and send
await stripe.invoiceItems.create({ customer: customer.id, invoice: invoice.id, amount: orderTotal, currency: 'usd', description: orderDescription });
await stripe.invoices.finalizeInvoice(invoice.id);
// Stripe auto-sends the invoice and handles dunning reminders via Billing settings
Configure dunning in Stripe Billing settings: Go to Stripe Dashboard → Billing → Settings → Invoice reminders and configure automatic reminders: 3 days before due, on due date, 3 days after, 7 days after, 14 days after.
Credit limit enforcement (custom):
async function checkCreditAvailability(customerId, orderAmount) {
const customer = await db.customers.findUnique({ where: { id: customerId } });
const openInvoicesTotal = await db.invoices.aggregate({
where: { customerId, status: { in: ['sent', 'overdue', 'partially_paid'] } },
_sum: { amountDue: true },
});
const currentBalance = openInvoicesTotal._sum.amountDue ?? 0;
const availableCredit = customer.creditLimit - currentBalance;
if (orderAmount > availableCredit) {
return { approved: false, availableCredit, shortfall: orderAmount - availableCredit };
}
return { approved: true, availableCredit: availableCredit - orderAmount };
}
The right terms for each customer tier:
| Customer Tier | Recommended Terms | Rationale |
|---|---|---|
| New account (< 3 orders) | Net 15 or prepay | Insufficient payment history to extend credit |
| Established (3–12 months on-time) | Net 30 | Standard B2B terms |
| Strategic (12+ months, large volume) | Net 60 or "2/10 Net 30" | Reward loyalty; early discount improves your cash flow |
| High-risk (2+ late payments) | Prepay or Net 15 only | Protect against bad debt |
Early payment discount economics: "2/10 net-30" means the customer gets a 2% discount if they pay within 10 days instead of 30. For the customer, this is equivalent to borrowing at ~36.7% APR — most customers with any cost of capital should take the discount. For you, paying 2% to receive payment 20 days earlier is typically better than your borrowing cost.
Annual credit review: Review every credit account annually — set a calendar reminder. A customer who qualified for $50,000 credit 2 years ago may look very different today. Reduce limits for customers who have developed slow-pay patterns.
| Problem | Solution |
|---|---|
| Customer places an order exceeding their credit limit | Check available credit before order confirmation, not just at invoicing; Shopify Plus B2B and BigCommerce B2B Edition enforce this natively |
| Early payment discounts taken after the discount period | Record the payment date strictly; Invoiced and Stripe Invoicing track this automatically |
| Credit limits not updated as AR balance changes | Use a tool that deducts from available credit when an invoice is created and restores it when paid; Invoiced and Stripe handle this automatically |
| Different departments granting different terms informally | Centralize terms configuration in your platform or AR tool; sales reps should request terms changes through the credit system |
| High bad-debt write-off rate | Implement a credit application process before approving any account for net terms above $5,000 |