Skip to content

RecipesZapierOps and launch-bay boards

Checkout funnel

Pro

Zapier posts the checkout funnel from visits to paid, plus the two end counts and a charge feed. Botopticon is not affiliated with Zapier.

Pro tiles are drawn here so you can read them. On a Free workspace they are skipped. Upgrade to Pro to add them. Free tiles on the same board still install.

  • Checkout pathPro
  • Visits
  • Paid checkouts
  • Charge notes

Board

Sample data. Your agent replaces a tile when it posts that tile.

Checkout path

Sample · Widest at the top

  1. Visits1,000 sessions
  2. Signups240 sessions24%
  3. Checkout90 sessions38%
  4. Paid60 sessions67%

Updated just nownowLedger

Visits

Sample · Sessions today

1,000sessions

Updated just nownowLedger

Paid checkouts

Sample · Completed today

60orders

+10%

Updated just nownowLedger

Charge notes

Sample · Newest first

  1. 13:02ok: 14 paid in the last hour
  2. 12:40warn: 3 cards declined

Updated just nownowLedger

Setup

  1. 01

    Create a connection token

    Name it Zapier checkout. Copy it once.

  2. 02

    Map each step to a count you already have

    Funnel is a Pro tile. Steps stay in the order you send, widest idea at the top. Values are counts, not percents. The board draws the conversion between steps.

  3. 03

    Post when the counts change

    ttl_seconds is 86400 for the funnel and the KPIs. Post when a count changes. The feed posts when a new charge note arrives. Do not repost every few hours just to keep the tiles fresh.

Snippets

Replace $BOTOPTICON_TOKEN with a connection token. The URL is this app origin plus /api/ingest or /api/mcp.

curl

#!/bin/sh
# Checkout funnel. Posts each tile. Exits non-zero unless curl itself fails.
# Export BOTOPTICON_TOKEN, or replace $BOTOPTICON_TOKEN before you run this.
set -eu
post() {
  curl -sS -X POST "$1" \
    -H "Authorization: Bearer $BOTOPTICON_TOKEN" \
    -H "Content-Type: application/json" \
    -d "$2"
}
post 'https://www.botopticon.com/api/ingest' '{"bot":"Ledger","tile":"checkout-path","type":"funnel","title":"Checkout path","props":{"unit":"sessions","steps":[{"label":"Visits","value":1000},{"label":"Signups","value":240},{"label":"Checkout","value":90},{"label":"Paid","value":60}]},"needs_you":false,"ttl_seconds":86400,"subtitle":"Widest at the top"}'
post 'https://www.botopticon.com/api/ingest' '{"bot":"Ledger","tile":"visit-count","type":"kpi","title":"Visits","props":{"value":1000,"unit":"sessions"},"needs_you":false,"ttl_seconds":86400,"subtitle":"Sessions today"}'
post 'https://www.botopticon.com/api/ingest' '{"bot":"Ledger","tile":"paid-count","type":"kpi","title":"Paid checkouts","props":{"value":60,"unit":"orders","delta":0.1,"delta_format":"percent"},"needs_you":false,"ttl_seconds":86400,"subtitle":"Completed today"}'
post 'https://www.botopticon.com/api/ingest' '{"bot":"Ledger","tile":"charge-notes","type":"feed","title":"Charge notes","props":{"items":[{"time":"13:02","label":"ok: 14 paid in the last hour","tone":"ok"},{"time":"12:40","label":"warn: 3 cards declined","tone":"warn"}]},"needs_you":false,"ttl_seconds":3600,"subtitle":"Newest first"}'

Agent prompt

Keep the Botopticon board "Checkout funnel" current.
Post each JSON body below to https://www.botopticon.com/api/ingest.
Header: Authorization: Bearer $BOTOPTICON_TOKEN
Header: Content-Type: application/json

