Skip to main content

Migrating from Stocky to Bookkeep Inventory

Bookkeep Inventory is a direct replacement for Stocky. When you migrate, your core Stocky account components - suppliers, purchase orders, receiving history - import automatically into Bookkeep.

TL;DR - The most important explainer in this guide is seeding your opening costs. If nothing else, read that step. Setting costs is crucial for using Bookkeep Inventory.

Feature Migration​

FeatureWhat Gets Migrated
SuppliersContact info, notes (editable in Bookkeep after migration)
Purchase order historyStocky POs inclusive to line items import as static records
Receiving historyWhat was received against each PO
Supplier cost rollupOne record per variant per supplier -> last cost, avg cost, receipt count, and total units calculated from Stocky POs
Supplier catalog pricesOptional, from the variant cost CSV in step 4

Data Migration​

Data ElementDerived from
last_cost / last_cost_atcost_price of latest-dated delivered items
receipt_countCount of delivered lines
total_unitsSum of quantities
avg_costtotal_spend / total_units, quantity-weighted across delivered items

Caveats on the migration:

  • You must set your own opening costs. The API import gives you history and pricing. It does not set weighted average cost. Do that in seeding your opening costs
  • Stocky Orders are information only. Imported POs are records of what you ordered in Stocky. They cannot be received against in Bookkeep. If you need to do that, press Duplicate then use the Bookkeep clone of the PO.

Shopify is your source of truth​

Bookkeep is designed as a smart extension to Shopify -- not a replacement. Stocky was an internal product within Shopify; now that it's gone, certain workflows should be done in Shopify directly:

  1. Inventory counts and stocktakes

  2. Stock transfers between locations

  3. Checking stock levels and accepting transfers on POS

Vendors and suppliers​

  • Vendor — who makes the product. It's a name carried on the product, not a record you manage.
  • Supplier — who you buy it from. One product may be available from multiple Suppliers.

Suppliers are a primary concept in Bookkeep. Every Purchase Order you create must designate a Supplier from which you are ordering. Contact details, purchase order history, and supplier cost history all tie to supplier records.

Because Stocky was looser about Supplier definition, you might see a Supplier record appear twice in Bookkeep after your migration. This happens due to a product defect within Stocky, whereby POs were linked by both `ID` and `name`.

Ensure your Supplier naming is consistent in Stocky before you import to avoid duplicate records appearing in Bookkeep. The match is exact and case-sensitive, so Agron and agron become two suppliers.

You don't need to assign products to suppliers ahead of time. Adding a product to a purchase order links it to that PO's supplier, and the link holds what's specific to the pair: supplier price, supplier SKU, lead time, case cost, and pack size.

Okay, let me migrate already!

Step 1: Paste your Stocky API key​

  1. In Stocky, open API key access in your settings and copy the key.
  2. In Bookkeep, go to Settings → Purchase orders.
  3. Paste the key into Stocky API key and save.

Step 2: Run the import​

Go to Settings → Stocky import and click Run import. Four steps run in order, each building on the one before it. If a step fails, the rest are skipped and the import is marked failed.

  1. Suppliers. Pulls every supplier from Stocky. Existing records are updated, new ones added. Two suppliers sharing a name get a suffix so they stay distinct.
  2. Purchase orders. Pulls your full PO history with line items. Records are written only where something changed, and a raw copy of the Stocky response is archived for audit.
  3. Vendor supplier link. Matches vendor names to supplier records, as described above.
  4. Supplier cost records. Walks every delivered PO line item and writes the supplier cost onto the matching product variant. Line items whose product has not synced into Bookkeep yet are skipped and counted separately.

Run it as often as you like. Every step upserts, so nothing duplicates, and a re-run picks up whatever changed in Stocky since the last one. A store with roughly 1,000 POs and 8,000 line items finishes in under a minute.

Step 3: Read the results​

Every step reports counters. Two rules tell you at a glance whether the numbers hang together: Created plus Updated plus Skipped or Unchanged should equal the total fetched, and Variants Found plus Skipped No Variant should equal Total Inventory Items.

StepCountersWhat to look for
SuppliersPages, Fetched, Created, Updated, SkippedSkipped means the record was unusable, usually a missing ID. On a repeat import, Updated equals Fetched and Created is zero.
Purchase ordersPO Count, POs Created / Updated / Unchanged, and the same four counts for line itemsUnchanged means the record already matched Stocky exactly and nothing was written. Everything is Created on the first run and mostly Unchanged after that.
Vendor supplier linkVendors Linked, Vendors CreatedLinked counts POs connected to a supplier. Created counts new suppliers made for unmatched vendor names, and drops to zero once your naming is consistent.
Supplier cost recordsTotal Inventory Items, Variants Found, Created, Updated, Unchanged, Skipped No Variant, ErrorsSkipped No Variant means the product has not synced into Bookkeep. Sync it and re-run. Errors should be zero.

Step 4: Seed your opening costs​

Skip this step and your weighted average cost begins at your first Bookkeep receipt, discarding every dollar of cost history before it. How Weighted Average Cost Works explains why.

The opening cost comes from a Stocky variant report, exported as CSV. Run step 2 first: the CSV matches supplier names against existing supplier records and does not create suppliers.

Export from Stocky​

  1. Open the Variant Report at https://stocky.shopifyapps.com/reports/variants.
  2. Select these three columns, all required: Supplier, Shopify ID, Average Cost.
  3. Add Cost Price if you also want supplier catalog prices imported.
  4. Click Export CSV. Any other columns you leave selected are ignored.

