Post orders, purchase orders and returns to QuickBooks Online or Xero when you choose, and buy EasyPost or ShipStation labels with delivery tracking.
Two kinds of partner connect to Products & inventory. An accounting partner — QuickBooks Online or Xero — receives a sales order as an invoice, a purchase order as a bill and a received return as a credit note, at the moment you choose. A shipping partner — EasyPost or ShipStation — rates and buys a label from an order's Ship form, puts its tracking on the shipment, and marks the shipment delivered when the carrier delivers it. Nothing is sent anywhere until you switch it on for a connection.
inventory:config:manage) to open Accounting & shipping, connect a partner and choose what it does. The seeded Manager role has it.inventory:orders:manage) to send one order or purchase order to your books by hand, and to get rates and buy a label on the Ship form. The seeded Member role has it.Inventory → Setup → Accounting & shipping (/inventory/integrations).
You come back to the connection's panel with a Connected message. Its row on the page reads invoices off · bills off: every push starts off, by design.
If the form says the deployment has no app configured, fill in Client ID (your own app) and Client secret (your own app) from your own Intuit or Xero developer app. Your app's callback address is https://<your Karmaflow.ai address>/internal/inventory/partners/oauth/callback.
Open the connection from its row. The section What is posted, and when holds the switches; nothing posts until one is set.
| Setting | Choices | Posts |
|---|---|---|
| Post sales orders as invoices | Off · When the order is paid · When the order is fulfilled (everything shipped) | An invoice for the order. Paid is the moment the order's payment turns paid — Mark paid, an order created already paid, or a store reporting it paid. Fulfilled is the moment its last line ships. |
| Include orders from connected stores and Workiz | Off (default) · on | Off: orders from your online stores are left to the store's own accounting app, and Workiz parts orders to Workiz, which invoices the job. |
| Post purchase orders as bills | Off · When the order is placed (ordered quantities) · When goods arrive (received quantities) | A bill for the purchase order. Placed is Mark ordered; goods arrive is when the purchase order is fully received. |
| Post received returns as credit memos (QuickBooks) / credit notes (Xero) | Off (default) · on | A credit note for a return, when it is received. |
Below them sit the mapping settings: where lines post, which tax codes to use, how documents are numbered. Their lists — accounts, items, tax codes — load from your books once the connection is verified; until then a list reads Verify the connection to load the list. Click Save when done.
QuickBooks Online
| Setting | What it decides |
|---|---|
| Sales lines post to | One item (every line on the item below, with the product name and SKU as the description) or One item per SKU (the QuickBooks item named by the SKU, created as a non-inventory item when there is none — never an inventory item, since Karmaflow.ai keeps the stock and its cost). |
| Item for sales lines · Income account for new items | The item whose income account takes the sales; the account new per-SKU items post to. |
| Shipping item · Discount account | Blank shipping: QuickBooks' own shipping line when shipping is on in its sales form settings, else the sales item. Blank discount: QuickBooks' default discount account. |
| Bill account · Freight and duty account | Where purchase lines post (your inventory asset account, or a purchases / cost-of-sales account), and where a purchase order's additional costs go. |
| Sales tax code · Tax code for untaxed lines · Purchase tax code | Outside the US, the codes lines post with when none matches their rate. |
| Sales tax figure | US companies: QuickBooks calculates it, or The order's own tax total (US). |
| Invoice and credit memo numbers | Our order / credit note number, or QuickBooks numbers them (ours goes in the private note). |
| Due in (days) | Blank uses the customer's or vendor's terms in QuickBooks. |
Xero
| Setting | What it decides |
|---|---|
| Post documents as | Drafts (default; someone approves them in Xero) or Approved. A document already approved stays approved. |
| Sales account · Shipping account | Where invoice and credit note lines post; shipping posts to the sales account when blank. |
| Bill account · Freight and duty account | As for QuickBooks. |
| Sales tax rate · Tax rate for untaxed lines · Purchase tax rate | Used when a line's own rate matches no Xero rate. |
| Sales tax figure | Xero calculates it, or The order's own tax, so Xero's total is the order's to the cent. |
| Invoice and credit note numbers | Our order / credit note number, or Xero numbers them (ours goes in the reference). |
| Due in (days) | Blank uses the contact's or the organisation's payment terms. |
The customer (or supplier) is found in your books by email, then by name, or created. A foreign-currency order needs that currency switched on in your books (multicurrency in QuickBooks).
Each order, purchase order and return remembers the document it became in each connection. Sending it again updates that document in place, lines replaced. With no record of a previous post, a document with the same number for the same customer or supplier is adopted rather than posted again, and every create is sent so that a retried request cannot make a second document. A document deleted (or, in Xero, voided) in your books is replaced by a new one. Xero refuses to change a document that has payments or allocations against it, and says so.
When an accounting partner is connected, the order panel (Inventory → Orders → Sales orders → an order) and the purchase-order panel (Inventory → Orders → Purchase orders → one) have an In your books section.
The section then reads Invoice <number> in <connection> · <when> (or Bill …) — the number links to the document when your books give a link — with Send again beside it. Sending by hand needs inventory:orders:manage, and it sends whatever the automatic setting says — including a store or Workiz order the automatic push leaves out.
The connection's panel lists Recent activity: each push with when it ran, ok or failed, what it was (an order, a purchase order, a return, a label) and the document number or the partner's answer.
An automatic push that fails is said where you will see it:
Some refusals are the books' own rules: a US QuickBooks company takes no tax-inclusive prices, so such an order is refused with that sentence; a currency your books have not switched on is refused with theirs.
Inventory → Setup → Accounting & shipping, the Shipping section.
EasyPost
ShipStation
TEST_ key is its sandbox.On the connection's panel, Labels sets Label format (PDF, PNG, ZPL (thermal printers)), Label size (4 × 6 in or Letter) and Rate with — blank rates with every carrier account active in EasyPost, or every carrier connected to ShipStation. Labels are charged the way the partner is set up: EasyPost's wallet or your own carrier account, or the carrier's setup in ShipStation.
When a shipping connection verifies, Karmaflow.ai sets up delivery tracking with the partner itself, with a secret only the two sides know — there is nothing to paste. The Tracking updates section then reads Set up with <Provider> and when the last event arrived. A delivered parcel marks every shipment carrying its tracking number Delivered.
When it could not be set up, the section says Not set up: and why. Shipments still ship; mark them delivered by hand, or press Verify to try again once the cause is fixed. The usual reasons:
https. EasyPost and ShipStation deliver webhooks only to an https:// address.TEST_ key. ShipStation sends tracking webhooks only to production keys, so a test key rates and buys test labels without tracking.With a shipping partner connected, the order's Ship form gains a Buy a label box (the full Ship steps are in Sales and Purchase Orders):
The label is bought as the shipment is made; its carrier and tracking number go on the shipment, and the shipment card links the Shipping label with its price. If the shipment cannot be made, the label is voided, so nothing is paid for that did not ship.
A rate needs three things, and says which is missing: the order's shipping address (at least a street and a country), the shipping location's address (Inventory → Setup → Inventory Settings → Locations), and a weight. One label covers one parcel, and international parcels, which need customs details, are still bought in EasyPost or ShipStation.
Voiding a shipment voids its label too. Void on a shipment card puts the units back on the shelf and asks EasyPost or ShipStation to void the label, so the carrier refunds it. The shipment card then reads voided with the carrier, or, when the provider refused (a label already scanned, for example), not voided — void it with the carrier for a refund.
Disconnect, at the bottom left of the connection's panel, asks first: what was already posted stays in your books, and nothing more is sent. A shipping connection's tracking webhook is removed from the partner when it can be.