{
  "sample": true,
  "notice": "SAMPLE DATA. Relaykit is a fictional company; these numbers are illustrative, not measurements.",
  "workspace": {
    "name": "Relaykit",
    "slug": "demo",
    "product": "Relaykit"
  },
  "period": {
    "start": "2026-10-12",
    "end": "2026-10-18",
    "label": "Oct 12 – Oct 18, 2026"
  },
  "generated_at": "2026-10-19T07:00:00.000Z",
  "method_version": "found-v2 · used-v4 · fix-v1",
  "notes": [
    "Rates are fractions from 0 to 1. ci_lo/ci_hi are the Wilson 95% range.",
    "null means unknown, never zero; null_reason says why. too_few_n means the sample is below our minimum, so the value is withheld.",
    "Assistant results come from the official APIs, not the consumer apps."
  ],
  "headline": [
    "AI assistants cite Relaykit in 22% of answers (n=600); Courierly is at 54%.",
    "We cannot see agent traffic yet. Install the collector (about 5 minutes) to see who is trying your product.",
    "Fix first: add a code example to your idempotency page, which ChatGPT read but did not cite."
  ],
  "metrics": [
    {
      "key": "found.cited_in_questions",
      "label": "Buyer questions where an assistant cited you",
      "module": "found",
      "unit": "count",
      "value": 11,
      "n": 30,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "found-v2",
      "date": "2026-10-18"
    },
    {
      "key": "found.top_competitor.cited_in_questions",
      "label": "Buyer questions citing your top competitor (Courierly)",
      "module": "found",
      "unit": "count",
      "value": 19,
      "n": 30,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "found-v2",
      "date": "2026-10-18"
    },
    {
      "key": "found.assistants_answered",
      "label": "Assistants that answered",
      "module": "found",
      "unit": "count",
      "value": 5,
      "n": 5,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": null,
      "method_version": "found-v2",
      "date": "2026-10-18"
    },
    {
      "key": "found.cited_rate.claude",
      "label": "Claude: share of answers citing you",
      "module": "found",
      "unit": "rate",
      "value": 0.23333333333333334,
      "n": 120,
      "ci_lo": 0.16665469513089648,
      "ci_hi": 0.31655611609893264,
      "null_reason": null,
      "method_version": "found-v2",
      "date": "2026-10-18"
    },
    {
      "key": "found.cited_rate.openai",
      "label": "ChatGPT: share of answers citing you",
      "module": "found",
      "unit": "rate",
      "value": 0.25833333333333336,
      "n": 120,
      "ci_lo": 0.18837283808050675,
      "ci_hi": 0.343286959596526,
      "null_reason": null,
      "method_version": "found-v2",
      "date": "2026-10-18"
    },
    {
      "key": "found.cited_rate.gemini",
      "label": "Gemini: share of answers citing you",
      "module": "found",
      "unit": "rate",
      "value": 0.15833333333333333,
      "n": 120,
      "ci_lo": 0.10376896007675636,
      "ci_hi": 0.2340948918114622,
      "null_reason": null,
      "method_version": "found-v2",
      "date": "2026-10-18"
    },
    {
      "key": "found.cited_rate.grok",
      "label": "Grok: share of answers citing you",
      "module": "found",
      "unit": "rate",
      "value": 0.11666666666666667,
      "n": 120,
      "ci_lo": 0.07078052921096241,
      "ci_hi": 0.18633501193191693,
      "null_reason": null,
      "method_version": "found-v2",
      "date": "2026-10-18"
    },
    {
      "key": "found.cited_rate.perplexity",
      "label": "Perplexity: share of answers citing you",
      "module": "found",
      "unit": "rate",
      "value": 0.3333333333333333,
      "n": 120,
      "ci_lo": 0.255316102227993,
      "ci_hi": 0.4216906547906502,
      "null_reason": null,
      "method_version": "found-v2",
      "date": "2026-10-18"
    },
    {
      "key": "used.fulfilled_rate",
      "label": "Agent calls that got what they needed",
      "module": "used",
      "unit": "rate",
      "value": null,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": "not_installed",
      "method_version": "used-v4",
      "date": "2026-10-18"
    },
    {
      "key": "used.funnel.discovered",
      "label": "Agents that discovered you",
      "module": "used",
      "unit": "count",
      "value": null,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": "not_installed",
      "method_version": "used-v4",
      "date": "2026-10-18"
    },
    {
      "key": "used.funnel.connected",
      "label": "Agents that connected",
      "module": "used",
      "unit": "count",
      "value": null,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": "not_installed",
      "method_version": "used-v4",
      "date": "2026-10-18"
    },
    {
      "key": "used.funnel.called",
      "label": "Agents that called a tool or endpoint",
      "module": "used",
      "unit": "count",
      "value": null,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": "not_installed",
      "method_version": "used-v4",
      "date": "2026-10-18"
    },
    {
      "key": "used.funnel.got_data",
      "label": "Agents that got data back",
      "module": "used",
      "unit": "count",
      "value": null,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": "not_installed",
      "method_version": "used-v4",
      "date": "2026-10-18"
    },
    {
      "key": "used.funnel.came_back",
      "label": "Agents that came back later",
      "module": "used",
      "unit": "count",
      "value": null,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": "not_installed",
      "method_version": "used-v4",
      "date": "2026-10-18"
    },
    {
      "key": "used.ai_referred.visits",
      "label": "Visits sent by AI assistants",
      "module": "used",
      "unit": "count",
      "value": null,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": "not_installed",
      "method_version": "used-v4",
      "date": "2026-10-18"
    },
    {
      "key": "used.ai_referred.signups",
      "label": "Signups sent by AI assistants",
      "module": "used",
      "unit": "count",
      "value": null,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": "not_installed",
      "method_version": "used-v4",
      "date": "2026-10-18"
    },
    {
      "key": "used.noise_excluded.total",
      "label": "Requests removed as noise",
      "module": "used",
      "unit": "count",
      "value": null,
      "n": null,
      "ci_lo": null,
      "ci_hi": null,
      "null_reason": "not_installed",
      "method_version": "used-v4",
      "date": "2026-10-18"
    }
  ],
  "read_not_cited": [
    {
      "question": "Which email API has the best documentation?",
      "engine": "perplexity",
      "cited_instead": [
        "courierly.example",
        "devforum.example"
      ],
      "reason": "Perplexity read docs.relaykit.example/quickstart but cited a forum thread and Courierly's guide."
    },
    {
      "question": "How do I make email sends idempotent so retries never double-send?",
      "engine": "openai",
      "cited_instead": [
        "sendwright.example"
      ],
      "reason": "ChatGPT read your idempotency page, which has no code example; the cited page does."
    },
    {
      "question": "Which email API works with AI agents through an MCP server?",
      "engine": "claude",
      "cited_instead": [
        "github.com",
        "courierly.example"
      ],
      "reason": "Claude read your MCP page but cited the MCP servers repository and Courierly."
    }
  ],
  "fixes": [
    {
      "rank": 1,
      "title": "Add a code example to your idempotency page",
      "why": "ChatGPT read the page but cited a competitor whose page shows the code.",
      "owner": "agent",
      "effort": "m",
      "verify_by": "2026-11-09",
      "steps": [
        "Open the idempotency page and put the drafted answer block directly under the title.",
        "Keep the curl example runnable; use a real header name and a realistic key.",
        "Add a visible last-updated date.",
        "Re-check in about three weeks; citation changes are slow to show."
      ],
      "how": "1. Open the idempotency page and put the drafted answer block directly under the title.\n2. Keep the curl example runnable; use a real header name and a realistic key.\n3. Add a visible last-updated date.\n4. Re-check in about three weeks; citation changes are slow to show.",
      "patch": {
        "kind": "answer_block",
        "target": "/docs/idempotency",
        "language": "markdown",
        "content": "## How do I make email sends idempotent so retries never double-send?\n\nPass an `Idempotency-Key` header on every `POST /v1/emails` request. Relaykit stores the key for 24 hours and returns the original response for any repeat request with the same key, so a retry never sends a second email.\n\n```bash\ncurl https://api.relaykit.example/v1/emails \\\n  -H \"Authorization: Bearer $RELAYKIT_API_KEY\" \\\n  -H \"Idempotency-Key: order-1042-receipt\" \\\n  -d '{\"to\":\"ada@example.com\",\"template\":\"receipt\"}'\n```\n\nUse one key per business event (an order id, not a random value per attempt).",
        "note": "Put this directly under the page title, before the longer explanation. Last updated: add a visible date."
      },
      "snippet": {
        "language": "markdown",
        "code": "## How do I make email sends idempotent so retries never double-send?\n\nPass an `Idempotency-Key` header on every `POST /v1/emails` request. Relaykit stores the key for 24 hours and returns the original response for any repeat request with the same key, so a retry never sends a second email.\n\n```bash\ncurl https://api.relaykit.example/v1/emails \\\n  -H \"Authorization: Bearer $RELAYKIT_API_KEY\" \\\n  -H \"Idempotency-Key: order-1042-receipt\" \\\n  -d '{\"to\":\"ada@example.com\",\"template\":\"receipt\"}'\n```\n\nUse one key per business event (an order id, not a random value per attempt)."
      },
      "evidence": [
        "ChatGPT read your page but cited another source: In answers to: How do I make email sends idempotent so retries never double-send?",
        "Cited instead: sendwright.example"
      ],
      "method_version": "fix-v1"
    },
    {
      "rank": 2,
      "title": "Serve your docs as markdown",
      "why": "Your docs only render as HTML. Agents read markdown far more reliably.",
      "owner": "agent",
      "effort": "s",
      "verify_by": "2026-10-26",
      "steps": [
        "Add the drafted route so /docs/<slug>.md returns the page source as markdown.",
        "Add the rewrite from /docs/:path*.md in next.config.ts.",
        "Link the .md versions from /llms.txt."
      ],
      "how": "1. Add the drafted route so /docs/<slug>.md returns the page source as markdown.\n2. Add the rewrite from /docs/:path*.md in next.config.ts.\n3. Link the .md versions from /llms.txt.",
      "patch": {
        "kind": "markdown_route",
        "target": "app/docs/md/[...slug]/route.ts",
        "language": "ts",
        "content": "import { getDocSource } from \"@/lib/docs\";\n\n// Serves /docs/<slug>.md (and Accept: text/markdown) as raw markdown.\nexport async function GET(_req: Request, { params }: { params: Promise<{ slug: string[] }> }) {\n  const { slug } = await params;\n  const source = await getDocSource(slug.join(\"/\").replace(/.md$/, \"\"));\n  if (!source) return new Response(\"Not found\", { status: 404 });\n  return new Response(source, { headers: { \"content-type\": \"text/markdown; charset=utf-8\", \"cache-control\": \"public, max-age=300\" } });\n}",
        "note": "Add a rewrite in next.config.ts: { source: \"/docs/:path*.md\", destination: \"/docs/md/:path*\" }."
      },
      "snippet": {
        "language": "ts",
        "code": "import { getDocSource } from \"@/lib/docs\";\n\n// Serves /docs/<slug>.md (and Accept: text/markdown) as raw markdown.\nexport async function GET(_req: Request, { params }: { params: Promise<{ slug: string[] }> }) {\n  const { slug } = await params;\n  const source = await getDocSource(slug.join(\"/\").replace(/.md$/, \"\"));\n  if (!source) return new Response(\"Not found\", { status: 404 });\n  return new Response(source, { headers: { \"content-type\": \"text/markdown; charset=utf-8\", \"cache-control\": \"public, max-age=300\" } });\n}"
      },
      "evidence": [
        "Markdown version of docs/quickstart: Not found (readiness check, Oct 18)"
      ],
      "method_version": "fix-v1"
    },
    {
      "rank": 3,
      "title": "Publish an llms.txt",
      "why": "Agents have no map of your docs. A short llms.txt points them at the markdown pages.",
      "owner": "agent",
      "effort": "xs",
      "verify_by": "2026-10-26",
      "steps": [
        "Create public/llms.txt with the drafted content.",
        "Check every link returns 200.",
        "Re-check in a week."
      ],
      "how": "1. Create public/llms.txt with the drafted content.\n2. Check every link returns 200.\n3. Re-check in a week.",
      "patch": {
        "kind": "llms_txt",
        "target": "/llms.txt",
        "language": "markdown",
        "content": "# Relaykit\n\n> Transactional email API for developers and AI agents. Send with one HTTPS call or through the Relaykit MCP server.\n\n## Docs\n- [Quickstart](https://docs.relaykit.example/quickstart.md): send your first email in five minutes\n- [Idempotency](https://docs.relaykit.example/idempotency.md): retry safely without double-sends\n- [Webhooks](https://docs.relaykit.example/webhooks.md): delivery, bounce and complaint events\n- [MCP server](https://docs.relaykit.example/mcp.md): tools, auth and examples\n\n## Pricing\n- [Pricing](https://relaykit.example/pricing.md): plans and limits as plain text",
        "note": "Hygiene, not a ranking factor: it helps agents find the markdown pages."
      },
      "snippet": {
        "language": "markdown",
        "code": "# Relaykit\n\n> Transactional email API for developers and AI agents. Send with one HTTPS call or through the Relaykit MCP server.\n\n## Docs\n- [Quickstart](https://docs.relaykit.example/quickstart.md): send your first email in five minutes\n- [Idempotency](https://docs.relaykit.example/idempotency.md): retry safely without double-sends\n- [Webhooks](https://docs.relaykit.example/webhooks.md): delivery, bounce and complaint events\n- [MCP server](https://docs.relaykit.example/mcp.md): tools, auth and examples\n\n## Pricing\n- [Pricing](https://relaykit.example/pricing.md): plans and limits as plain text"
      },
      "evidence": [
        "/llms.txt: Not found (readiness check, Oct 18)"
      ],
      "method_version": "fix-v1"
    }
  ],
  "last_week": []
}
