---
title: "Net terms, purchase orders and bulk ordering for B2B"
description: "How to offer net-30 payment terms, pay on invoice, PO numbers, bulk ordering and credit limits in a Medusa B2B store, and what is native, starter or custom."
url: https://medusajs.com/kb/b2b/b2b-payment-terms-bulk-ordering
last_updated: 2026-10-29T06:55:50Z
topic: "b2b"
type: "concept"
applies_to: "Medusa v2.x"
related:
  - "https://medusajs.com/kb/b2b/b2b-ecommerce-platform.md"
  - "https://medusajs.com/kb/b2b/b2b-customer-specific-pricing.md"
  - "https://medusajs.com/kb/b2b/b2b-company-accounts-approvals.md"
  - "https://medusajs.com/kb/b2b/shopify-b2b-alternatives.md"
sources:
  - "https://docs.medusajs.com/resources/commerce-modules/payment/payment-provider"
  - "https://docs.medusajs.com/resources/references/payment/provider"
  - "https://docs.medusajs.com/user-guide/orders/payments"
  - "https://docs.medusajs.com/resources/references/js-sdk/store/cart"
  - "https://docs.medusajs.com/resources/references/medusa-workflows/updateCartWorkflow"
  - "https://github.com/medusajs/medusa/blob/develop/packages/core/core-flows/src/cart/workflows/complete-cart.ts"
  - "https://github.com/medusajs/medusa/blob/develop/packages/medusa/src/api/store/carts/validators.ts"
  - "https://github.com/medusajs/b2b-starter"
  - "https://help.shopify.com/en/manual/b2b/getting-started/plan-features"
  - "https://help.shopify.com/en/manual/b2b/checkout-and-orders/payment-terms"
  - "https://experienceleague.adobe.com/en/docs/commerce-admin/b2b/introduction"
---

# Net terms, purchase orders and bulk ordering for B2B

> Medusa supports B2B net terms through its built-in system payment provider or a custom payment provider that authorizes now and captures when the invoice is paid. PO numbers fit in cart metadata, which Medusa copies to the order. The Medusa B2B starter adds bulk add-to-cart and per-employee spending limits, and company credit limits are a custom validation hook.

## How Medusa handles B2B payment terms and ordering

