Connect Bubble to ShipBob's REST API using the API Connector plugin with a Private Bearer token header. Build a real-time warehouse inventory dashboard that surfaces low-stock SKUs across all ShipBob fulfillment centers — no manual logins to the ShipBob merchant portal required. Pagination and nested array flattening require a Bubble backend workflow on a paid plan.
| Fact | Value |
|---|---|
| Tool | ShipBob |
| Category | Productivity |
| Method | Bubble API Connector |
| Difficulty | Intermediate |
| Time required | 3–4 hours |
| Last updated | July 2026 |
Surface ShipBob warehouse data in a custom Bubble dashboard
ShipBob is a full 3PL service: you send your products to ShipBob's warehouses, they store them, and they ship orders to your customers. The ShipBob merchant portal shows this data, but it doesn't let you combine it with your other business data — CRM records, Stripe revenue, or custom KPIs — in one place.
Building a Bubble dashboard on top of ShipBob's API solves this. Your team sees current inventory across all warehouses alongside order fulfillment rates and SLA compliance, all in one internal tool you own and can customise.
The ShipBob REST API v1 base URL is `https://api.shipbob.com/1.0`. Authentication uses a Personal Access Token passed as a Bearer token — there is no Bubble marketplace plugin for ShipBob, so the API Connector is the only path. Bubble's API Connector sends all calls from Bubble's servers, making the token invisible to the browser.
The main challenge unique to Bubble: ShipBob's inventory endpoint returns a `fulfillment_center_quantities` array nested inside each product object. Bubble's API Connector can surface flat JSON fields automatically, but nested arrays appear as unreadable stringified data unless you extract them in a backend workflow. This tutorial shows you exactly how to handle that.
Integration method
ShipBob REST API v1 via Bubble API Connector with a Private Bearer token header. No Bubble marketplace plugin exists for ShipBob.
Prerequisites
- An active ShipBob merchant account with fulfillment history (ShipBob has no free API trial — you need a live or sandbox merchant account)
- A Bubble app on the Starter plan or above (required for Backend Workflows used in multi-page inventory pagination)
- The API Connector plugin installed in your Bubble app (Plugins tab → Add plugins → search 'API Connector' by Bubble)
- Basic familiarity with Bubble's workflow editor and repeating groups
Step-by-step guide
Generate a ShipBob Personal Access Token
Log into the ShipBob merchant portal and navigate to Settings → Developer → API Tokens (the exact path may be Settings → Integrations → API Tokens depending on your account tier — look for 'API' or 'Developer' in the left sidebar). Click 'Generate new token', give it a descriptive name like 'Bubble Dashboard', and copy the token immediately — ShipBob shows it only once. This token authenticates all API requests as your merchant account. Keep it secret: do not paste it into a Bubble text element or a public-facing page. You will mark it Private in the next step, which keeps it on Bubble's servers and out of browser network requests. If you lose the token, you can regenerate one in the same settings page, but any existing Bubble calls using the old token will start returning 401 errors immediately — plan a brief maintenance window if you need to rotate tokens in production.
Pro tip: Create a dedicated token for the Bubble integration rather than reusing a token from another tool. This way you can revoke access for one integration without affecting others.
Expected result: You have a 40-character token string ready to paste into Bubble. The ShipBob portal shows the token name and creation date in your API Tokens list.
Install the API Connector and configure the ShipBob connection
In your Bubble app, click the Plugins tab in the left sidebar, then click 'Add plugins'. Search for 'API Connector' and install the plugin by Bubble (it is free and maintained by Bubble). Once installed, click 'Add another API' and name it 'ShipBob'. Set the Authentication field to 'Private key in header'. In the Header field that appears, enter `Authorization` as the key name and `Bearer YOUR_TOKEN_HERE` as the value — replace YOUR_TOKEN_HERE with your actual Personal Access Token. Make sure the 'Private' checkbox next to this header is ticked. A ticked Private checkbox means this header value is stored encrypted on Bubble's servers and is never included in client-side requests, protecting your ShipBob credentials. Set the base URL to `https://api.shipbob.com/1.0`. Leave the Content-Type field blank for now — ShipBob defaults to JSON and Bubble will set this header automatically for POST calls when you add a body.
1{2 "api_name": "ShipBob",3 "base_url": "https://api.shipbob.com/1.0",4 "headers": [5 {6 "key": "Authorization",7 "value": "Bearer <private>",8 "private": true9 }10 ]11}Pro tip: If you are working in Bubble's development mode, the API Connector still sends calls server-side. CORS is not an issue — ShipBob's API will accept calls from Bubble's IP ranges without any additional CORS configuration.
Expected result: The ShipBob API group appears in your API Connector plugin list. The Authorization header is shown with a lock icon indicating it is Private.
Add and initialize the inventory list call
Inside the ShipBob API group, click 'Add another call'. Name it 'Get Inventory'. Set the method to GET and the path to `/inventory`. Add two query parameters by clicking 'Add parameter': - Name: `page`, Type: number, Default: 1 - Name: `limit`, Type: number, Default: 250 Bubble needs to send a real request with a valid response to detect the field structure. Click 'Initialize call'. Bubble will make an actual GET request to `https://api.shipbob.com/1.0/inventory?page=1&limit=250` using your Private Bearer token. If the token is valid, ShipBob returns an array of inventory objects and Bubble maps the fields automatically. In the 'Use as' dropdown, select 'Data' and tick 'List' since the endpoint returns an array. Set the 'Data type' name to something like 'ShipBob Inventory Item'. If initialization fails with a 401 error, your token is invalid or formatted incorrectly. Confirm the Authorization header value starts with 'Bearer ' (with a space) followed by the token. ShipBob returns a 401 with an empty body on auth failure — there is no additional error message to look for.
1GET https://api.shipbob.com/1.0/inventory?page=1&limit=2502Authorization: Bearer <private>Pro tip: ShipBob's inventory endpoint may return hundreds of items for large catalogues. Always use limit=250 (the maximum) to minimize the number of pages needed, and use the backend workflow in the next step to accumulate all pages.
Expected result: Bubble detects the ShipBob inventory response fields including id, reference_id, name, total_fulfillable_quantity, and the fulfillment_center_quantities array. The call status shows a green tick.
Build a Backend Workflow to flatten nested warehouse data
ShipBob's `fulfillment_center_quantities` field is an array of objects, one per warehouse, each containing `fulfillment_center_id`, `name`, and `fulfillable_quantity`. Bubble's API Connector cannot directly bind this nested array to a repeating group — it appears as a stringified list. To solve this, create a custom Bubble data type called 'ShipBob_Inventory' with fields: product_name (text), sku (text), warehouse_name (text), fulfillable_quantity (number), page_fetched (number). Then, in the Backend Workflows section of your Bubble app (accessible from the Workflow editor — click 'Backend workflows' at the top), create a new API workflow called 'Fetch ShipBob Inventory Page'. This workflow accepts one parameter: page_number (number). Inside this workflow, add the action 'Plugins → ShipBob - Get Inventory' with page=page_number and limit=250. Then add a 'Step 2' that uses a 'For each item in list' pattern (or use Bubble's 'Schedule API workflow on a list' action) to iterate over the returned items. For each item, extract each element of the fulfillment_center_quantities array and create a new ShipBob_Inventory record for each warehouse entry. Note: Backend Workflows are only available on Bubble's Starter plan ($32/mo) and above. Free-plan users cannot use this pattern. RapidDev's team has built hundreds of multi-warehouse inventory dashboards on Bubble — if this architecture feels complex, book a free scoping call at rapidevelopers.com/contact. Schedule this workflow from a page workflow triggered on page load, passing page numbers 1, 2, 3 until all inventory is fetched (check if the returned count equals 250 to decide if another page exists).
1// Backend Workflow: Fetch ShipBob Inventory Page2// Parameters: page_number (number)3// Step 1: API Call - ShipBob - Get Inventory (page=page_number, limit=250)4// Step 2: For each item in Step 1's result list:5// For each entry in item's fulfillment_center_quantities:6// Create ShipBob_Inventory:7// product_name = item's name8// sku = item's reference_id9// warehouse_name = entry's name10// fulfillable_quantity = entry's fulfillable_quantity11// page_fetched = page_numberPro tip: Use a Bubble custom state (type 'yes/no', name 'inventory_loaded') on the page to track whether the fetch is complete. Set it to 'yes' after the final page workflow finishes, then show the repeating group only when inventory_loaded = yes.
Expected result: After the backend workflow runs, your Bubble database contains flattened ShipBob_Inventory records with individual rows for each product-warehouse combination, ready to display in a repeating group.
Build the inventory repeating group with low-stock highlighting
On your Bubble page, add an Input element of type 'number' and label it 'Low stock threshold'. Default the value to 50. Add a Repeating Group element. Set its data source to 'Do a search for ShipBob_Inventory' and sort by fulfillable_quantity ascending (lowest first). Add a number input filter for a minimum threshold if you want to show only low-stock items by default. Inside the repeating group, add these elements in the cell: - Text showing 'Current cell's ShipBob_Inventory's product_name' - Text showing 'Current cell's ShipBob_Inventory's warehouse_name' - Text showing 'Current cell's ShipBob_Inventory's fulfillable_quantity' - A Group container behind all text elements Select the Group container and add a conditional: 'When Current cell's ShipBob_Inventory's fulfillable_quantity < Input Low stock threshold's value' → Background color: red (or a light red like #FEE2E2). This creates a visual low-stock alert without any custom code. Add a text element with '⚠ LOW STOCK' and apply the same conditional to show/hide it. This makes the dashboard scannable at a glance.
Pro tip: Add a GroupBy in your search to show only the lowest-quantity warehouse per SKU on the main view. Use a toggle to switch between 'Summary by SKU' and 'All warehouses' views using a Bubble custom state.
Expected result: A repeating group displays all ShipBob inventory items sorted by quantity, with rows turning red when stock falls below the threshold input value. The dashboard updates when the threshold input changes.
Add an order cancellation workflow with a confirmation popup and audit log
For teams that need to cancel ShipBob orders from the Bubble dashboard, you need to add a separate API call. In your ShipBob API Connector group, add another call. Name it 'Cancel Order'. Set method to POST and path to `/orders/{order_id}/cancel`. Add a path parameter: order_id (text, dynamic). This call does not require a request body — ShipBob processes the cancel based on the order ID in the URL. Initialize the call using a real order ID from your ShipBob account (use a test or already-cancelled order to avoid accidental cancellations during setup). On your orders page, add a 'Cancel Order' button to each repeating group row. Create a workflow triggered by button click. The first action is 'Show popup' — open a confirmation popup that shows the order ID and warns the action cannot be undone. The popup has two buttons: 'Confirm cancel' and 'Go back'. The 'Confirm cancel' button triggers a second workflow: (1) Call ShipBob - Cancel Order with order_id = current cell's order ID. (2) Create a new record in a Bubble 'AuditLog' data type with fields: action (text, 'cancel_order'), order_id (text), performed_by (User, Current User), timestamp (date, Current date/time). The audit log ensures you have a traceable record of every cancellation — critical for operations accountability.
1POST https://api.shipbob.com/1.0/orders/{order_id}/cancel2Authorization: Bearer <private>3Content-Type: application/jsonPro tip: Add a 'reason for cancellation' text input to the confirmation popup and save it to the AuditLog record. This context is invaluable when reviewing cancellations in the future and costs nothing to implement.
Expected result: Clicking 'Cancel Order' shows the confirmation popup. Clicking 'Confirm cancel' calls the ShipBob API, and on success, creates an AuditLog record. The order row in the repeating group refreshes to show 'Cancelled' status.
Common use cases
Real-time low-stock dashboard across all warehouses
Pull inventory data from all ShipBob fulfillment centers and display a single dashboard showing which SKUs are running low at each location. Founders can set a threshold input and the repeating group highlights rows in red when stock falls below it — no logging into ShipBob required.
Build a Bubble page with an API Connector call to GET https://api.shipbob.com/1.0/inventory with Private Bearer token. Create a repeating group that shows product name, total fulfillable quantity, and per-warehouse stock levels with red highlighting when quantity is below a user-defined threshold input.
Copy this prompt to try it in Bubble
Order status tracker for operations teams
Build an internal operations view that lists recent ShipBob orders with their shipment status, tracking numbers, and SLA timelines. Team members can search by order number or date range without needing ShipBob account access.
Create a Bubble page with a search input and date range pickers. Wire these to API Connector calls to GET https://api.shipbob.com/1.0/order with query parameters for filtering. Display results in a table repeating group with order number, status badge, carrier, and estimated delivery date.
Copy this prompt to try it in Bubble
Order cancellation workflow with audit trail
Give operations managers the ability to cancel a ShipBob order directly from the Bubble dashboard using a POST cancel endpoint. The workflow shows a confirmation popup, executes the cancel, and writes a log entry to a Bubble audit data type — preventing accidental cancellations.
Add a Cancel button to each row in the order repeating group. On click, show a popup asking for confirmation. On confirm, call POST https://api.shipbob.com/1.0/orders/{id}/cancel with Private Bearer token. On success, create a new record in a Bubble AuditLog data type with the order ID, action, and timestamp.
Copy this prompt to try it in Bubble
Troubleshooting
Initialize call returns 401 with an empty response body
Cause: The ShipBob Personal Access Token is invalid, expired, or the Authorization header is incorrectly formatted. ShipBob returns 401 with no error message body on auth failure.
Solution: Verify your token in the ShipBob portal under Settings → API Tokens. Confirm the header value in Bubble is exactly 'Bearer YOUR_TOKEN' with a single space between 'Bearer' and the token. Copy-paste the token fresh to avoid whitespace errors. Check that the 'Private' checkbox is ticked — without it, the header may be sent incorrectly.
The fulfillment_center_quantities field shows as a text string in the repeating group, not individual warehouse values
Cause: Bubble's API Connector automatically serializes nested arrays to a string when you try to bind them directly to a repeating group. The array is present in the API response but Bubble cannot natively bind it to a nested repeating group without data flattening.
Solution: Use the backend workflow approach described in Step 4: iterate over inventory items and their fulfillment_center_quantities array in a backend workflow, creating individual ShipBob_Inventory records per warehouse. Then bind your repeating group to the Bubble database, not directly to the API call result.
Backend workflow shows 'This workflow can't run' or the workflow option is greyed out
Cause: Bubble Backend Workflows (API Workflows) are only available on paid plans. The Free plan does not include this feature.
Solution: Upgrade to Bubble's Starter plan ($32/mo) or above to access Backend Workflows. As a workaround on the free plan, limit the inventory display to a single API page (250 items) by binding the repeating group directly to the API Connector call result rather than the Bubble database. You won't get warehouse-level breakdown, but you can show total_fulfillable_quantity per product.
Initialize call succeeds but the repeating group shows no data after the backend workflow runs
Cause: The backend workflow may have failed silently, the ShipBob_Inventory data type has no records, or the repeating group's search constraints are filtering out all records.
Solution: Check Bubble's Logs tab → Workflow logs to see if the backend workflow ran and completed. If it ran with errors, look for the specific failing step. Also verify your Bubble search: remove all constraints from the repeating group's data source temporarily and check if any records appear. If records exist but aren't showing, a search constraint is filtering them out.
Order cancellation returns a 422 or 400 error
Cause: ShipBob cannot cancel orders that have already been picked or shipped. Orders in 'Processing' or later stages are immutable.
Solution: Add an API call to GET /orders/{order_id} first and check the `status` field before showing the cancel button. Only show 'Cancel Order' for orders with status 'Processing' or earlier. Use a Bubble conditional to hide the button based on the order's current status.
Best practices
- Always mark the ShipBob Bearer token as Private in the API Connector header — this prevents it from appearing in browser network requests and developer tools.
- Use ShipBob's maximum page size of limit=250 to minimize the number of API requests your backend workflow makes, keeping Workload Unit consumption low.
- Add Privacy Rules to your ShipBob_Inventory data type in Bubble (Data tab → Privacy) restricting read access to authenticated users or specific roles — inventory data is sensitive business information.
- Implement the order cancellation workflow with a confirmation popup and an audit log data type. Accidental order cancellations cannot be undone via the API.
- Cache flattened inventory data in the Bubble database and refresh it on a schedule (every 30–60 minutes) rather than calling the ShipBob API on every page load. This reduces WU consumption and prevents rate limit issues.
- Use Bubble's Logs tab → Workflow logs to monitor backend workflow runs and API call success rates. ShipBob API errors appear here with status codes.
- When displaying ShipBob data to external users (such as a client portal), add Bubble privacy rules to ensure users can only see their own relevant data and cannot access other merchants' inventory.
Alternatives
ShipStation is shipping software for managing label generation and carrier rate comparison from your own warehouse; ShipBob is a full 3PL that physically stores and ships your inventory. If you need to print shipping labels or compare USPS/UPS/FedEx rates in Bubble, ShipStation is the right tool. If ShipBob is already your 3PL and you want to surface warehouse stock and order fulfillment data, use this guide.
Shippo focuses on multi-carrier label generation and rate shopping with a developer-friendly API. It does not store inventory or provide warehouse-level fulfillment data. Shippo suits Bubble apps that generate labels for self-fulfilled orders; ShipBob suits apps that need to query a 3PL warehouse's stock levels and order pipelines.
AfterShip specializes in shipment tracking and post-purchase notification — it aggregates tracking data from 900+ carriers. If your Bubble app needs to show order tracking pages to customers after ShipBob has shipped the order, combine both: ShipBob for fulfillment data, AfterShip for tracking updates.
Frequently asked questions
Does ShipBob have a free API tier or sandbox environment?
ShipBob does not offer a free API tier. API access requires an active ShipBob merchant account, which is only created when you sign a fulfillment agreement with ShipBob. There is no sandbox or developer-only account. You must use a real merchant account with real credentials to test the integration.
Why does the fulfillment_center_quantities field appear as text in Bubble instead of a list?
Bubble's API Connector serializes nested arrays into stringified text when you try to bind them directly to a repeating group. ShipBob's per-warehouse inventory is a nested array inside each product object. The solution is to use a Bubble backend workflow to iterate over the nested array and store each warehouse entry as a flat record in a custom Bubble data type — then bind your repeating group to that Bubble data type instead of directly to the API response.
Do I need a paid Bubble plan for this integration?
For basic read operations (showing a single page of 250 inventory items), the free Bubble plan works. However, paginating through multi-page inventory results and flattening the nested warehouse data both require Backend Workflows, which are only available on Bubble's Starter plan ($32/mo) and above. Most real-world ShipBob dashboards will need the paid plan.
Can I create or modify ShipBob orders from Bubble?
Yes. ShipBob's API supports order creation via POST /orders with the product details, shipping address, and shipping method. You can also cancel orders via POST /orders/{id}/cancel. Always use a Bubble confirmation popup before submitting cancellations, as the ShipBob API has no undo endpoint.
How do I handle ShipBob rate limits in Bubble?
ShipBob's rate limits are not publicly documented. Anecdotally, approximately 60 requests per minute is safe for most merchant accounts. To stay within limits, avoid triggering API calls on every keystroke or page element interaction. Instead, load inventory data once on page load into the Bubble database and refresh it on a schedule. Use Bubble's Logs tab to monitor for 429 errors.
What is the difference between ShipBob and ShipStation for a Bubble integration?
ShipBob is a 3PL: they physically hold your inventory in their warehouses and ship orders for you. The Bubble integration is about querying warehouse stock levels, receiving orders, and tracking SLA compliance. ShipStation is shipping software: you (or your warehouse) ship the orders, and ShipStation helps generate labels and compare carrier rates. The integrations serve different operational needs.
Talk to an Expert
Our team has built 600+ apps. Get personalized help with your project.
Book a free consultation