BigCommerce field notes

Fix BigCommerce orders, payments, inventory, and webhooks with a script

A working library of the problems that hit real BigCommerce stores, across orders and payments, webhooks, inventory and catalog, customers, fulfillment, promotions, and reporting, and how to detect or repair each one with a small Python or Node.js script on the BigCommerce API. Every guide has a diagram of the problem, a diagram of the fix, full code in both languages, tests, and links to the source reports.

Python and Node.js BigCommerce REST API Diagrams and full code All code on GitHub

Orders and payments

8 guides

Webhooks

10 guides

Webhook deactivated after failures

BigCommerce disabled your webhook after repeated failures. Detect the gap and recreate it.

Reconciler

Duplicate webhook deliveries run twice

The same event arrives more than once and doubles your work. Dedupe on the delivery id.

Reconciler

Missed webhooks with no backfill

Your app was down past the retry window. Poll updated orders and apply what you missed.

Reconciler

Webhook payload not verified

The webhook body was trusted without verification. Check the signature before acting.

Diagnostic

Webhook domain blocklisted after low delivery success ratio

Endpoint success rate under 90 percent over 2 minutes gets the domain blocklisted. Script detects delivery gaps and alerts.

Diagnostic

Webhook fires duplicate events within the same second

Same order status change delivers multiple near identical payloads. Script dedupes by resource id, status, and timestamp window.

Diagnostic

Webhook keeps firing after its owning app or token is removed

Deleting the API account or uninstalling the app does not stop its hooks. Script lists hooks and deletes orphans explicitly.

Reconciler

Uninstall webhook registration silently rejected

Registering the store or app uninstall scope gets refused with a 400, so the app never learns of removal. Script verifies registration and alerts on gaps.

Diagnostic

Order webhooks stop firing entirely with no surfaced error

All customer or order events silently stop delivering for a store. Script compares recent order timestamps against received webhook logs to detect the gap.

Diagnostic

Status webhook payload carries only an id, hiding dropped updates

store/order/statusUpdated omits the new status, so a failed follow up GET silently loses the change. Script cross checks recent order status against last known state.

Reconciler

Inventory and catalog

8 guides

Customers

9 guides

Duplicate customers for one email

The same shopper has several customer records. Merge them so history stays together.

Reconciler

Guest orders not linked to accounts

Guest orders never linked to the customer account. Link them by email.

Repair

Customer group mis-assigned

Customers landed in the wrong group so pricing is wrong. Reassign from the rule.

Reconciler

Customers filter by id is rejected as unsupported

Filtering the v2 customers list by id via query param throws a field not supported error. Script falls back to fetching the direct resource path to reconcile lookups.

Reconciler

Customer password update intermittently returns random 400 errors

Password change calls fail nondeterministically even when the request is valid. Script verifies success via date_modified or a login test rather than trusting the response code.

Diagnostic

Create customer for an existing email errors without returning the existing id

The already exists response omits the matching customer_id, forcing a second lookup. Script catches the error and resolves the id via an email filter query.

Diagnostic

Customer address create no-ops on an exact duplicate with a 200 response

Posting an address identical to an existing one returns success but omits the address from the response body. Script GETs addresses afterward to confirm the real state.

Diagnostic

No API endpoint to merge two customer records

There is no native merge operation, so duplicate profiles leave fragmented order and address history. Script reassigns orders to one customer_id and consolidates addresses manually.

Repair

Customer group change does not immediately refresh cached pricing

Customers moved between groups keep seeing the old group's prices until a manual re-sync. Script re-fetches the customer after group changes and validates pricing matches the new group.

Reconciler

Fulfillment and shipping

3 guides

Promotions and coupons

2 guides

Tax, currency, and reporting

3 guides

Migration and housekeeping

3 guides

Orders

12 guides

Order update call recalculates and overwrites a coupon adjusted total

PUTing unrelated order fields triggers a total recalculation that erases coupon discounts. Script diffs stored versus current totals to catch corruption.

Diagnostic

Order shipments response drops the items array

Client libraries parse out the items field present in the raw v2 shipment response, under reporting shipped lines. Script reconciles against raw JSON.

Reconciler

