Hi,
I’m running a self-hosted inventory system (FastAPI + SQLite) that syncs products to Square via the Catalog API. I’m seeing two issues I can’t explain, and I’d appreciate any insight.
Environment
- Square API version:
2025-01-23 - Production environment
- Items created via
POST /v2/catalog/object(upsert) - Single location,
present_at_all_locations: true
Issue 1 — Items never appear in the Dashboard item library list
After creating an item via the API, it does not appear in the Dashboard item library list. The exact behavior:
- Create item A via the API
- The Dashboard item library list shows it immediately after the create action
- Reload the browser → the item disappears from the list
- The item is still findable via the Dashboard search box
- The item is visible in the POS app (iPhone)
ListCatalogandSearchCatalogObjectsreturn it correctly
This is not eventual consistency. I have waited hours and the items never appear in the list view.
| How I check | Result |
|---|---|
| POS app (iPhone) | Visible |
| Dashboard search box | Visible |
| Dashboard item library list (after reload) | Not visible |
ListCatalog / SearchCatalogObjects |
Returned correctly |
Item and variation both have present_at_all_locations: true. present_at_location_ids and absent_at_location_ids are both null.
I’ve tried a different browser, an incognito window, logging out and back in, and a hard reload. No change.
It looks like the list view is built from an index these items never enter, while the post-create render and the search box use a different path. Has anyone run into this? Is there something in the item payload that determines whether an item is included in the list view?
Issue 2 — Duplicate items accumulate, and deletions leave orphans
When I query with include_deleted_objects: true, I find 13+ soft-deleted items sharing the same name, each with a different catalog object ID. Something is repeatedly deleting and recreating the same item.
I also saw the catalog object ID change for what should be the same item:
Earlier: 4OPIUGK724FMOOG344G3ZKHB
Later: QL6ACNIWQY7PUMJGIHIWLOVW
Because of this, when my system deletes a product it sends a delete for the ID it has on record, but Square holds a different ID — so the item is left behind. My system currently has 0 products, yet Square still has 2 live items.
I previously found and fixed a race on my side (an inventory.count.updated webhook echo triggered a second catalog create while the first was still in flight). I verified the fix with 29 consecutive create/delete cycles and zero duplicates. So either that regressed or there’s another path I haven’t found. I’m investigating locally, but I’d like to ask:
- Can an upsert result in a new object ID rather than updating the existing object? I send an
idempotency_keyon create. - Does a large number of soft-deleted objects (search returns 1000+) affect anything? Can they be purged, or do they age out on their own?
I’m happy to provide catalog object IDs, the exact request payloads, and a full reproduction sequence.
Thanks.