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
| Feature | What Gets Migrated |
|---|---|
| Suppliers | Contact info, notes (editable in Bookkeep after migration) |
| Purchase order history | Stocky POs inclusive to line items import as static records |
| Receiving history | What was received against each PO |
| Supplier cost rollup | One record per variant per supplier -> last cost, avg cost, receipt count, and total units calculated from Stocky POs |
| Supplier catalog prices | Optional, from the variant cost CSV in step 4 |
Data Migration
| Data Element | Derived from |
|---|---|
last_cost / last_cost_at | cost_price of latest-dated delivered items |
receipt_count | Count of delivered lines |
total_units | Sum of quantities |
avg_cost | total_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:
-
Inventory counts and stocktakes
-
Stock transfers between locations
-
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
- In Stocky, open API key access in your settings and copy the key.
- In Bookkeep, go to Settings → Purchase orders.
- 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.
- 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.
- 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.
- Vendor supplier link. Matches vendor names to supplier records, as described above.
- 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.
| Step | Counters | What to look for |
|---|---|---|
| Suppliers | Pages, Fetched, Created, Updated, Skipped | Skipped means the record was unusable, usually a missing ID. On a repeat import, Updated equals Fetched and Created is zero. |
| Purchase orders | PO Count, POs Created / Updated / Unchanged, and the same four counts for line items | Unchanged 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 link | Vendors Linked, Vendors Created | Linked 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 records | Total Inventory Items, Variants Found, Created, Updated, Unchanged, Skipped No Variant, Errors | Skipped 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
- Open the Variant Report at
https://stocky.shopifyapps.com/reports/variants. - Select these three columns, all required: Supplier, Shopify ID, Average Cost.
- Add Cost Price if you also want supplier catalog prices imported.
- 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.
| Counter | What it means |
|---|---|
| Total Rows | Rows processed. Every other counter sums to this. |
| Seeded | Variants 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 Variant | The Shopify ID matched nothing. Sync the product, then re-run. |
| Skipped No Cost | Average Cost was blank or zero. |
| Skipped No Inventory Item ID | The matched variant has no inventory item ID configured. |
| Skipped Already Seeded | The variant already has an opening seed. Only one is allowed per variant. |
| Errors | Unexpected 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:
- Cost method — last cost received, or weighted average cost. See Choose Your Cost Tracking Method.
- Landed cost fees — shipping, duties, and discounts, and how each spreads across a receipt. See Configure Fees and Discounts.
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
- Open an imported Stocky PO and click Duplicate. You get a real Bookkeep PO you can edit and receive.
- 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.
- Order it, then click Receive when the stock arrives. Partial receipts are fine, so you can receive 3 units now and the rest later.
- 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.
- 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 Stocky | In Bookkeep |
|---|---|
| Create a purchase order | Build a new PO, or Duplicate an imported one |
| Supplier cost price lists | Supplier catalog price per variant, on the supplier record |
| Receive a purchase order | Receive on the PO, or use the Receive Inventory tile in Shopify POS |
| Receive against a paper invoice | A receipt with its invoice number and fees and discounts |
| Damaged or short shipment | Rejected quantity with a reason, on the receipt line |
| Average unit cost | Weighted average cost, from a replayable cost ledger |
| Email a purchase order to a supplier | Send it from the PO |
| Print purchase orders and barcode labels | PDF and CSV export from the PO; labels print during receiving |
| Enter the supplier bill in QuickBooks | Push the receipt as a bill |
| Stocktakes, transfers, POS stock lookups | Shopify'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.