Writing order status text instead of status_id fails or no-ops

PUT requests with a status string instead of the integer status_id error or silently do nothing. Script always resolves and writes status_id.

Repair

Order shipping address update does not recompute tax or shipping cost

Changing an order's shipping address leaves stale total_tax and shipping_cost fields. Script detects address changes and recomputes totals via quote endpoints.

Repair

Order total wrong when only one of price_ex_tax or price_inc_tax is set

Partial tax field overrides on order creation leave totals inconsistent. Script validates both fields are set together and diffs totals against line sums.

Diagnostic

Order missing shipping address when no line item is flagged physical

Orders with only non-physical products get no shipping_addresses record even when one is expected. Script flags orders where a physical flag or address is inconsistent.

Diagnostic

422 fulfillment address incomplete despite address looking complete

POST to orders or consignments rejects with 422 due to a missing required subfield not obvious from the payload. Script validates required address keys before posting and logs the failing field.

Diagnostic

Order count endpoint disagrees with actual paginated order list

The dedicated order count endpoint returns a total that does not match the number of orders retrievable by paging. Script paginates fully and diffs against the count endpoint.

Reconciler

Order-level refund does not recalculate total_tax

Applying a refund at the order level leaves total_tax inconsistent with the refunded amount. Script recomputes expected tax and reconciles against the stored record.

Reconciler

Manual status change to Refunded does not move any money

Setting status_id to Refunded via API or admin creates no refund transaction. Script reconciles order status against the transactions endpoint to catch orders marked refunded with no matching transaction.

Reconciler

Status change skips side effect actions like capture or void

Writing status_id directly bypasses the admin Action menu logic, so expected payment actions never fire. Script flags orders whose status implies a payment action that never appears in transactions.

Diagnostic

Refunded line items are not returned to inventory automatically

API refunds never adjust stock levels for the refunded quantity. Script diffs refunded line quantities against inventory_level and issues compensating adjustments.

Reconciler

Payments / Refunds

2 guides

Catalog / Products

8 guides

SKUs endpoint truncates at 50 records without paginating

The product SKUs call returns only the first 50 by default with no pagination applied automatically. Script pages with limit and page and compares counts to detect truncation.

Reconciler

Brand update immediately before product create returns empty reply

Back to back brand update and product create calls intermittently fail with an empty server response. Script retries with backoff and verifies the product actually exists afterward.

Diagnostic

Category image_file field rejected as invalid on update

PUT to a category with image_file throws a 400 even though it is a documented field. Script detects categories with stale or missing images that silently fail bulk sync.

Diagnostic

Variant price override stops following base product price changes

Once a variant has an explicit price, later edits to the base product price are silently ignored for that variant. Script finds variants with a set price diverging from the current product default.

Diagnostic

Duplicating a product creates variants with colliding SKUs

Bulk product duplication can leave multiple variants sharing one SKU, breaking downstream matching. Script scans variants per product for duplicate SKUs and renames or reports them.

Reconciler

V3 pagination breaks when options or modifiers are included

Requesting include=options,modifiers on the products list corrupts meta.pagination.total_pages, causing early stop and missed products. Script validates total item count against a plain unfiltered pull.

Diagnostic

Product image upload rejects non fully qualified URLs

image_url values that are relative or not http(s) fail validation and leave the product with no image. Script scans for zero image products tied to failed import rows.

Diagnostic

Bulk image API only persists the first image per request

Batch image import calls that assume multiple images per request silently keep only the first. Script counts persisted images against source data and requeues the missing ones.

Reconciler

Inventory

5 guides

Pricing / Price Lists

5 guides

Coupons / Promotions

5 guides

Checkout / Carts

5 guides

Multi-Storefront / Channels

2 guides

API Fundamentals

3 guides

SEO

1 guides

Fighting a BigCommerce bug right now?

If you have a problem in BigCommerce orders, payments, inventory, webhooks, or fulfillment that you would rather hand off, this is the kind of work I do. Message me and we can work through it together.

Contact me on LinkedIn

Found this useful?

These guides are free and always will be. If one saved you a support ticket or a refund, you can throw a coffee my way. It keeps the notes coming.

Buy me a coffee on Ko-fi