ShipBob troubleshooting
Start from what you see. Each section names the symptom, quotes the message on screen, explains the cause, and gives the fix. Some fixes happen in ShipBob rather than SKU.io. In those cases the page says what to change or ask for.
At a glance
| You see | Likely cause | Go to |
|---|---|---|
| Invalid credentials on the Dashboard, or an Integration Authorization Expired alert | ShipBob rejected the API token | ShipBob rejected the API token |
| Billing access denied on the Bills tab | The token can't read billing | Billing access denied |
| A fulfillment order shows Rejected | ShipBob refused the order | ShipBob rejected a fulfillment order |
| An order sits at Processing, Exception, or On Hold | ShipBob can't ship it yet, often because a product isn't mapped | An order isn't shipping |
| The sales order or your store has no tracking | The shipment isn't recorded, or the store sync is separate | Tracking isn't reaching the sales order or the store |
| ShipBob and SKU.io stock don't match | Mapping, timing, or a real count difference | Inventory doesn't match |
| A product shows Needs Review | More than one SKU.io product matched | A product needs review |
| Bills show Unattributed | SKU.io couldn't find what caused the charge | Charges are unattributed |
| An invoice shows Variance | The bills don't add up to the invoice | An invoice shows a variance |
| Webhook events show Failed, or the dashboard shows an amber warning | A notification didn't process, or none are arriving | Webhooks aren't working |
| The job tray says ShipBob is unavailable | ShipBob isn't answering | ShipBob is unavailable |
ShipBob rejected the API token
What you see
- On the Dashboard, the Connection chip shows a red Invalid credentials, and a red banner at the top says ShipBob credentials are invalid: ShipBob no longer accepts the API token. Syncs will keep failing until you enter a valid token. It has a Fix in Settings button.
- An alert titled Integration Authorization Expired: "The authorization for ShipBob Fulfillment has expired. Please reauthorize to resume syncing." Admins also get an email. Your connection's name appears where this example says ShipBob Fulfillment.
- Test Connection on Settings → Connection shows Connection failed, with a message that starts "ShipBob did not accept the API token — it may be wrong, expired or revoked."
Cause: The Personal Access Token was revoked or expired in ShipBob, or it belongs to a different ShipBob environment. SKU.io stops syncing for the connection and alerts admins once.
Fix
- In ShipBob, go to Integrations › API Tokens and create a Personal Access Token.
- In SKU.io, on the connection's Dashboard, click Fix in Settings. Settings → Connection opens.
- Paste the token into Personal Access Token.
- Click Save Changes. Once ShipBob accepts the new token, the Dashboard shows Connected again, and the banner and alert clear.
- (Optional) Click Test Connection to check it now. The status shows Connected, and Write Channel lists the ShipBob channels the token can write to.
If ShipBob is reachable again and the old token still works, for example after a ShipBob outage, click Test Connection without changing the token. A passing test also restores Connected.
If Test Connection says to check that the token is a production token from web.shipbob.com, you pasted a sandbox token. Create the token in your live ShipBob account.
Billing access denied
What you see: On the Bills tab, a red alert: "Billing access denied: the API token needs the billing_read scope." It has Update token and Retry sync buttons. The job tray shows ShipBob Billing Sync as failed.
Cause: The token works for orders and inventory, but it wasn't created with permission to read billing. Nothing from the failed billing sync was saved.
Fix
- In ShipBob, create a Personal Access Token with
billing_readenabled. - On the Bills alert, click Update token. Settings → Connection opens.
- Paste the token into Personal Access Token, and click Save Changes.
- Go back to Bills and click Retry sync.
Any other billing failure shows as an amber alert that begins "Last billing sync failed:" followed by ShipBob's message.
ShipBob rejected a fulfillment order
What you see: The fulfillment order shows Rejected, and its header shows Rejected with the date. A red banner gives the reason, then "Fix the issue above, then re-submit." and a Re-submit button. The banner's first line says who refused the order:
- "SKU.io didn't send this fulfillment order to ShipBob." SKU.io's own check stopped it, so ShipBob never saw it. This is the case for a missing country and for a missing shipping method.
- "ShipBob rejected this fulfillment order." ShipBob received the order and refused it. ShipBob's reason follows.
| Reason on screen | Cause | Fix |
|---|---|---|
| "ShipBob needs a country on the shipping address. Add the country to sales order SO-SB-1010's shipping address, then submit it again." | The sales order's shipping address has no country. ShipBob needs one for every order. | Edit the sales order's shipping address and add the country. Then click Re-submit. |
| A message that starts "No ShipBob shipping method for" and names the fulfillment order, then says to map its shipping method or choose a Fallback ShipBob shipping method | The order's shipping method isn't mapped to a ShipBob service, and Fallback ShipBob shipping method is blank. | Map the method on the Shipping Methods tab, or choose a Fallback ShipBob shipping method on Settings → General. Then click Re-submit. See Map ShipBob shipping methods. |
| A message that says "ShipBob turned down the request — your ShipBob plan may not include it, or the API token is missing a permission it needs." | Your ShipBob plan or the token's channel access doesn't allow creating orders. | Ask ShipBob to check your plan and the token's channel access. Then click Re-submit. |
| A message that says "ShipBob could not complete the request." | ShipBob refused something in the order, such as a field it requires. ShipBob's own words follow, after "ShipBob said:". | Fix what ShipBob names on the sales order. Then click Re-submit. |
| A message that starts "ShipBob did not accept the API token" | The token was revoked. | See ShipBob rejected the API token. |
The order number in the first message is from the demo data. Yours names your own order.
A rejected order isn't retried on its own, because the same order would fail again. Short outages are different: if ShipBob is busy or doesn't answer, SKU.io retries the submission and doesn't mark it rejected. Resubmitting is safe. If ShipBob already has the order, SKU.io links to it rather than creating a second one.
For how submission works, see Dispatch to a fulfillment provider.
An order isn't shipping
Open the order on the Orders tab, or find its row on the Shipments tab, and read the Status and Status Detail.
| Status and detail | Cause | Fix |
|---|---|---|
| Processing, with Picked, Packed, or Labeled | ShipBob is working on it. | Nothing to do. |
| Exception, Out of Stock | ShipBob can't allocate the units at the fulfillment center it assigned. A common cause is a product that wasn't mapped when the order was sent: SKU.io sent it under its SKU.io SKU, so ShipBob created a new product with no stock. See How each product is sent. | If ShipBob holds the stock under a different product, map the product. Then fix the order that's already stuck: change the item to the right product in ShipBob, or cancel the fulfillment order in SKU.io and submit the new one SKU.io creates. If the stock is short, send stock to that fulfillment center, or ask ShipBob to move stock to it. |
| Exception, Unknown SKU | ShipBob couldn't match or create a product for an item on the order. | Check the item's SKU on the sales order and the ShipBob product it should be. Correct the item in ShipBob, or cancel the fulfillment order in SKU.io, fix the product or its mapping, and submit the new fulfillment order. |
| On Hold, Invalid Address | ShipBob can't ship to the address. | Correct the address on the sales order. SKU.io sends it to ShipBob if nothing has been picked yet. See Change or cancel a ShipBob order. |
| On Hold or Exception, Missing Tariff Information | An international order lacks customs details. | Add the customs details in ShipBob. |
| On Hold or Exception, No Package Preference Set | ShipBob has no packaging set for an item. | Set the item's packaging in ShipBob. |
| On Hold, Manual | ShipBob staff put it on hold. | Ask ShipBob why. |
| Import Review | ShipBob is reviewing the order. | Wait, or ask ShipBob. |
The dashboard's Exceptions and On Hold cards count these orders. For more on shipments, see Track ShipBob shipments and exceptions. To cancel a fulfillment order, see Change or cancel a ShipBob order.
If you try to change an order ShipBob has started, SKU.io refuses with "Cannot update ShipBob order" followed by the ShipBob order number and "it is already in fulfillment (picked or later)." Make the change in ShipBob instead.
Tracking isn't reaching the sales order or the store
Check the shipment first. On the Shipments tab, find the shipment and read its Fulfillment column.
- The Fulfillment column shows a fulfillment number. SKU.io recorded the shipment and its tracking on the sales order. Getting tracking to your store is that store connection's job. Check its own sync. See Track shipments.
- The Fulfillment column shows —, and the status is Completed. SKU.io hasn't recorded the shipment yet. Check the following, in order:
- Is the order linked? On the Orders tab, an order with no Fulfillment Order wasn't sent by SKU.io, so SKU.io has nothing to record it against. Orders marked External came from your other ShipBob channels and are shown only for reference.
- Did the notification fail? Look for the order's event on Webhooks → Events. Replay it if it shows Failed. See Check ShipBob webhooks and activity.
- Is the Shipments sync on? The tracking sweep every 15 minutes picks up anything a notification missed. It's off when Enable automatic syncing or Shipments is off on Settings → Sync. Click Sync from ShipBob on the Shipments tab to sync now.
- The status is Processing, Exception, or On Hold. It hasn't shipped. See An order isn't shipping.
Inventory doesn't match
Read Review ShipBob inventory first. It explains what ShipBob's numbers mean. Then work through these checks in order:
| Check | Why it matters |
|---|---|
| Is the fulfillment center mapped? | The Inventory tab says how many aren't, for example "2 ShipBob fulfillment centers are not mapped to a SKU.io warehouse. Their stock is mirrored but cannot be reconciled against SKU.io on-hand." Click Map Fulfillment Centers. See Map ShipBob fulfillment centers to warehouses. |
| Is the product mapped? | Products on the ShipBob Only view aren't mapped, so their stock is invisible to SKU.io and left out of discrepancies. |
| Is a SKU.io product missing at ShipBob? | Products on the SKU.io Only view have stock in the mapped warehouses that ShipBob has never reported. Run a products sync before you assume the stock is missing. |
| When did inventory last sync? | ShipBob's numbers are as of the Last synced time at the top of the Inventory tab. Click Sync from ShipBob to update them. |
| Is stock committed or awaiting? | Committed stock is allocated to open ShipBob orders, and awaiting stock hasn't arrived yet. Neither counts as on-hand. |
When the difference is real, correct SKU.io with a stock take. SKU.io never changes your stock from ShipBob's numbers on its own. See Create a stock take from ShipBob discrepancies.
A product needs review
What you see: On the Products tab, the Mapping column shows Needs Review. The dashboard's Unmapped Products card includes it.
Cause: Automatic matching found more than one SKU.io product with the same barcode, UPC, GTIN, or SKU, so it didn't choose between them.
Fix: Click the Needs Review chip. The mapping dialog names the barcode or SKU that matched several SKU.io products and lists them. Click the right one. Consider fixing the duplicate barcode in SKU.io too, so the next match works. See Map ShipBob products.
A product that shows Unmapped has no match at all. A bundle shows Unmapped until you map it. ShipBob reports a bundle's stock as a roll-up of its component products.
Charges are unattributed
What you see: Bills with the status Unattributed. The Attributed To column gives the reason, then the cost entry that holds the charge. The Unattributed Reason filter on the Bills tab uses the same labels.
| Reason | Fix |
|---|---|
| Order not imported | The order came from a sales channel SKU.io doesn't import. If the channel belongs in SKU.io, connect it, import the order, then re-attribute. Otherwise leave the fee as overhead. |
| Order not found | The sales order was deleted. Leave the fee as overhead. |
| Ambiguous order | More than one sales order from the channel has the store order number. Correct the duplicate, then re-attribute. |
| Shipment not found, Return not found | Sync Shipments or Returns from the Dashboard, then click Re-attribute on the bill. |
| Product unmapped | Map the ShipBob product on the Products tab. SKU.io attributes its storage charges again on its own. |
| Purchase order not found | Make sure exactly one SKU.io purchase order carries the number on the receiving order, then re-attribute. When you create receiving orders in ShipBob, use the SKU.io purchase order number. |
| No reference | ShipBob didn't say what the charge was for. It stays as overhead. |
| Kept unattributed by fee mapping | Your fee mapping keeps this fee type as overhead, or an Attribute switch is off. Change it on Settings → Financial if that's not what you want. |
| Accounting period locked | Capitalise receiving fees into PO landed cost is on, and the purchase order's receipts fall in a locked month. Reopen the month, or turn capitalising off, then re-attribute. See Reopen a closed month. |
| Exchange rate missing | Wait for the charge date's exchange rate to be published. |
Unattributed charges are never lost. They're counted as overhead in profitability and are never spread onto products. For details, see Review ShipBob bills and fix unattributed charges.
A Pending bill, such as Shipment not found · retrying, retries on its own after each billing sync, for 14 days after the charge date. You don't need to act on it at first.
An invoice shows a variance
What you see: On the Invoices tab, the status is Variance, and the Variance column shows the difference. Expand the invoice to read: "ShipBob says" the invoice amount, "SKU.io holds" the bills' total, then "Usually a line ShipBob added after the invoice was read — run Sync Bills, and if it stays, compare the line count in ShipBob."
Cause: Usually ShipBob added a charge to the invoice after SKU.io read it.
Fix
- Go to Bills and click Sync Bills.
- When the sync finishes, go back to Invoices and check the status.
- If Variance remains, compare the bill count in the Σ Transactions column with the line count on the invoice in ShipBob, and ask ShipBob about the difference.
An invoice that shows Awaiting transactions isn't a problem: ShipBob hasn't listed its bills yet, and the next bill sync checks again. See Reconcile ShipBob invoices.
Webhooks aren't working
| You see | Cause | Fix |
|---|---|---|
| An amber warning on the dashboard's Webhook Health line: "No webhook events received in over 24 hours" | ShipBob hasn't sent a notification for a day. On a quiet day that's normal. | If orders are shipping, check Webhooks → Configuration for Failed subscriptions. |
| A subscription shows Failed | ShipBob refused it. Last Error says why. | Click Re-subscribe All. If it fails again, send the Last Error text to ShipBob support. |
| An event shows Failed on Webhooks → Events | SKU.io hit an error while acting on it. Hover the Error chip to read what. | Fix the cause, then replay the event. |
| An event stays Pending | SKU.io hasn't acted on it yet. | Wait a few minutes. Shipped, delivered, and tracking events are replayed every hour for 14 days. Replay it yourself to act sooner. |
Scheduled syncs back up webhooks, so a failed notification delays an update rather than losing it. See Check ShipBob webhooks and activity.
ShipBob is unavailable
What you see: A sync in the job tray says "ShipBob is unavailable", with how many runs it has skipped.
Cause: ShipBob didn't answer, or returned an error on its side.
Fix: Usually nothing. The sync tries again a minute later, and the next scheduled run tries again. After three failed runs in a row, the job tray marks the sync as failed. If that happens, check ShipBob's status page. You can also run the sync by hand once ShipBob is back. See ShipBob scheduled syncs reference.