Bookmark the report URL with your columns already chosen and the next export is one click.

Check Average Cost before you import. It becomes your opening cost basis, and each variant takes only one seed. Stocky's cost may reflect the original PO price rather than landed cost, leaving out freight or duties. Shopify's cost per item can also differ from Stocky's if someone edited it in Shopify admin. Correct the CSV first.

Import into Bookkeep​

Upload the file in the variant cost section of Settings → Stocky import.

Each row can write two things: a cost baseline on the variant's ledger, recorded as a seed event, and a supplier catalog price where the row has a Cost Price and its supplier name matches a record.

Three properties of the seed are what make the timing forgiving:

  • It uses cost only. The stock column is ignored. Quantity is resolved at your first receipt, against the live on-hand count at that moment.
  • The export date does not matter. With no quantity to go stale, a CSV exported weeks ago imports the same as one exported today.
  • It backdates. If a variant already has Bookkeep receipts, the seed is written before the earliest one and the ledger recalculates. Nothing has to freeze while you migrate.

Importing costs changes nothing in Shopify. The seed sits in Bookkeep until receiving puts it to work.

CounterWhat it means
Total RowsRows processed. Every other counter sums to this.
SeededVariants with no prior cost history, given a baseline.
Seeded (Backdated)Variants that already had receipts. The baseline was applied retroactively and the ledger recalculated.
Skipped No VariantThe Shopify ID matched nothing. Sync the product, then re-run.
Skipped No CostAverage Cost was blank or zero.
Skipped No Inventory Item IDThe matched variant has no inventory item ID configured.
Skipped Already SeededThe variant already has an opening seed. Only one is allowed per variant.
ErrorsUnexpected failures. Should be zero.

Re-running is safe. Already-seeded variants are counted and left alone.

Step 5: Set your cost method and fees​

Two settings decide what Bookkeep pushes to Shopify's cost per item:

Set both before your first receipt. Allocation method deserves a minute of thought, because splitting freight evenly across a $100 item and a $1 item distorts both: see what allocation does to your numbers.

Step 6: Run your first live purchase order​

  1. Open an imported Stocky PO and click Duplicate. You get a real Bookkeep PO you can edit and receive.
  2. If the Stocky original is still open, cancel it in Stocky so Shopify does not count the incoming quantity twice. Archiving isn't enough: it only hides the PO in Stocky and leaves its incoming quantity in Shopify. Deleting it removes both.
  3. Order it, then click Receive when the stock arrives. Partial receipts are fine, so you can receive 3 units now and the rest later.
  4. Enter your shipment details: the quantity received for each line, any rejected quantities (with reasons), and applicable landed cost fees. You may also enter an invoice number. This is optional and will carry over to the QuickBooks bill, so please limit it to 21 characters.
  5. Select Submit. Bookkeep will recalculate costs and sync the updates to Shopify. If you are not ready to commit, select Save as draft to store your progress without affecting the purchase order or your Shopify inventory.

Clear open Stocky POs before you deactivate a location. Shopify won't deactivate a location that still has incoming inventory from Stocky, and Stocky POs that were ordered but not received don't carry over. Recreate each one in Bookkeep with Duplicate, then delete the original in Stocky.

If a receipt was entered wrong, nothing is erased. See Fix a Receipt: Voids and Cost Corrections.

How can I accomplish my Stocky in Bookkeep?​

In StockyIn Bookkeep
Create a purchase orderBuild a new PO, or Duplicate an imported one
Supplier cost price listsSupplier catalog price per variant, on the supplier record
Receive a purchase orderReceive on the PO, or use the Receive Inventory tile in Shopify POS
Receive against a paper invoiceA receipt with its invoice number and fees and discounts
Damaged or short shipmentRejected quantity with a reason, on the receipt line
Average unit costWeighted average cost, from a replayable cost ledger
Email a purchase order to a supplierSend it from the PO
Print purchase orders and barcode labelsPDF and CSV export from the PO; labels print during receiving
Enter the supplier bill in QuickBooksPush the receipt as a bill
Stocktakes, transfers, POS stock lookupsShopify's native inventory tools

Troubleshooting​

The import failed. A failed step stops every step after it, but the ones that already finished are kept. Re-run the import and it picks up where it stopped.

Authorization error. Almost always a wrong or expired Stocky API key. Copy it from Stocky again and save it in Settings → Purchase orders.

Network errors. Connection resets and timeouts retry three times before the step is marked failed.

Errors during the cost step. Individual items that fail are logged and skipped so the rest continue. The Errors counter tells you how many were affected.

Variants skipped. The product has not synced from Shopify into Bookkeep yet. Once it has, re-run the import.

Frequently asked questions​

See the Inventory FAQ.

Notes​

  • Forecasting and suggested order quantities are in beta. The window a supplier is forecast over is the Forecast suggestion period (days) field on the supplier record.
  • Reporting. The Inventory on Hand report under Reports lists every tracked variant with on hand, on order, weighted average cost, and value, filterable by location and supplier and exportable to CSV. Stocky's other reports, such as ABC analysis and profit, have no in-app equivalent yet. Pull that data through the Bookkeep API with a scoped key from Settings → API keys.
  • Barcode labels print during receiving through a Shopify App Store label app. We recommend CTS Multi Barcode Labels.