MerchantFlowMerchantFlow Docs
Profit & Loss

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

FieldRequiredNotes
Order dateYesDate only. Resolved in your store's timezone, so the order lands on the correct P&L day
Company or buyerYesUp to 200 characters
Contact emailNoStored 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
CurrencyFixedRead-only, always your store's reporting currency -- see below
Payment statusYesSee below -- this decides whether the order counts as revenue
Payment methodNoFree text, e.g. "Bank transfer", "invoice"
PO / invoice referenceNoYour own reference number
NotesNoUp to 2,000 characters
Ship-to countryNoTwo-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:

StatusReaches the P&L?
PaidYes
ProcessingYes
PendingNo

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

FieldDefaultEffect
Shipping charged0What you billed the buyer for freight -- revenue, not cost
Discount0Cannot exceed the merchandise subtotal
Tax0Handled per your tax rules
Payment or wire feeOptionalWhat your bank or processor charged you
Fulfilment costOptionalWhat the shipment cost you. Kept as entered -- no carrier or 3PL sync overwrites it
Override total COGSOptionalTotal 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 isPaidAttribution false, 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

On this page