Manual Orders - Record B2B and Wholesale Revenue
Enter wholesale, B2B, and off-platform orders into MerchantFlow by hand so revenue that never touches your storefront still reaches your P&L, with full COGS and fulfillment cost attribution.
Manual Orders
Manual orders let you record revenue that never passes through your storefront. Wholesale deals close over email, B2B invoices get paid by bank transfer, and trade-show sales happen on paper -- none of it reaches the Shopify or WooCommerce sync, so none of it reaches your P&L unless you enter it. A manual order behaves like a synced order everywhere downstream: it carries COGS, fulfillment costs, and a shipping destination, and it flows into margins, product performance, and margin by region.
When to use manual orders
- Wholesale and B2B -- a purchase order fulfilled outside the storefront
- Off-platform sales -- markets, pop-ups, trade shows, phone orders
- Invoiced revenue -- work billed and paid by bank transfer
If the order already exists in Shopify or WooCommerce, do not re-enter it here. It will sync on its own and a manual copy would double-count the revenue.
Availability
Manual order entry requires the Pro or Plus plan. On Starter the New B2B order button does not appear on the Orders page, and the API refuses to save a manual order with an upgrade response rather than a plain error -- the feature exists on a plan you can move to.
You also need the orders:manage permission. Members without it cannot create or edit orders.
Creating an order
Go to Customers → Orders (/dashboard/orders) and choose New B2B order. The form is a full page rather than a modal because the line-item table needs the width.
Order details
| Field | Required | Notes |
|---|---|---|
| Order date | Yes | Date only. Resolved in your store's timezone, so the order lands on the correct P&L day |
| Company or buyer | Yes | Up to 200 characters |
| Contact email | No | Stored for your records only. It is deliberately not used as a customer identity, so a wholesale buyer never lands in customer LTV or cohort reports |
| Currency | Fixed | Read-only, always your store's reporting currency -- see below |
| Payment status | Yes | See below -- this decides whether the order counts as revenue |
| Payment method | No | Free text, e.g. "Bank transfer", "invoice" |
| PO / invoice reference | No | Your own reference number |
| Notes | No | Up to 2,000 characters |
| Ship-to country | No | Two-letter country code. Feeds Margin by Region and country fulfillment rates |
Currency is fixed, not chosen
The Currency field is pre-filled with your store's reporting currency and cannot be edited. The API enforces the same rule on both create and edit: a manual order in any other currency is rejected with "Manual orders must use your tenant currency" rather than being saved and quietly dropped from the P&L.
So if the customer paid you in a different currency, convert the amounts yourself at the rate you actually received and enter the order in your reporting currency. (The P&L does filter synced orders to your reporting currency without converting -- see COGS Accuracy -- but manual orders can never fall foul of that filter, because they cannot be created in another currency in the first place.)
Payment status decides revenue recognition
This is the field that matters most:
| Status | Reaches the P&L? |
|---|---|
| Paid | Yes |
| Processing | Yes |
| Pending | No |
Pending exists so you can record an invoice that has not settled yet without it counting as revenue. The form warns you when you pick it. Change the order to Paid once the money arrives and it enters the P&L from that point.
Line items
Add at least one line item and at most 250. Each needs a name and a quantity; price is the per-unit amount.
Optionally attach a SKU, product, or variant to a line. Linking to a real product is what lets MerchantFlow pull that product's COGS automatically and roll the order into product-level reporting -- an unlinked line falls back to whatever you set as the COGS override.
Amounts
| Field | Default | Effect |
|---|---|---|
| Shipping charged | 0 | What you billed the buyer for freight -- revenue, not cost |
| Discount | 0 | Cannot exceed the merchandise subtotal |
| Tax | 0 | Handled per your tax rules |
| Payment or wire fee | Optional | What your bank or processor charged you |
| Fulfilment cost | Optional | What the shipment cost you. Kept as entered -- no carrier or 3PL sync overwrites it |
| Override total COGS | Optional | Total cost for the whole order. Leave blank to use your existing product costs |
The discount cap is enforced because line revenue is stored post-discount -- a discount larger than the subtotal would push line revenue negative and corrupt every downstream P&L reader.
Editing and deleting
Open the order from Customers → Orders and choose Edit. Create and edit share the same validation, so the same limits apply. Editing an order recalculates the affected days: margins, product performance, and regional figures all update.
Deleting a manual order removes its revenue and costs from the P&L for the days it touched.
How manual orders behave downstream
- P&L and margins -- included exactly like synced orders, subject to payment status
- Products -- line items linked to a product count toward that product's units and margin
- Margin by region -- uses the shipping country code, so set it for cross-border wholesale
- Ad spend -- manual orders are tagged as a B2B sales channel and are excluded from both sides of ad-spend allocation. A wholesale order neither absorbs a share of your ad spend nor dilutes the per-order figure your D2C orders divide, so CAC and per-order ad cost stay honest
- Attribution -- manual orders are saved with no UTM, no referrer and
isPaidAttributionfalse, and their source is stamped as b2b, so they group under a b2b source rather than being credited to a campaign - Sync -- never touched or overwritten by a storefront sync
Common questions
Does a manual order get overwritten by the next sync? No. Manual orders live outside the sync path entirely.
Can I import wholesale orders in bulk? Not through this form -- it is one order at a time. Bulk cost data goes through COGS imports instead.
Which currency should I use? You do not choose -- the field is fixed to your store's reporting currency, and the API rejects anything else. Convert a foreign-currency sale yourself at the rate you actually received and enter it in your reporting currency.
Why is my manual order missing from revenue? Almost always because its payment status is Pending. Open the order and set it to Paid.
Last updated on
Order Tracking & Attribution
Track orders, refunds, fulfillment costs, and UTM attribution data in MerchantFlow. View order-level profitability for Shopify and WooCommerce stores.
Margin by Region - Country-Level Profitability and CAC
Break your P&L down by destination country in MerchantFlow. See revenue, COGS, ad spend, CAC, POAS, net margin, and period-over-period deltas per region.