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.

Conversions
iCount of vendor-reported conversions matching the current filters. Each one comes from a postback to /postback/vendor-conversion — nothing here is estimated. Sparkline: daily count, last 30 days.
GMV
iGross Merchandise Value — sum of Transaction Amount across the conversions above, as reported by the vendor. Includes all vendor statuses (pending, approved, rejected, reversed), not just approved ones.
Expected revenue
iSum of Expected CPA Amount + Expected Revenue Share Amount — computed from each conversion's contract at click time. This is our own calculation, independent of what the vendor reports (see Confirmed revenue).
Confirmed revenue
iSum of Reported Commission, but only for conversions with Vendor Status = Approved. This is money the vendor has actually confirmed owing — not an estimate.
Needs attention
iCount of conversions flagged as: amount mismatch, unknown click, duplicate transaction, missing calculation basis, or an unverified CPA trigger. Worth reviewing individually — filter by Reconciliation status below to find them.

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.

Active MCP users
Internal scope
Vendor scope
Calls (24h)

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).

https://es-shoppable-widget.cedric-monnier.workers.dev/mcp
Two independent tool sets, chosen automatically by the caller's MCP Token scope — a vendor-scoped connection never sees the internal tools even exist.

Internal scope — 33 tools

CategoryTools
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 contractslist_affiliate_contracts, get_affiliate_contract, create_affiliate_contract, update_affiliate_contract, resolve_affiliate_contract
Conversionslist_conversions, get_conversion, search_affiliate_clicks, record_conversion, update_conversion_status
Monetisationget_monetisation_analytics, get_monetisation_timeseries

Vendor scope — 6 tools

ToolPurpose
get_my_analyticsOwn Monetisation numbers for a period — KPIs, funnel, revenue by model, own contracts, reconciliation.
get_my_analytics_timeseriesOwn period-over-period comparison series.
list_my_conversions / get_my_conversionOwn recorded conversions.
search_my_clicksFind a clickId on one's own products, for record_my_conversion.
record_my_conversionReport a conversion — rejected if the click isn't on one's own product.
vendorId is never a parameter on any vendor-scope tool — every call is hard-locked server-side to the token's own vendor.

Every tools/call is attributed to the MCP identity that made it, logged after the call resolves.

Page 1 of 1

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 →