---
title: B2B WooCommerce Optimization — Offline Orders & Invoicing
type: article
created: '2026-01-16'
updated: '2026-01-16'
source_docs:
- raw/2026-01-16-weekly-call-w-karly-115014639.md
tags:
- woocommerce
- shipstation
- quickbooks
- php-plugin
- b2b
- invoicing
- doodla-farms
layer: 2
client_source: Doudlah Farms
industry_context: food-beverage
transferable: false
---

# B2B WooCommerce Optimization — Offline Orders & Invoicing

Discussed during [[wiki/meetings/2026-01-16-weekly-call-karly|Weekly Call — 2026-01-16]]. Multiple B2B WooCommerce issues were triaged and resolved or scoped during this session, covering the full order lifecycle from checkout through ShipStation sync and invoicing.

## Overview

Doodla Farms' B2B site (`doodlafarms.biz`) was undergoing pre-launch testing with real customers. A test order from Vitruvian surfaced several workflow gaps. Mark and Karly worked through each issue live on the call, resolving some immediately and scoping others for Eshock or client decision.

---

## Issues & Resolutions

### 1. Offline Orders Not Syncing to ShipStation ✅ Resolved

**Problem:** WooCommerce sets offline payment methods (Check Payments, Direct Bank Transfer, etc.) to `On Hold` status by default. ShipStation only pulls orders with `Completed` status, so these orders were invisible to the fulfillment workflow.

**Solution:** Mark built and activated a custom PHP plugin during the call. The plugin hooks into the WooCommerce "thank you" page and automatically transitions orders from `On Hold` / `Pending` / `Processing` → `Completed` when the payment method is any configured offline type.

**Test result:** A live test order using Check Payments showed the following order note trail:
> *Order status changed from pending payment → on hold → completed (auto-completed offline orders plugin, check payment)*

The order subsequently appeared in ShipStation. Plugin is active on the site.

**Related cleanup:** The "Pay with Link" button was appearing on the cart and checkout pages and should be removed. Tasked to Mark.

---

### 2. Invoicing for Offline Orders — Decision Pending

**Problem:** When a customer pays by check or on delivery, there is no automated invoice generated or tracked. Lucy needs a way to send invoices and reconcile payments in QuickBooks.

**Proposed Solutions:**

| Option | Cost | Notes |
|---|---|---|
| WooCommerce QuickBooks Integration Plugin | $100/year | Recurring cost; includes "send invoices to unpaid orders" feature; triggers automatically on purchase |
| Custom PHP Plugin (API integration) | ~$300 one-time | Full control; Mark builds WooCommerce ↔ QuickBooks API pipe; invoices created in QuickBooks, optionally emailed from WooCommerce |

The custom build requires QuickBooks Online API access (client must grant). Estimated 2–3 hours of development. Advantage: full flexibility for future automation (e.g., auto-send on shipment, custom invoice formatting).

**Action:** Karly to present both options to Lucy and request QuickBooks API access if she chooses the custom route. See [[wiki/clients/current/doudlah-farms/_index|Doodla Farms]].

---

### 3. Company Name Missing in ShipStation ✅ Scoped

**Problem:** The "Company Name" field is optional at WooCommerce checkout. When customers skip it, ShipStation receives the order without a company name, causing a validation error (`name or company name must be specified`).

**Solution (two parts):**
1. Make the Company Name field **required** at checkout.
2. **Auto-populate** the field from the customer's account profile — since all B2B customers are logged in with known company data, this can be pre-filled and confirmed rather than re-entered.

**Action:** Karly to task Eshock with both changes.

---

### 4. Product Quantity Ambiguity — No Change

**Problem:** Lucy (and possibly Jason) were confused that a quantity of "1" in an order meant "1 case," not "1 individual bag."

**Decision:** No site changes needed. The B2B site exclusively sells cases. The client team needs to internalize this convention. The SKU naming (e.g., `CB1` = Cranberry Beans, 1 lb bag) and pricing make the case quantity clear. If needed, a simple SKU reference table can be provided offline.

---

### 5. Complex Multi-Kitchen Invoicing (Epic Customer) — Decision Pending

**Problem:** At least one customer (referenced as an "Epic" account) operates multiple kitchens and requires a **separate invoice per kitchen**, each with a unique invoice number.

**Options:**

| Option | Description |
|---|---|
| Manual | Client handles this edge case themselves (e.g., split orders, manual invoice creation) |
| Custom Plugin (~$500) | Build a flexible edge-case handler that can be configured per customer; handles this and future similar cases |

Mark's framing: this is a classic **edge case** — rare enough that manual handling may be acceptable, but if it recurs across customers, a configurable program is worth the investment.

**Action:** Karly to discuss options with Lucy and determine volume/frequency of this scenario.

---

### 6. Purchase Order (PO) Field — Scoped

**Problem:** B2B customers (e.g., Willie Street Co-op) have PO numbers they need to associate with orders. There is currently no PO field at checkout.

**Solution:** Add a custom, **non-required** text field labeled "Purchase Order" to the checkout page. The field value must be mapped to the WooCommerce order record so it flows through to ShipStation and any future invoicing integration.

**Notes:**
- Field should be optional — not all customers use POs.
- Mark noted this is likely already a standard field in the B2B WooCommerce plugin; Eshock should check before building custom.

**Action:** Karly to task Eshock with adding and mapping the PO field.

---

## Action Items

- [ ] **Mark** — Remove "Pay with Link" from cart and checkout pages
- [ ] **Karly** — Email Lucy re: QuickBooks invoicing options ($100/yr plugin vs. $300 custom build); request API access if custom chosen
- [ ] **Karly → Eshock** — Make Company Name a required field at checkout
- [ ] **Karly → Eshock** — Auto-populate Company Name from customer account profile
- [ ] **Karly → Eshock** — Add non-required PO field to checkout; map to WooCommerce order
- [ ] **Karly** — Discuss multi-kitchen invoicing edge case with Lucy; determine if manual or automated solution is preferred
- [ ] **Karly** — Compile Lucy + Vitruvian feedback into consolidated B2B to-do list

---

## Related

- [[wiki/clients/current/doudlah-farms/_index|Doodla Farms Client Overview]]
- [[wiki/meetings/2026-01-16-weekly-call-karly|Weekly Call — 2026-01-16]]