Placements
Which product shows on which content UUID, in what order. The same product can be attached to several pages.
Products
The catalog. A product isn't shown anywhere until it's attached via a Placement.
Vendors
Contracts
Monetisation conditions per product — CPM, CPC, CPA and Revenue Share, combinable on one contract. Financial terms are never edited in place once created: to change a rate, add a new contract with an adjacent validity period instead.
⏳ Expiring soon
Conversions
Audit tool for individual conversions — search, filter, and inspect vendor-reported sales/actions. Normally recorded via the vendor postback; "Add conversion manually" runs the exact same attribution/reconciliation logic for a vendor who calls or emails instead of integrating the API. For period-over-period revenue trends, see the Monetisation dashboard in analytics.html. Sparklines show the last 30 days for whatever's currently filtered.
Needs follow-up
Always reflects every conversion, regardless of the filters below — this is what to check before anything else.
Users
Each person gets their own Access Token — not a password, just a random string you copy and send them (Slack/email). Admin Access and Analytics Access are independent: grant either, both, or deactivate someone without deleting their record. Your own master key keeps working regardless of what happens here.
MCP Server
Multi-user agent access to the shoppable engine through authenticated MCP tools. Manages the same Access Users as the Users tab — MCP access is one more independent grant on the same record, alongside Admin/Analytics Access.
MCP access is granted per person in the Users tab — look for the "MCP access" section on each user's panel. Nothing MCP-specific is managed here.
Endpoint ONLINE
Streamable HTTP · stateless requests · Bearer authentication — ADMIN_KEY/MCP_KEY (shared secrets), a per-user MCP Token, or an OAuth-issued token from es-shoppable-oauth (Claude/ChatGPT connectors go through this path).
Internal scope — 33 tools
| Category | Tools |
|---|---|
| Catalog (read) | list_products, list_vendors, list_content, list_smartlists, list_placements |
| Analytics (read) | get_analytics_summary, get_product_stats, get_content_stats, get_placement_analytics, list_events |
| Placement decisions (read) | list_placement_decisions, get_placement_decision |
| Catalog (write) | create_vendor, create_product, create_placement, write_placement_decision, review_placement, update_placement, delete_placement |
| Affiliate contracts | list_affiliate_contracts, get_affiliate_contract, create_affiliate_contract, update_affiliate_contract, resolve_affiliate_contract |
| Conversions | list_conversions, get_conversion, search_affiliate_clicks, record_conversion, update_conversion_status |
| Monetisation | get_monetisation_analytics, get_monetisation_timeseries |
Vendor scope — 6 tools
| Tool | Purpose |
|---|---|
| get_my_analytics | Own Monetisation numbers for a period — KPIs, funnel, revenue by model, own contracts, reconciliation. |
| get_my_analytics_timeseries | Own period-over-period comparison series. |
| list_my_conversions / get_my_conversion | Own recorded conversions. |
| search_my_clicks | Find a clickId on one's own products, for record_my_conversion. |
| record_my_conversion | Report a conversion — rejected if the click isn't on one's own product. |
Every tools/call is attributed to the MCP identity that made it, logged after the call resolves.
Content
Give each OKAST content UUID a human-readable title, shown here and in Analytics instead of the raw UUID. Not automatically linked to Placements — UUIDs there and here are just matched by text, so use "Sync" to pull in any UUID that's in use but doesn't have a title yet.
Smartlists
Same role as Content, for OKAST Smartlist pages instead — a Placement's Content UUID works identically whether it points at a Content page or a Smartlist page. Not automatically linked to Placements — matched by text, so use "Sync" to pull in any UUID that's in use but doesn't have a title yet.
Widgets
Give each OKAST "embed widget" uuid a human-readable title — an embed widget is its own kind of page, with no Content or Smartlist record behind it, so unlike those two there's no OKAST API to sync this list from. Register one here as soon as you get its uuid, so it shows up in the picker when attaching a product under Placements — or use "Sync" afterward to pull in any widget uuid already used in a Placement (Source type: widget) that doesn't have a title yet.
Performance
How fast /shoppable is actually responding, and tools to clear its caches for debugging. See ARCHITECTURE.md's "Stale-while-revalidate" section for what hit/stale/miss mean. This tracks page loads only — not clicks or impressions. For individual click/impression events, see analytics.html's Log tab; for aggregated click/impression counts, see its Performances tab.
Clear cache
Request log — page loads only
Read-only — individual /shoppable requests for the period selected above (capped at the most recent 2000). Not clicks — a click won't appear here even though it's correctly tracked (see analytics.html's Log tab).
Recent clicks
Actual product clicks (not page loads) for the period selected above — full click/impression log with search and filters →