One month in, one invoice per client out. This page covers the setup you do once, the export you make each month, what the close does with it, and what posts to QuickBooks. Everything here names the screens as they appear in the product.
Pilot workspaces are set up by us. You get an email with a link to choose your password; after that, sign in at the link above. You land on the close page with a Continue setup banner that opens the four-step setup. Any order works; nothing waits on QuickBooks.
PREFIX-2026-09-0001), renders a PDF per client with a usage appendix, locks the run, and posts to QuickBooks if connected. Issued runs are immutable; corrections go on next month's run.Version one imports CSV. Each source has a saved column mapping: which column is the client, the date, the quantity, and so on. A charge code and a unit can come from a column or be the same for every row in the file. Dates need a format; the three below are the common ones.
Shipments → Export. One row per shipment; the Items column is the unit count, which drives the included-units and additional-unit charges.
| Mapping field | Choose | Note |
|---|---|---|
| Client name | Store | Each store name becomes a client alias the first time you map it |
| Activity date | Ship Date, format M/d/yyyy | US format as ShipStation writes it |
| Quantity | Items | |
| Units per order | Items | Same column: one order, N units |
| Reference | Order # | Prints in the usage appendix |
| Charge code | The same for every row: pick.order | |
| Unit | The same for every row: orders |
Orders → Export → CSV. Shopify writes one row per line item. Filter to fulfilled orders before exporting: an unfulfilled order has an empty Fulfilled at, and the import refuses the whole file at the first blank date, naming the row. An order with several line items exports as several rows and prices as several orders; prefer the ShipStation export when you have it, or consolidate rows by Name first.
| Mapping field | Choose | Note |
|---|---|---|
| Client name | Vendor | When each client is a vendor in one store; use a separate export per store otherwise |
| Activity date | Fulfilled at, format yyyy-MM-dd HH:mm:ss zzz | Shopify includes the time zone |
| Quantity | Lineitem quantity | |
| Units per order | Lineitem quantity | |
| Reference | Name | The order number, like #2101 |
| Charge code | The same for every row: pick.order | |
| Unit | The same for every row: orders |
Most WMS exports carry an activity or transaction code per row. Map it as the charge code column, then tell the source what each of your codes means (code aliases): PLT-IN → receive.pallet, PICK → pick.order, and so on. Unknown codes show up as No rate exceptions with the raw text, so you can add the alias and re-price.
| Mapping field | Typical column | Note |
|---|---|---|
| Client name | Client | |
| Activity date | Activity Date, format yyyy-MM-dd | Change the format to match the file |
| Charge code | From a column: Activity | Plus code aliases |
| Quantity | Qty | |
| Unit | From a column: UOM | See the unit spellings below |
| Reference | Ref |
storage.pallet.month row per day with the pallets on hand that day. The engine adds up the daily rows and divides by the days in the month; it never carries a count forward, so a month with only three count rows bills three days of storage. If you count less often, repeat the last count for each day until the next count.For activity no system exports (pallet counts, kitting hours, returns), or for a 3PL whose whole month lives in a workbook. The columns are the importer's own, the codes are the seeded catalog, so the mapping editor recognises every column and the import lands with zero unresolved rows. The example month carries thirty daily pallet counts (38 pallets, then 40 from the 25th), which is what prorated storage needs.
Download the template (CSV)client,date,code,quantity,unit,child_quantity,reference HARBOR,2026-09-01,storage.pallet.month,38,pallet,,Pallet count 1 Sep HARBOR,2026-09-02,storage.pallet.month,38,pallet,,Pallet count 2 Sep …one storage row for every day of the month… HARBOR,2026-09-03,receive.pallet,5,pallet,,Receipt 7 HARBOR,2026-09-02,pick.order,1,order,3,#1001 HARBOR,2026-09-09,returns.unit,4,each,,RMA 14 HARBOR,2026-09-15,labor.kitting.hour,1.5,hour,,Kitting WO 3
| Column | What goes in it |
|---|---|
client | The client's name or any alias you have given it (HARBOR, Harbor Goods Co.) |
date | The day the activity happened, yyyy-MM-dd |
code | A charge code from the table below, or one of your custom codes |
quantity | How many units. Decimals are fine (1.5 hours). For storage, the pallets on hand that day, one row per day |
unit | What the quantity counts: pallet, carton, each, order, hour, or any spelling in the unit table |
child_quantity | Only on pick.order rows: the units in that order. Leave empty otherwise |
reference | Order number, receipt, RMA, work order. Prints in the usage appendix so a client can check any line |
Save as CSV (UTF-8) and import it like any other source. Rows dated outside the billing month are ignored and counted on the close page.
Seeded in every workspace. Add your own under Settings, Charge catalog; custom codes are lowercase dotted names like labor.assembly.hour.
| Code | Name | Category | Default unit | What counts as one |
|---|---|---|---|---|
storage.pallet.month | Pallet storage | Storage | pallets | Pallets on hand on a day; the engine prorates by the day or snapshots on a day you choose |
storage.pallet.day | Pallet storage, daily | Storage | pallets | Pallet-days billed as counted, no proration |
storage.bin.month | Bin storage | Storage | bins | Bins on hand |
storage.cuft.month | Cubic foot storage | Storage | cu ft | Cubic feet on hand |
receive.pallet | Receiving | Handling | pallets | Pallets received |
receive.carton | Receiving | Handling | cartons | Cartons received |
receive.unit | Receiving | Handling | units | Units received |
pick.order | Pick and pack | Handling | orders | One shipped order; the rate card says how many units are included |
pick.unit.additional | Additional units | Handling | units | Units beyond the included count; derived from the order's unit count, never imported |
pack.carton | Packaging | Packaging | cartons | Cartons packed or supplied |
returns.unit | Returns processing | Returns | units | Units returned and processed |
labor.hour | Labor | Labor | hr | General labor by the hour |
labor.kitting.hour | Kitting labor | Labor | hr | Kitting or assembly by the hour |
minimum.month | Monthly minimum | Minimum | Never imported: the engine adds the shortfall when a client is under the minimum |
Case does not matter. A row whose unit does not match the rate line's unit is an exception, never a silent conversion.
| Unit | Accepted spellings |
|---|---|
| Pallet | pallet, pallets, plt, skid |
| Bin | bin, bins |
| Cubic foot | cubicfoot, cubic foot, cubic feet, cuft, cu ft, ft3 |
| Carton | carton, cartons, ctn, case, cases |
| Each | each, ea, unit, units, pc, pcs, piece, pieces |
| Order | order, orders, shipment, shipments |
| Hour | hour, hours, hr, hrs |
Connect once from Settings, QuickBooks Online, Connect QuickBooks Online. Intuit asks you to
sign in and pick the company; you land back in Settings connected. The first connect creates one service
item, Tahona Billing services, under your first income account; every invoice line references
it and carries the charge description.