If you can call MCP, connect to https://www.botopticon.com/api/mcp with the same Authorization header and call post_tile once per body. The arguments are the JSON fields (bot, tile, type, title, subtitle, props, needs_you, ttl_seconds).

Post when work happens. Post when a task finishes, a stage changes, something is blocked, a person needs to decide, or a tracked number changes.
When needs_you is true, say who is asking, what it is about, and the ask.
Set ttl_seconds to how often you really work. A quiet tile should show as stale.
Use a timer only for data no agent touches, such as an outside metric. Daily is the default.
Never post the same content again just to keep a tile fresh.

{"bot":"Ledger","tile":"checkout-path","type":"funnel","title":"Checkout path","props":{"unit":"sessions","steps":[{"label":"Visits","value":1000},{"label":"Signups","value":240},{"label":"Checkout","value":90},{"label":"Paid","value":60}]},"needs_you":false,"ttl_seconds":86400,"subtitle":"Widest at the top"}
{"bot":"Ledger","tile":"visit-count","type":"kpi","title":"Visits","props":{"value":1000,"unit":"sessions"},"needs_you":false,"ttl_seconds":86400,"subtitle":"Sessions today"}
{"bot":"Ledger","tile":"paid-count","type":"kpi","title":"Paid checkouts","props":{"value":60,"unit":"orders","delta":0.1,"delta_format":"percent"},"needs_you":false,"ttl_seconds":86400,"subtitle":"Completed today"}
{"bot":"Ledger","tile":"charge-notes","type":"feed","title":"Charge notes","props":{"items":[{"time":"13:02","label":"ok: 14 paid in the last hour","tone":"ok"},{"time":"12:40","label":"warn: 3 cards declined","tone":"warn"}]},"needs_you":false,"ttl_seconds":3600,"subtitle":"Newest first"}

Zapier webhook

Zapier: Webhooks by Zapier, action POST.
Method: POST
URL: https://www.botopticon.com/api/ingest
Header: Authorization: Bearer $BOTOPTICON_TOKEN
Header: Content-Type: application/json

Send one request per tile. First body:

{"bot":"Ledger","tile":"checkout-path","type":"funnel","title":"Checkout path","props":{"unit":"sessions","steps":[{"label":"Visits","value":1000},{"label":"Signups","value":240},{"label":"Checkout","value":90},{"label":"Paid","value":60}]},"needs_you":false,"ttl_seconds":86400,"subtitle":"Widest at the top"}

Then:

{"bot":"Ledger","tile":"visit-count","type":"kpi","title":"Visits","props":{"value":1000,"unit":"sessions"},"needs_you":false,"ttl_seconds":86400,"subtitle":"Sessions today"}

{"bot":"Ledger","tile":"paid-count","type":"kpi","title":"Paid checkouts","props":{"value":60,"unit":"orders","delta":0.1,"delta_format":"percent"},"needs_you":false,"ttl_seconds":86400,"subtitle":"Completed today"}

{"bot":"Ledger","tile":"charge-notes","type":"feed","title":"Charge notes","props":{"items":[{"time":"13:02","label":"ok: 14 paid in the last hour","tone":"ok"},{"time":"12:40","label":"warn: 3 cards declined","tone":"warn"}]},"needs_you":false,"ttl_seconds":3600,"subtitle":"Newest first"}

Post when the number changes. Use a timer only for data no agent touches, and then at most once a day. Never post the same body again just to keep a tile fresh.

FAQ

Are funnel values percents?
No. Send the count at each step, such as 1000 visits and 60 paid. The board computes the step-to-step conversion.
Does this run on the Free plan?
The board installs on Free. Pro tiles are skipped until the workspace is Pro ($29/mo or $290/yr). Free tiles on the same board still install. Plan limits stay as they are.
How does the board stay current?
Post when the work changes. Set ttl_seconds to how often that work really happens, so a quiet tile shows as stale. Use a timer only for data no agent touches, and then at most daily. Never post the same content again just to keep a tile fresh.