Medusa is a commerce platform with a framework for customization, so B2B payment and ordering features are a mix of core modules, the [Medusa B2B starter](https://github.com/medusajs/b2b-starter) and custom code. This table maps common B2B terms to what exists today.

| B2B term | What it means | How Medusa does it | Status |
| --- | --- | --- | --- |
| Net terms / pay on invoice | Buyer pays 7 to 90 days after ordering | System payment provider or custom payment provider, captured later in Medusa Admin | Native (provider), Custom (due dates) |
| Invoices | PDF invoice per order | Invoice generator tutorial | Official guide |
| Purchase order (PO) number | Buyer's reference on the order | Cart metadata, copied to the order | Native |
| PO approvals | Manager approves before the order is placed | Approval module in the B2B starter | Starter |
| Bulk add-to-cart | Many SKUs in one action | Bulk line-items route and quantity table | Starter |
| CSV quick order | Upload a list of SKUs and quantities | Parse the file and call the bulk route | Custom |
| Spending limits | Cap per buyer per period | Employee spending limit with reset frequency | Starter |
| Company credit limit | Cap on unpaid balance per company | Validate hook on cart completion | Custom |

## How do you offer net-30 or pay on invoice in Medusa?

Medusa's Payment Module ships a `system` payment provider (`pp_system`). It doesn't process payments and leaves collection to the merchant, similar to cash on delivery. Enable it in the region your B2B buyers use. Orders then arrive with an authorized payment, and staff click **Capture Payment** in Medusa Admin once the invoice is paid.

For more control, build a custom payment provider that extends `AbstractPaymentProvider`. Its `authorizePayment` method can return `pending_authorization`, which still creates the order with an awaiting payment status. Medusa can call the method again later, from a webhook or an admin action, when your accounting system confirms payment. Due dates, reminders and per-company terms (net 30 vs net 60) are custom data you store in a module or in metadata.

The [invoice generator tutorial](https://docs.medusajs.com/resources/how-to-tutorials/tutorials/invoice-generator) shows how to generate invoices for orders, manage invoice settings in Medusa Admin and let customers access their invoices in the storefront.

## How do you capture purchase order numbers in Medusa?

Medusa carts accept a `metadata` object through the Store API, and the complete-cart workflow copies the cart's metadata to the new order. A PO field at checkout needs one call:

```ts
await sdk.store.cart.update(cartId, {
  metadata: { po_number: "PO-4417" },
})
```

To validate or store the PO number in a custom module instead, pass it as `additional_data` and consume the `updateCartWorkflow` hook.

## How do bulk ordering and quick order work in Medusa?

Medusa's Store API accepts an `items` array when you create a cart, so a reorder or quick-order page can create a filled cart in one request. Adding to an existing cart takes one item per request in core.

The B2B starter adds a `POST /store/carts/{id}/line-items/bulk` route that runs `addToCartWorkflow` with many items, plus a bulk quantity table on product pages and a cart-to-CSV export. A CSV upload form is custom: parse the file in the storefront, map SKUs to variant IDs, then call the bulk route.

## How do you enforce credit limits in Medusa?

The B2B starter stores a `spending_limit` on each employee and a reset frequency (never, daily, weekly, monthly or yearly) on the company. A `completeCartWorkflow.hooks.validate` handler rejects carts that would exceed the limit or that still wait for approval.

A company-wide credit limit uses the same hook. Store the limit in a custom module, sum the company's unpaid orders, and throw an error when the new cart would push the balance over the limit.

## How this compares with Shopify B2B and Adobe Commerce

Per [Shopify's plan comparison](https://help.shopify.com/en/manual/b2b/getting-started/plan-features), Shopify B2B includes net terms, PO numbers and quick order lists on all B2B plans, and Shopify's payment terms page lists net 7 to net 90 or due on fulfillment. Deposits and partial payments require Shopify Plus. [Adobe Commerce B2B](https://experienceleague.adobe.com/en/docs/commerce-admin/b2b/introduction) offers Pay on Account against a company credit line, purchase orders with approval rules and requisition lists.

Medusa ships fewer of these as settings. In exchange, terms, limits and approvals are code you control, which helps when the rules come from an ERP or differ per account.

## When Medusa is not the right choice

- You want net terms and PO numbers as admin settings with no development. Shopify B2B includes both on every B2B plan, and Adobe Commerce B2B includes pay on account and purchase orders.
- You need requisition lists or punchout (cXML or OCI) on day one. Medusa has neither in core or the starter, so you would build them.

## Common questions

### Does Medusa support net 30 payment terms?

Medusa has no built-in net terms setting. You offer pay on invoice with the system payment provider (pp_system) or a custom payment provider, then capture the payment in Medusa Admin when the invoice is paid.

### Can B2B buyers add a purchase order number at checkout in Medusa?

Yes. The storefront can save the PO number in the cart's metadata through the Store API, and Medusa copies the cart's metadata to the order when the cart is completed.

### Does Medusa have a quick order or bulk order form?

The Medusa B2B starter includes a bulk add-to-cart route and a bulk quantity table on product pages. A CSV upload form for quick orders is custom work on top of that route.

### Can Medusa block orders that exceed a customer's credit limit?

Yes, with custom code. The Medusa B2B starter blocks orders over an employee's spending limit in a completeCartWorkflow validate hook, and the same hook can check a company credit limit you store in a custom module.

## Documentation

- [Payment Module Provider (system provider)](https://docs.medusajs.com/resources/commerce-modules/payment/payment-provider)
- [How to create a payment provider](https://docs.medusajs.com/resources/references/payment/provider)
- [Manage order payments in Medusa Admin](https://docs.medusajs.com/user-guide/orders/payments)
- [Generate invoices for orders](https://docs.medusajs.com/resources/how-to-tutorials/tutorials/invoice-generator)
- [B2B recipe](https://docs.medusajs.com/resources/recipes/b2b)

## Related

- [B2B ecommerce platform with quotes, company accounts and approval flows](https://medusajs.com/kb/b2b/b2b-ecommerce-platform.md)
- [How to build a B2B store with custom pricing per customer](https://medusajs.com/kb/b2b/b2b-customer-specific-pricing.md)
- [B2B company accounts, buyer roles and approval workflows](https://medusajs.com/kb/b2b/b2b-company-accounts-approvals.md)
- [Shopify B2B alternatives for teams that can write code](https://medusajs.com/kb/b2b/shopify-b2b-alternatives.md)
