eSentriX puts one selling agent on every channel your shoppers use. Each channel is a snippet you paste; the agent never touches your checkout — it tells your site or app what the shopper wants, and your own cart code does it.
Everything below ends the same way: a normalized, multilingual, LLM-ready catalog that the agent sells from — live prices, live stock, your product ids.
Shopify and WooCommerce are read through their own APIs. Any other site is crawled — sitemap, structured data, then a headless render — and the agent is live on a mirror of your homepage in minutes.
Point us at a product endpoint or a feed URL (JSON, XML, CSV, Google Shopping). We poll it on your cadence; price and stock changes land on the next pull.
A one-off or scheduled export dropped to a bucket or sent to us. Good for ERPs that can export but can't serve an API.
A read-only database user on your product and inventory tables. We read, never write; the schema is mapped once.
Multi-branch platforms get one store per branch (yourname_<branch>) and area-wide search across them. Restaurants bring option groups and add-ons along.
The exact snippets with your store id are on the Channels page of your commerceOS console. These are the same ones, so you can plan the work before you have an account.
The assistant floats over your pages and sells from your live catalog — in Arabic, Hebrew or English, by text or voice. Cart and checkout stay yours.
</body> on every page — or use the console's Install page, which does it for Shopify, WooCommerce and WordPress.data-lang, data-color, data-greeting, data-suggestions, data-mode="bar|chat", data-position.<script src="https://onboarding-service-230492521256.me-west1.run.app/sdk/embed.js"
data-store="your-store-id"
data-store-name="Your Store"
data-lang="AR" data-color="#E8B800"
defer></script>
// self-contained, shadow-DOM isolated — your CSS can't reach it and it can't reach yours
A page of its own, in your colors, that sells from your live catalog — no site needed. Share the link in a bio, a message or an ad.
_esentrix TXT record it shows you and the page answers on agent.yourbrand.com.# on your own domain — add one TXT record, the console verifies it https://agent.yourbrand.com # until then, the console's Agent page shows the link it is already live on
The assistant screen ships from our servers and updates without an app release. It never touches your cart: it tells your app what the shopper asked for, and your app does it.
// Xcode → Add Package → github.com/esentrix/mobile-sdk (mobile-sdk/ios) import Esentrix Esentrix.configure(.init(storeId: "your-store-id", language: "AR")) Esentrix.delegate = self Esentrix.present(from: self, query: searchBar.text) func esentrix(didReceive event: EsentrixEvent) { switch event { case .addToCart(let id, _, let qty, _): cart.add(id, quantity: qty) case .removeFromCart(let id, _): cart.remove(id) case .checkout: router.push(.checkout) default: break } }
// settings.gradle: include(":esentrix") (mobile-sdk/android/esentrix) import ai.esentrix.sdk.Esentrix Esentrix.configure(Esentrix.Configuration(storeId = "your-store-id", language = "AR")) Esentrix.listener = EsentrixListener { event -> when (event) { is EsentrixEvent.AddToCart -> cart.add(event.id, event.quantity) is EsentrixEvent.RemoveFromCart -> cart.remove(event.id) is EsentrixEvent.Checkout -> router.push(Checkout) else -> Unit } } Esentrix.open(context, query = searchView.query.toString())
// npm i @esentrix/react-native react-native-webview import { EsentrixAssistant } from '@esentrix/react-native'; <EsentrixAssistant storeId="your-store-id" language="AR" query={query} onAddToCart={(id, qty) => cart.add(id, qty)} onRemoveFromCart={(id) => cart.remove(id)} onCheckout={() => navigation.navigate('Checkout')} onClose={() => setOpen(false)} />
// pubspec: esentrix_assistant: ^1.0.0 (mobile-sdk/flutter) import 'package:esentrix_assistant/esentrix_assistant.dart'; EsentrixAssistant( storeId: 'your-store-id', language: 'AR', query: query, onAddToCart: (id, qty) => cart.add(id, qty), onRemoveFromCart: (id) => cart.remove(id), onCheckout: (_) => Navigator.pushNamed(context, '/checkout'), )
Your search bar, your product cells, your cart — the query goes to us and comes back as ranked product ids from your own catalog, in Arabic, Hebrew or English. Nothing of ours is shown.
X-API-Key on every call.explain: true — the cards come back in sections with a one-line reason each (answer + groups).curl -s https://core-backend-230492521256.me-west1.run.app/api/ucp/search \ -H 'Content-Type: application/json' \ -H 'X-API-Key: <your key>' \ -d '{"store_id": "your-store-id", "query": "milk 3%", "scope": "store", "limit": 20}' # → { request_id, store_ids, items: [{ choice_id, name, price, image, … }], took_ms } # choice_id is YOUR product id · scope "area" + area_id fans out across branches
const response = await fetch("https://core-backend-230492521256.me-west1.run.app/api/ucp/search", { method: "POST", headers: { "Content-Type": "application/json", "X-API-Key": "<your key>" }, body: JSON.stringify({ store_id: "your-store-id", query, scope: "store", limit: 20, explain: true }), }); const { request_id, items, answer, groups } = await response.json(); // items[i].choice_id is your product id; echo request_id in events // with explain: true — answer is one line, groups[] = { title, reason, item_ids } sections
curl -s https://core-backend-230492521256.me-west1.run.app/api/ucp/search/events \ -H 'Content-Type: application/json' -H 'X-API-Key: <your key>' \ -d '{"request_id": "<from the search>", "store_id": "your-store-id", "event": "add_to_cart", "item_id": "501"}' # event ∈ impression | tap | add_to_cart | purchase # errors: 401 unknown key · 403 key on another platform's store · 429 over 20 rps
Your WhatsApp Business number answers with the agent: search, cart, and a checkout link, in the shopper's language.
// Nothing to paste. The console runs Meta's Embedded Signup for you: // 1. choose or create the WhatsApp Business account // 2. pick the number · 3. the agent answers from that moment // Already on the Cloud API with another vendor? We attach as an // additional webhook on the same number — no migration.
Instead of a landing page, the ad opens a conversation. The agent starts on the product the ad showed, sells from your live catalog, and the order is attributed to the campaign.
ask= the product the ad shows — the agent opens on it; the campaign and ad ids fill in from the platform's macros.# click-to-WhatsApp / Instagram ads — nothing to paste. # The ad's button opens WhatsApp on your connected number; Meta sends the ad along # with the first message, so the agent opens selling that product, in the chat, # and the order is attributed to the campaign. # link ads (Google, TikTok, bio links) — the destination is your agent page https://agent.yourbrand.com/?ask=<the product the ad shows>&campaign={{campaign.id}}&ad={{ad.id}}
A number shoppers call; the agent talks, builds the basket and confirms the order — no app needed. Sign-in is by caller id, so a shopper who ordered in the app is recognized on the phone.
https://esentrix-gateway-230492521256.me-west1.run.app/twilio/voice
A code on the shelf or a tablet at the counter opens the agent for this branch. The kiosk mode resets itself between shoppers.
# shelf QR https://shop.esentrix.ai/?store=your-store-id&surface=in_store # kiosk tablet <script src="https://onboarding-service-230492521256.me-west1.run.app/sdk/embed.js" data-store="your-store-id" data-mode="kiosk" data-idle-reset="90" defer></script>
{ ok, error? } within 5 seconds; on an error the agent tells the shopper and offers an alternative.Esentrix.track('purchase', { order_id, total }). That closes the loop from ad click to in-chat order.A script tag, catalog access, and your approval. Nothing in your checkout changes.
window.Esentrix = window.Esentrix || {};
window.Esentrix.hooks = {
// the agent resolved a product and the shopper said yes
async add_to_cart({ id, quantity }) {
await myCart.add(id, quantity); // your cart code
return { ok: true };
},
async remove_from_cart({ id }) {
await myCart.remove(id);
return { ok: true };
},
async checkout() {
location.assign('/checkout'); // your checkout
return { ok: true };
},
};
// on the confirmation page
Esentrix.track('purchase', { order_id, total, currency: 'ILS' });
Every channel's kit ends with the same check: open it, ask for a product, see your own cart change. Then the console takes over.
Set the agent's tone, instructions and what it may never promise on the console's Agent page. Changes are staged and approved before they reach shoppers.
Give each store an objective and a push list — the agent ranks toward it without hiding what the shopper asked for.
Revenue split per channel, conversations, customers and attach rate — plus a daily digest email with what the agent learned.
Intent from conversations becomes audiences and campaigns, with closed-loop attribution back to the in-chat order.
Only the search door (/api/ucp/search and its events). The website embed, the agent page, the mobile SDK, WhatsApp, phone and in-store need no key — the store id is enough. Keys are minted, rotated and revoked on the Developers page; each key is scoped to its own platform's stores.
Arabic (including Gulf and Levantine dialects), Hebrew and English — it answers in the language the shopper writes or speaks, and catalogs in one language are searchable from another.
No. The embed renders inside a shadow root with no dependencies, and the APIs it calls allow cross-origin requests from any site. It exposes window.__esentrixWidget.destroy() if you ever need to take it down.
As fresh as your source: platform APIs and feeds are polled on your cadence (every 15 minutes for live-stock partners), and unavailable items are filtered out of results before the agent sees them.
Conversations and the intent signals inside them, tied to your tenant. Audiences are phone-matched only where the shopper consented; frequency and consent gates apply to every outbound message. See the privacy policy.
Yes — most partners start with the search bar (AI Mode) or the standalone agent page, and add the app SDK and WhatsApp once they see the numbers.
Send us your store link and we'll have the agent selling on a mirror of your site before the call.