Two complementary systems in one module: a checkout approval gate that holds orders above a threshold for manager sign-off, and an admin PO panel where buyers submit purchase orders for conversion into WooCommerce orders โ complete with net-terms invoicing, payment tracking, and reminder emails.
Define as many tiers as needed: auto-approve under $500, manager approval $500โ$2K, admin sign-off above $2K. Each tier can have different approver roles.
Require buyers to enter a PO number at checkout. Stored as HPOS-compatible order meta. Visible in admin, emails, and the PO panel. Custom format validation supported.
Approval status, approver ID, rejection reason โ all stored as WC order meta via HPOS-safe methods. Admin columns work on both classic and HPOS order screens.
Approvers get instant email when an order needs sign-off. Buyers get notified on approval or rejection. Payment reminders can be sent manually from the PO panel.
Convert approved POs into WooCommerce orders. Set payment due dates based on Net terms. Track paid/unpaid status. Mark as paid when payment is received โ company credit balance updates automatically.
Rules engine evaluates order total and buyer's user group to determine whether to auto-approve or route to a specific approver. Supports specific user or user-group approvers.
When a buyer places an order and their cart total hits an approval threshold, the order is intercepted at checkout and placed in "Pending Approval" status instead of going straight to processing. The designated approver receives an email notification and can approve or reject with a single click โ either from the email link or from My Account โ Pending Approvals.
Go to B2B Commerce Kit โ PO Approval โ Approval Rules. Each rule defines:
Small orders go straight through. No interruption to the buyer's experience.
Mid-range orders wait for the buyer's designated manager or company admin to sign off.
Large orders need you personally to review before they process.
If an order doesn't match any rule, the global default action applies (auto-approve or require approval).
When an order enters the approval queue, these values are stored using $order->update_meta_data() โ safe on both HPOS and classic order storage:
| Meta Key | What It Stores |
|---|---|
_woob2b_approval_status | pending / approved / rejected / cancelled |
_woob2b_approver_id | WordPress user ID of the designated approver |
_woob2b_approval_company_id | Company ID (for company admin access checks) |
_woob2b_approval_rule_id | Which rule triggered this approval requirement |
_woob2b_rejection_reason | Reason text when an approver rejects (stored on reject) |
A complete purchase order workflow separate from the normal checkout flow. Buyers browse your catalogue and submit a formal Purchase Order. Your team reviews it, can modify it, then converts it into a real WooCommerce order. The order is invoiced and tracked until payment is received.
From My Account โ Purchase Orders โ Submit New PO. They list products and quantities. The PO is saved as "Pending" and your team is notified.
In B2B Commerce Kit โ Purchase Orders, the admin PO panel shows all pending POs. Team can view line items, notes, and the buyer's details.
Click Approve to move the PO to "Approved" status. Click Reject and enter a reason โ the reason is stored on the PO record and emailed to the buyer.
Click "Convert to Order" on an approved PO. A WooCommerce order is created with the PO's line items and the customer's details. The PO status becomes "Converted."
On the converted PO, set the payment due date (auto-calculated from default Net terms, or manually set). Send a payment reminder email at any time.
When payment is received, click "Mark as Paid." If the PO was linked to a Company Credit account, the balance is reduced automatically.
| Setting | What it does | Default |
|---|---|---|
Require PO Number | Add a mandatory PO number field to checkout for eligible roles. Stored as HPOS-compatible order meta. | Off |
Approval Expiry Days | Days before unapproved pending orders auto-cancel. Approvers receive reminder emails before this. | 7 |
Default Action | What happens to orders with no matching rule โ auto-approve or require approval. | Auto-approve |
Notify Submitter | Email the buyer when their order is approved, rejected, or marked paid. | On |
Default Payment Terms | Auto-set payment due date on converted POs (number of days from conversion). | 30 |
Credit Check on Approve | Check company credit availability before approving. Log a warning if credit would be exceeded. | Off |
Sub-Account Permission | Allow sub-accounts to submit POs through the buyer portal. | No |
System 1 โ Checkout Gate: The buyer goes through normal checkout. If their order total triggers a rule, the order is intercepted and held for approval. The buyer has already added everything to their cart and gone through checkout โ you're just adding a sign-off step before it processes.
System 2 โ Admin PO Panel: The buyer doesn't go to checkout at all. They submit a formal Purchase Order document. You review, approve, then convert it into a WooCommerce order yourself. This is more formal and suits industries where all purchases require an official PO document.
Yes โ fully. Approval status, approver ID, company ID, rule ID, and rejection reason are all stored as WC_Order meta using update_meta_data(). The admin order column (showing pending/approved/rejected badges) is registered for both the classic shop_order posts screen and the HPOS wc-orders screen via separate hooks, so it works regardless of which order storage mode you use.
Yes. When a sub-account's order requires approval, the parent company admin can approve or reject it from My Account โ Pending Approvals. They see all pending orders from users within their company. Site admins with manage_woocommerce capability can always approve any order.
Orders auto-cancel after the Approval Expiry Days setting (default: 7 days). Approvers receive email reminders before expiry. The buyer is notified when their order is cancelled. For System 2 POs, they remain in the panel and can be manually cancelled by the buyer from their portal.
Yes. The "Convert to Order" screen has optional fields for shipping cost, shipping method name, and coupon code. These are applied when the WooCommerce order is created. If a coupon fails (invalid or expired), a note is added to the order but conversion still completes.
Yes. The following action hooks are available: woob2b_order_pending_approval, woob2b_order_approved, woob2b_order_rejected (System 1), and woob2b_po_submitted, woob2b_po_approved, woob2b_po_paid (System 2). See the Hooks reference for full parameter lists and code examples.