View as Markdown

Shopify & Odoo

Shops connect these from the dashboard (Integrations). No code needed; this page explains exactly what happens, so you can rely on it.

What syncs

Shopify Odoo (14 → 19+)
Products in Every variant of active products: name, price, stock (tracked variants), photo Sellable products: name, price, stock (storable products), description
How often On connect, every 30 minutes, and within a minute of a product change (Shopify webhooks) On connect and every 30 minutes
Orders out orderCreate: line items on the right variants, delivery fee as a shipping line, paid with the M-Pesa receipt or pending A sale.order with our order id as client_order_ref, confirmed (optional), customer matched or created by phone
Paid later (cash at the door) orderMarkAsPaid Noted on the sale order (payment stays in your accounting flow)
Cancelled orderCancel (restocks) action_cancel

When orders go: pay-now orders once paid; pay-on-delivery orders once placed (after the customer's one-minute undo window). Orders are sent in the order they happened, each exactly once — a retry finds the existing Shopify order (by its kb-<order id> tag) or Odoo sale order (by client_order_ref) instead of creating another.

Stock never double-counts. Shopify (and Odoo, when orders are confirmed) deduct stock as soon as we send an order. Kibanda reserves stock at checkout and deducts it on delivery. When we pull stock, we add back units of sent-but-undelivered orders, so both sides agree.

Products that disappear from Shopify or Odoo are hidden on WhatsApp, not deleted (order history keeps them). Products you add only in Kibanda stay; their order lines go to Odoo as notes and to Shopify as custom line items.

Each synced product's external_id is shopify:<variant gid> or odoo:<product id>, and each sent order's external_id is shopify:#1042 or odoo:S00042 — visible in the API and webhooks.

Connecting Shopify

Since January 2026, apps are created in Shopify's Dev Dashboard:

  1. Create an app in the same Shopify organization as the store.
  2. Scopes: read_products, read_inventory, write_orders.
  3. Install it on the store, then paste the store address, Client ID and Client secret into Kibanda.

Kibanda gets short-lived tokens with the client credentials grant and subscribes to product and inventory webhooks itself. The store's currency must be KES.

Connecting Odoo

  1. Create a dedicated user (e.g. "Kibanda") with Sales and Inventory rights.
  2. As that user: Preferences → Account Security → New API Key. In Odoo 19, ask your admin for a group with a long key lifetime (the default can be 1 day).
  3. Paste the Odoo address, database name, the user's login and the API key into Kibanda.

Odoo 19+ is called through the JSON-2 API; older versions through JSON-RPC (execute_kw).

Other systems (Zoho, a POS, an ERP)

Use the API directly: push your catalog with POST /v1/products/batch (upsert by your external_id), listen for order.paid / order.created webhooks, and write your ids back with external_id. That's the same contract the native integrations use.