<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[EkLine Blogs]]></title><description><![CDATA[EkLine Blogs]]></description><link>https://ekline.hashnode.dev</link><generator>RSS for Node</generator><lastBuildDate>Thu, 29 Oct 2026 10:06:47 GMT</lastBuildDate><atom:link href="https://ekline.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Why ChatGPT still recommends the API endpoint you removed]]></title><description><![CDATA[You remove an endpoint in a release. The operation leaves the OpenAPI spec, the generated reference drops its page, and the changelog gets a line. Then a…]]></description><link>https://ekline.hashnode.dev/why-chatgpt-recommends-the-api-endpoint-you-removed</link><guid isPermaLink="true">https://ekline.hashnode.dev/why-chatgpt-recommends-the-api-endpoint-you-removed</guid><category><![CDATA[documentation]]></category><category><![CDATA[api]]></category><category><![CDATA[Artificial Intelligence]]></category><dc:creator><![CDATA[Alisa Hester]]></dc:creator><pubDate>Wed, 28 Oct 2026 16:50:50 GMT</pubDate><enclosure url="https://ekline.io/assets/images/blog/why-chatgpt-recommends-the-api-endpoint-you-removed-cover.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>You remove an endpoint in a release. The operation leaves the OpenAPI spec, the generated reference drops its page, and the changelog gets a line. Then a developer opens a support ticket with code an AI assistant wrote for them, and the code calls the endpoint that no longer exists. The guides, samples, and help center articles nobody touched still show the old call. So do the tutorials on other people's sites.</p>
<p>That is two problems: your docs fall behind every release, and assistants keep repeating what they learned before the removal. You control only part of the second.</p>
<p>Deleting the removed endpoint's page takes away a first-party page that could explain the removal. OpenAI keeps shut-down endpoints on its deprecations page, and Stripe marks its deprecated Sources API in both its guide and its <code>llms.txt</code>. Carry that to every surface an assistant reads: spec, reference, <code>llms.txt</code>, changelog, code samples, and help center. Update the docs in the same release as the removal, then ask the assistants again to see what changed. A retirement page does not guarantee an assistant stops recommending the endpoint. It gives a browsing assistant a current page that says the endpoint is gone.</p>
<h2>TL;DR</h2>
<ul>
<li>Two common sources of outdated API answers are training data you cannot edit and live pages retrieved while answering. Your docs can affect retrieved pages and the context developers load into their tools.</li>
<li>ReadMe's OpenAPI sync deletes a removed operation's page, and Google drops indexed pages that return a 404 or 410 error. After that, the reference no longer says the endpoint is gone.</li>
<li>Keep a retirement page at the old URL and mark the removal on every surface in the same release, with a named owner for each.</li>
<li>After the release, ask the assistants the same questions and compare the pages they cite.</li>
</ul>
<h2>Where assistants get the old endpoint from</h2>
<p><img src="https://ekline.io/assets/images/blog/why-chatgpt-recommends-the-api-endpoint-you-removed-two-sources.png" alt="Diagram of an assistant's answer drawing on two sources: training data learned before your release, which you cannot edit, and live pages fetched at answer time, including third-party pages, which your docs reach." /></p>
<p>The first source is training data. A <a href="https://arxiv.org/html/2406.09834v3">study of LLM code completion</a> (arXiv 2406.09834v3, February 2025) evaluated seven models on 28,125 prompts covering 145 deprecated/replacement API mappings across eight Python libraries. Among completions that used either the target deprecated API or its mapped replacement, roughly 25% to 38% used the deprecated API. That denominator excludes other completions. This was a library-code benchmark, not a measurement of current ChatGPT use of retired HTTP endpoints. The authors discuss deprecated training examples and missing deprecation knowledge as possible causes.</p>
<p>Prompt context mattered in that benchmark. For prompts built from outdated functions, the same conditional deprecated-usage rate was roughly 70% to 90%; for prompts from updated functions, it was roughly 9% to 18%. These are rates among completions using one of the target API pair, not all completions.</p>
<p>The second source is the live web. Each of the four major providers documents how it reads pages at answer time. OpenAI and Anthropic keep those fetchers separate from their training crawlers, GPTBot and ClaudeBot.</p>
<table>
<thead>
<tr>
<th>Provider</th>
<th>Answer-time access</th>
<th>What the provider says</th>
</tr>
</thead>
<tbody><tr>
<td>OpenAI</td>
<td>OAI-SearchBot, ChatGPT-User</td>
<td>OAI-SearchBot <a href="https://developers.openai.com/api/docs/bots">"is used to surface websites in search results in ChatGPT's search features"</a></td>
</tr>
<tr>
<td>Anthropic</td>
<td>Claude-SearchBot, Claude-User</td>
<td><a href="https://support.claude.com/en/articles/8896518-does-anthropic-crawl-data-from-the-web-and-how-can-site-owners-block-the-crawler">"Disabling Claude-User on your site prevents our system from retrieving your content in response to a user query"</a></td>
</tr>
<tr>
<td>Perplexity</td>
<td>PerplexityBot, Perplexity-User</td>
<td>Perplexity-User <a href="https://docs.perplexity.ai/guides/bots">"might visit a web page to help provide an accurate answer and include a link to the page in its response"</a></td>
</tr>
<tr>
<td>Google</td>
<td>Grounding with Google Search</td>
<td>Grounding means <a href="https://developers.google.com/crawling/docs/crawlers-fetchers/google-common-crawlers">"providing content from the Google Search index to the model at prompt time to improve factuality and relevancy"</a>; in the Gemini API it lets the model <a href="https://ai.google.dev/gemini-api/docs/google-search">"cite verifiable sources beyond its knowledge cutoff"</a></td>
</tr>
</tbody></table>
<p>All four providers document ways to retrieve live pages or a search index while answering. That gives current documentation a route into answers that use retrieval, though it does not guarantee that any particular page will be fetched or cited.</p>
<h2>Why deleting the page makes it worse</h2>
<p>ReadMe's OpenAPI sync treats removal as deletion: <a href="https://docs.readme.com/main/docs/sync-docs-with-openapi">"The one thing it removes is the page for an operation that's no longer in the spec, and that page's body goes with it."</a> The spec cannot help either. OpenAPI 3.1.1 has a <a href="https://spec.openapis.org/oas/v3.1.1.html"><code>deprecated</code> field</a> on the Operation Object, but no state for removed. Once the operation leaves the spec, a sync like ReadMe's removes its reference page too.</p>
<p>Google says <a href="https://developers.google.com/search/docs/crawling-indexing/http-network-errors">"URLs that are already indexed and return a 4xx status code are removed from the index"</a> for errors such as 404 and 410; it treats 429 differently and gives no fixed removal timeframe. That is the index Gemini grounds on. The deleted page drops out, while old tutorials, forum answers, and third-party pages that show the endpoint stay up. The training data still has it too, and the reference no longer contradicts any of them. A retirement page served with HTTP 200 avoids that particular 404/410 removal mechanism. It must also remain crawlable and indexable; HTTP 200 alone does not guarantee retrieval. No source we found measures whether that stops an assistant suggesting the endpoint.</p>
<p>A generated reference like ReadMe's handles one page, and it handles it by deleting the page that could say the endpoint is gone. Guides, code samples, help center articles, changelogs and third-party pages can still carry the endpoint. GitBook's guidance on <a href="https://www.gitbook.com/blog/keep-technical-documentation-accurate">keeping technical docs accurate</a> warns that a deprecated endpoint can keep pulling in new users while examples still point to it.</p>
<h2>The training-data objection, at full strength</h2>
<p>Publishing cannot change a model's learned weights. On the OpenAI forum on October 9, 2025, a developer reported that <a href="https://community.openai.com/t/codex-suggests-deprecated-api-assistants-responses-anyone-found-a-reliable-workaround/1361734">"Codex repeatedly suggested removed/renamed parameters and JSON schemas that failed validation against the latest API"</a>. The thread contains another user reporting the same problem, not a demonstrated remedy. A <a href="https://github.com/firebase/firebase-tools/pull/11350">contributor pull request to Firebase's CLI</a>, still open when checked on October 27, 2026, proposes current Firestore SDK guidance in AI context files. Its author attributes outdated SDK suggestions to training data. That is a practitioner explanation, not a controlled finding that coding assistants rely only on static weights.</p>
<p>For answers that do not browse, the objection holds: publishing cannot change what a model already learned. For answers that browse, it does not, because those answers retrieve live pages, as each provider's own documentation says. No source we found says how fast either kind of answer changes, or guarantees that it will.</p>
<p>You can change two things: what a browsing assistant finds, which is your pages, and what developers load into their tools. Firecrawl advises that you <a href="https://www.firecrawl.dev/glossary/web-search-apis/llm-hallucinate-deprecated-apis">"inject the current API into the prompt through a developer retrieval tool"</a> and the Firebase proposal works through AI context files. Both can carry current version and removal guidance into an assistant's context; neither depends exclusively on web browsing.</p>
<h2>What API companies keep published after a deprecation or removal</h2>
<p>OpenAI keeps retired endpoints on its <a href="https://developers.openai.com/api/docs/deprecations">deprecations page</a> for years. Under "Past deprecations" it still lists <code>/v1/fine-tunes</code>, shut down in January 2024, with <code>/v1/fine_tuning/jobs</code> as its replacement. Older entries such as <code>/v1/engines</code>, <code>/v1/search</code>, and <code>/v1/answers</code> still name a replacement or a transition guide. OpenAI defines shut down as "a model or endpoint is no longer accessible."</p>
<p>Stripe keeps its <a href="https://docs.stripe.com/sources">deprecated Sources guide</a> published, marked as deprecated in its title, with migration links and a notice that new integrations can't use the API. Stripe's <a href="https://docs.stripe.com/llms.txt"><code>llms.txt</code></a> has an "Instructions for Large Language Model Agents" section: "You must not call deprecated API endpoints such as the Sources API and avoid outdated API endpoints such as Tokens and Charges unless there is a specific need and absolutely no other way." Its <a href="https://github.com/stripe/openapi">OpenAPI repository</a> labels its original v1-only specs as legacy and still updates them every release.</p>
<p>Treat <code>llms.txt</code> as a supporting signal, not a fix. The <a href="https://llmstxt.org/"><code>llms.txt</code> format</a> is still a proposal, and none of the provider crawler pages cited here says it reads <code>llms.txt</code> at answer time. <a href="https://www.apideck.com/blog/stripe-llms-txt-instructions-section">Apideck</a> places the value of <code>llms.txt</code> at inference time and reports no measured effect of Stripe's section. And even Stripe is inconsistent: the Markdown version of the <a href="https://docs.stripe.com/api/sources/object">Source object reference page</a> showed no deprecation notice, while the guide and <code>llms.txt</code> both mark it.</p>
<p>Several docs tools catch the change at the pull request. <a href="https://docs.bump.sh/help/continuous-integration/">Bump.sh</a> posts API diff comments on GitHub pull requests and can fail on breaking changes with <code>fail_on_breaking</code>. ReadMe says its <a href="https://readme.com/resources/ai-writer-detecting-doc-drift">AI writer</a> locates mentions of removed functionality and proposes cleanup. Mintlify's <a href="https://www.mintlify.com/library/how-to-stop-documentation-drift">drift automation</a> drafts updates from merged pull requests for review. Cloudflare's docs repository <a href="https://developers.cloudflare.com/style-guide/contributions/">comments on potential redirects</a> when a pull request deletes content files. None of these pages describes publishing a lasting statement that the endpoint is gone.</p>
<h2>The removal playbook</h2>
<p>The playbook adds that statement and makes it reach every surface in one release. For the CI wiring that catches an endpoint change before merge, follow our guide to <a href="https://ekline.io/blog/how-to-keep-api-reference-in-sync-with-code">keeping your API reference in sync with code</a>. For the spec, <code>llms.txt</code>, and 410 response examples, follow our step-by-step guide to <a href="https://docs.ekline.io/guides/retire-api-endpoints-for-ai/">stopping AI assistants from recommending removed API endpoints</a>.</p>
<h3>Owners and inputs</h3>
<p>The engineer who removes the operation owns the spec and the API response. The technical writer owns the docs surfaces and the check after the release. Before the release, the writer needs four inputs: the spec diff, the replacement endpoint, the migration guide, and a list of every page that mentions the old endpoint path across the docs, help center, READMEs, and sample repositories.</p>
<table>
<thead>
<tr>
<th>Surface</th>
<th>What it says after the removal ships</th>
<th>Owner</th>
</tr>
</thead>
<tbody><tr>
<td>Retirement page at the old reference URL</td>
<td>The endpoint, its shutdown date, the replacement, and the migration guide. It stays published and returns a normal page with a 200 status.</td>
<td>Technical writer</td>
</tr>
<tr>
<td>OpenAPI spec</td>
<td><code>deprecated</code> during the deprecation window, then the operation removed</td>
<td>API engineer</td>
</tr>
<tr>
<td>API response</td>
<td>410 Gone, with deprecation and sunset links to the retirement page</td>
<td>API engineer</td>
</tr>
<tr>
<td><code>llms.txt</code></td>
<td>An instruction naming the removed endpoint and its replacement</td>
<td>Technical writer</td>
</tr>
<tr>
<td>Changelog or deprecations page</td>
<td>A dated entry with the replacement, kept after shutdown</td>
<td>Technical writer</td>
</tr>
<tr>
<td>Guides, READMEs, code samples</td>
<td>The new call everywhere the old one appeared</td>
<td>Technical writer, with an engineering reviewer</td>
</tr>
<tr>
<td>Help center</td>
<td>Updated articles that link the retirement page</td>
<td>Support lead</td>
</tr>
</tbody></table>
<p>In this split, engineering owns two of the seven surfaces and the writer owns four, so most of a removal is docs work that has to land in the same release.</p>
<p>HTTP standards already describe the API response row. <a href="https://www.rfc-editor.org/rfc/rfc9110.html">RFC 9110</a> defines 410 Gone as "access to the target resource is no longer available at the origin server." <a href="https://www.rfc-editor.org/rfc/rfc9745.html">RFC 9745</a> (March 2025) defines a <code>deprecation</code> link relation that points to human-readable documentation about the deprecation. <a href="https://www.rfc-editor.org/rfc/rfc8594.html">RFC 8594</a> defines the <code>sunset</code> link relation for retirement policy. Your retirement page is the documentation those links point to. Also check that <code>robots.txt</code> lets the answer-time fetchers in the first table read it. OpenAI says its <a href="https://developers.openai.com/api/docs/bots">search systems can take about 24 hours</a> to adjust after a <code>robots.txt</code> update.</p>
<h3>Cadence and checkpoints</h3>
<ol>
<li>At the deprecation announcement, mark the operation <code>deprecated</code>, add the notice to its reference page, add the <code>llms.txt</code> instruction, and add the changelog entry.</li>
<li>On the pull request that removes the operation, make the docs impact decision GitBook recommends for every pull request. Checkpoint: a linked docs pull request exists before the removal merges.</li>
<li>On release day, confirm the retirement page is live at the old URL and the sweep of guides, samples, and help center articles is merged.</li>
<li>After the release, ask the assistants again and compare the answers.</li>
</ol>
<h3>One worked cycle</h3>
<p>Say your team is retiring <code>/api/v1/users</code> for a v2 endpoint. At announcement, the engineer sets <code>deprecated</code> on the operation, and the writer adds a reference notice, an <code>llms.txt</code> line naming the v2 replacement, and a changelog entry. When the removal pull request opens, the writer opens a linked docs pull request. It turns the reference page into a retirement page, replaces the v1 call in the quickstart, the guides, and the sample repository, and updates the help center article on listing users. The engineer makes the old route return 410 with a link to the retirement page. Both pull requests merge in the same release. A week later, the writer reruns the assistant questions and compares the answers with the ones recorded before the release.</p>
<h2>How to check whether assistant answers changed</h2>
<p>None of the guides we reviewed compares assistant answers from before and after a removal. Build the check yourself:</p>
<ol>
<li>Before the release, write down the questions developers ask about the removed endpoint, in their words.</li>
<li>Ask each assistant every question with browsing on, more than once. Record whether the removed endpoint appears and which pages the answer cites.</li>
<li>After the release, ask the same questions in the same assistants and compare.</li>
</ol>
<p>When an answer cites your retirement page, check the URL and whether the answer reflects the removal. An answer that cites a third-party tutorial still showing the old call gives you a page to ask its author to update. An answer without citations does not by itself show whether retrieval occurred; inspect the tool or search trace when available. Date every run, because no source we found says how long answers take to change.</p>
<h2>Where EkLine fits</h2>
<p>For the docs side of this fix, use <a href="https://docs.ekline.io/agent/keep-docs-in-sync-with-code/">EkLine Docs Agent</a>. The sweep is where the playbook is hardest: the guides, READMEs, and knowledge-base articles a generated reference never touches. Docs Agent keeps READMEs, API references, guides, and knowledge-base pages current in three ways. When a non-draft pull request becomes ready for review in a monitored repository, it checks the diff against your docs and, on a high-confidence match, drafts the update as a documentation pull request. On a schedule you set, a drift audit finds customer-facing changes that merged without documentation and fixes the highest-priority gap. And it takes on-demand requests, like the example in its <a href="https://docs.ekline.io/agent/update-review/">update docs</a>: "We deprecated the /api/v1/users endpoint. Update the API reference to mark it as deprecated and point to the v2 replacement." In GitHub, mentioning <code>@ekline-ai</code> in a pull request comment <a href="https://docs.ekline.io/agent/github-integration/">starts a session</a> that drafts the docs and can open a docs pull request.</p>
<p>Before: the removal merges, the reference page disappears, and the guides keep the old call until a developer reports it. After: on a high-confidence match, EkLine drafts a documentation pull request. Your writer checks that it covers the reference and related pages before approval, because "Every update arrives as a pull request on your documentation repository." At Socure, <a href="https://ekline.io/case-study/how-socure-built-developer-experience-into-a-moat-with-ekline">one technical writer merged 348 documentation updates in seven weeks</a> with no new hires.</p>
<p><a href="https://ekline.io/">EkLine</a> also runs the check after the release. It asks ChatGPT, Claude, Perplexity, and Gemini the questions your developers and buyers ask, shows which pages they cited, and lets you "Re-run the same questions and tasks after you ship and compare." EkLine cannot change what a model already learned. It keeps your pages current and shows whether the answers that browse have caught up. For drift beyond removed endpoints, see our <a href="https://ekline.io/blog/documentation-drift">guide to documentation drift</a>.</p>
<p><a href="https://app.apollo.io/#/meet/puneet_arora/30-min">Book a demo to see what AI assistants currently say about your API</a>, or <a href="https://ekline.io/auth/sign-up">get started with EkLine</a>.</p>
<h2>FAQ</h2>
<h3>Why does ChatGPT recommend API endpoints that no longer exist?</h3>
<p>Training data can preserve old API patterns, while retrieved pages and developer-provided context can repeat outdated instructions. In a study across eight Python libraries, seven models used deprecated APIs in roughly 25% to 38% of completions that used either a target deprecated API or its mapped replacement. This is not an error rate for current ChatGPT answers or retired HTTP endpoints. If your old reference page was deleted, a first-party page that could explain the removal is gone.</p>
<h3>Should I delete the documentation page for a removed API endpoint?</h3>
<p>No. Keep a retirement page at the old URL that names the endpoint, its shutdown date, the replacement, and the migration guide, and serve it as a normal page with a 200 status. Google removes indexed URLs that return errors such as 404 or 410 from its index, so a deleted page stops telling browsing assistants that the endpoint is gone.</p>
<h3>How do I check whether AI assistant answers changed after I remove an endpoint?</h3>
<p>Before the release, write down the questions developers ask about the endpoint. Ask each assistant every question with browsing on, more than once, and record whether the removed endpoint appears and which pages the answer cites. After the release, ask the same questions again and compare. Date every run, because no source we found says how long answers take to change.</p>
]]></content:encoded></item><item><title><![CDATA[Profound alternative for developer tool companies: what to choose]]></title><description><![CDATA[Your buyer asks Claude which tool to use. Then they open Cursor or Claude Code and ask it to build with that tool. Claude Code already favors some…]]></description><link>https://ekline.hashnode.dev/profound-alternative-for-developer-tool-companies</link><guid isPermaLink="true">https://ekline.hashnode.dev/profound-alternative-for-developer-tool-companies</guid><category><![CDATA[documentation]]></category><category><![CDATA[Artificial Intelligence]]></category><category><![CDATA[Developer Tools]]></category><dc:creator><![CDATA[Alisa Hester]]></dc:creator><pubDate>Wed, 28 Oct 2026 16:49:29 GMT</pubDate><enclosure url="https://ekline.io/assets/images/blog/profound-alternative-for-developer-tool-companies-cover.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Your buyer asks Claude which tool to use. Then they open Cursor or Claude Code and ask it to build with that tool. Claude Code already favors some products. In Amplifying.ai's February 2026 report on <a href="https://amplifying.ai/research/claude-code-picks/report">what Claude Code actually chooses</a>, Stripe was the primary choice in 64 of 70 extractable payments responses (91.4%), from 90 payments responses in total.</p>
<p>A visibility dashboard tells you how often ChatGPT or Claude names your brand when a buyer asks which tool to use. It does not fix the docs pages that the assistant and the coding agent both read.</p>
<p>For a developer tool company, choose EkLine to connect AI-answer checks to reviewed documentation fixes. EkLine checks whether ChatGPT, Claude, Gemini and Perplexity recommend you. It checks whether coding agents can build with your product. It drafts the fix as a pull request your team approves, and then you run the same question again to see whether the answer moved. For teams already using Profound for brand tracking, EkLine keeps the product documentation behind those answers accurate.</p>
<p>EkLine's customer case studies show these results. Socure had one writer and saw "348 documentation updates merged in seven weeks." AI assistants now "generate code that aligns with Socure's actual API surface," according to the <a href="https://ekline.io/case-study/how-socure-built-developer-experience-into-a-moat-with-ekline">Socure case study</a>.</p>
<p><a href="https://ekline.io/case-study/how-contextqas-engineers-merge-97-percent-of-what-an-ai-agent-writes">ContextQA's engineers merged 97.5% of what the agent proposed</a>, 79 of 81 updates.</p>
<h2>TL;DR</h2>
<ul>
<li>For a developer tool or API company, EkLine is the better Profound alternative.</li>
<li>It checks whether AI assistants recommend you and whether coding agents succeed with your product. It shows which of your pages each answer cited.</li>
<li>It fixes docs through pull requests drafted from your code, and you rerun the question to see the change.</li>
<li>EkLine helps keep those pages current as you ship. It assesses each non-draft pull request when it becomes ready for review in a monitored repository for docs impact, and scheduled audits check drift, code samples and READMEs.</li>
<li>Profound measures brand presence, position, sentiment and accuracy. It drafts content into a CMS. Its Agents, Documents, Agent Analytics and pricing pages do not mention Git, pull requests, or coding agent tasks.</li>
<li>Profound tracks more engines and fits a large marketing org focused on brand and marketing site visibility.</li>
<li>For a team already using Profound, EkLine owns the documentation-accuracy workflow and coding-agent checks alongside brand tracking.</li>
<li>Scrunch, Peec AI and AirOps serve marketing teams. Gauge targets developer tool companies and now links to a Coding Agents offering from its guide.</li>
</ul>
<h2>Why the docs decide a developer tool's AI answers</h2>
<p>For a developer tool, the pages that describe the product in the most detail are the docs, the API reference and the help center. Those are also the pages a coding agent needs when it tries to install and call your product. At ContextQA, AI systems read them heavily. EkLine's ContextQA case study reports that over the quarter it covers, "ChatGPT alone pulled more pages from ContextQA's documentation than every human visitor combined."</p>
<p>Gauge, which sells to this market, states the stakes in <a href="https://www.withgauge.com/resources/best-ai-visibility-tools-for-developer-tool-companies/">its guide for developer tool companies</a>: "AI assistants are now the first step in developer tool discovery, before documentation, GitHub, or community forums."</p>
<p>So a developer tool company needs three things from a tool in this category:</p>
<ul>
<li>A check for recommendation that is separate from mention.</li>
<li>A test of whether a coding agent can build with the product.</li>
<li>A way to fix the docs pages and confirm that the fix worked.</li>
</ul>
<h2>How this comparison works</h2>
<p>The criteria follow from those three needs. What does each tool measure? Does it test coding agents? Where does a fix go, and who approves it? Can you run the same question again after the fix?</p>
<p>This is an EkLine-owned comparison. Facts about Profound and the other tools come from their own pages, checked on October 27, 2026. That includes <a href="https://www.tryprofound.com/pricing">Profound's pricing</a> and its <a href="https://www.tryprofound.com/features/agents">Agents</a>. Amplifying's results are an early-2026 snapshot from greenfield repositories, not a measure of developer consensus or tool quality. We cite roundups for how others group these tools, for Gauge's own positioning and for Profound's earlier self-serve prices.</p>
<h2>Profound vs EkLine for a developer tool company</h2>
<table>
<thead>
<tr>
<th>Criterion</th>
<th>Manual checks (status quo)</th>
<th>Profound</th>
<th>EkLine</th>
</tr>
</thead>
<tbody><tr>
<td>What it measures</td>
<td>Prompts run by hand or in a tracker; you define "recommended" yourself</td>
<td>Visibility score, Share of Voice, Average Position, Citations, Sentiment and FactCheck accuracy; the help docs name no metric for recommendation</td>
<td>Separates recommendation from mention and checks whether agents answer correctly about your product</td>
</tr>
<tr>
<td>AI engines</td>
<td>Whatever you check by hand</td>
<td>Trial: 3 (ChatGPT, Gemini, Google AI Overviews). Enterprise: up to 9</td>
<td>ChatGPT, Claude, Gemini and Perplexity</td>
</tr>
<tr>
<td>Coding agent tasks</td>
<td>An engineer tries the docs</td>
<td>Its Agents, Agent Analytics and pricing pages do not mention Claude Code, Codex or Cursor</td>
<td>Checks whether coding agents can build with your product and complete the tasks your developers care about</td>
</tr>
<tr>
<td>Pages behind the answer</td>
<td>Read each answer's links by hand</td>
<td>A Citations metric in its help docs</td>
<td>Shows which pages answers cite, so you can inspect the product evidence behind them</td>
</tr>
<tr>
<td>Where the fix goes</td>
<td>Someone edits the page; at P0 Security a guide took "2 to 3 hours of an engineer's time"</td>
<td>Agents draft content and "publish approved content" to your CMS; Webflow and Contentful named</td>
<td>Docs Agent drafts from your code, tickets and support threads and opens a pull request in GitHub or GitLab</td>
</tr>
<tr>
<td>Surfaces it updates</td>
<td>Whatever someone remembers</td>
<td>Marketing content in a CMS</td>
<td>Docs, API reference, READMEs, code samples, release notes and help center articles</td>
</tr>
<tr>
<td>Keeping pages current</td>
<td>Ad hoc</td>
<td>Content Refresh agent template</td>
<td>Assesses non-draft PRs when they become ready for review in monitored repositories; scheduled drift, code sample and README audits</td>
</tr>
<tr>
<td>Who approves</td>
<td>Whoever edits</td>
<td>Your team approves content before Profound publishes it</td>
<td>Your team reviews and merges the pull request</td>
</tr>
<tr>
<td>Proving the fix</td>
<td>Rerun the prompt by hand</td>
<td>Prompts run daily ("50 prompts run daily for 7 days" on Trial)</td>
<td>You rerun the same questions and tasks after shipping and compare the results</td>
</tr>
<tr>
<td>Security</td>
<td>Not applicable</td>
<td>"SSO/SAML + SOC 2 compliance" on Enterprise</td>
<td>SOC 2 Type II</td>
</tr>
<tr>
<td>Published price</td>
<td>Staff time</td>
<td>Trial "Free"; Enterprise "Custom"</td>
<td>Free Starter plan and a 30-day Pro trial; book a demo to see your own results</td>
</tr>
</tbody></table>
<p>Profound covers more engines and publishes to a marketing CMS. EkLine checks recommendation, tests coding agents and shows which of your pages shaped the answer. It also fixes the surfaces in the table after your team reviews them. Docs in your repo change through a pull request. Help center articles publish after you approve them.</p>
<h2>How EkLine measures, fixes and proves</h2>
<p><img src="https://ekline.io/assets/images/blog/profound-alternative-for-developer-tool-companies-loop.png" alt="Diagram of a loop: EkLine measures buyer questions and coding agent tasks, finds failed checks, opens a docs pull request for review, and runs the same question again" /></p>
<p><em>Illustrative workflow. The diagram names Codex, but EkLine's current public homepage does not confirm Codex support. Confirm available coding agents in your demo.</em></p>
<h3>Measure what buyers and coding agents see</h3>
<p>EkLine checks buyer questions across ChatGPT, Claude, Gemini and Perplexity. It also checks whether coding agents can build with your product, the way a developer would after picking a tool.</p>
<p>EkLine separates recommendation from mention and checks whether agents answer correctly about your product. In your evaluation, also record whether your product appears in the first answer of a conversation and remains in the final answer.</p>
<p>For coding-agent tasks, ask to see the evidence behind each result: whether the commands succeeded, whether the documented steps worked in order, and whether pages gave conflicting values, commands or sequences. These checks help you judge whether a quickstart is usable.</p>
<p>EkLine shows which pages answers cite. Inspect those sources to see whether an answer used your current docs, an old page, or a competitor's roundup, then decide which page to fix first.</p>
<h3>Fix the page as a pull request</h3>
<p>Use the finding to start a Docs Agent session and describe the correction you need. Docs Agent connects to GitHub and GitLab. It takes context from Jira, Linear, Slack, Notion, Confluence and Google Docs, and opens a documentation pull request.</p>
<p>As the guide to <a href="https://docs.ekline.io/agent/keep-docs-in-sync-with-code/">keeping docs in sync with code</a> puts it, "You review and merge it through your normal process before any change reaches your main branch." EkLine works with docs in Mintlify, ReadMe, GitBook, Docusaurus or Markdown in your repo, and with Confluence or Pylon knowledge bases. You keep your docs where they are. The <a href="https://ekline.io/">EkLine homepage</a> says "If your docs live in Git, setup takes about 15 minutes."</p>
<h3>Run the question again</h3>
<p>After the merge, run the same questions and tasks again and compare them with the baseline. Check whether the answer changed and whether it now reflects the updated documentation.</p>
<p>Docs Agent drafts the fix, so engineers review instead of write. At <a href="https://ekline.io/case-study/how-p0-securitys-engineering-team-stopped-writing-docs-and-started-shipping-faster">P0 Security</a>, "In 6 months, engineers reclaimed 150+ hours of product development time by reviewing documentation instead of writing it."</p>
<h2>What EkLine does that a visibility tracker does not</h2>
<h3>Fixes grounded in your code</h3>
<p>Docs Agent reads your source code as well as the page. It can <a href="https://docs.ekline.io/agent/generate-api-reference/">generate an API reference from your source code</a>, reading "function signatures, types, and comments" to produce parameters, response schemas, example requests and error codes. It turns Jira or Linear tickets into <a href="https://docs.ekline.io/agent/release-notes/">release notes</a>. And it <a href="https://docs.ekline.io/agent/tutorial-answer-support-questions/">drafts help center articles from the support thread that already resolved the question</a>, then publishes them to Confluence or Pylon after your review.</p>
<h3>Pages that stay current on every release</h3>
<p>Docs fall behind code the moment a pull request merges without a docs update. EkLine <a href="https://docs.ekline.io/agent/prevent-documentation-drift/">reviews every ready-for-review pull request</a> when it becomes ready for review in a monitored repository. The assessment runs once; later commits need a manual mention to trigger another review. When it finds clear docs impact, it starts a docs update. When the impact is less certain, it suggests one in a comment on the pull request. <a href="https://docs.ekline.io/agent/scheduled-agents/">Scheduled Agents</a> sweep for what slipped through. The Code Sample Review template "verifies that code samples in your docs are accurate and runnable against the APIs and SDKs they demonstrate." Other templates audit drift, README accuracy, UI labels and screenshots, and can deliver pull requests when that output is enabled.</p>
<h3>Your voice and your terms</h3>
<p>Docs Agent learns your style from your existing docs. <a href="https://docs.ekline.io/agent/custom-instructions/">Custom instructions</a> add the conventions it can't infer, such as spelling, terminology and which versions you support. Repo changes land as pull requests and help center edits publish only when you approve them, so nothing ships without your team.</p>
<h3>Measure, fix and rerun in one place</h3>
<p>The buying question is how measurement connects to a reviewed documentation change. <a href="https://mentionx.ai/features/recommendation-rate">MentionX defines a "Recommendation Rate"</a> and a "First-choice Rate." <a href="https://www.mintlify.com/docs/agent">Mintlify's agent</a> "creates pull requests with proposed changes to your documentation" on Pro or Enterprise. EkLine connects recommendation and coding-agent checks with product-grounded documentation updates and a post-release comparison.</p>
<h2>The case for keeping Profound</h2>
<p>Profound's Enterprise plan tracks "Up to 9 Answer Engines," including ChatGPT, Perplexity, Gemini, Microsoft Copilot, Anthropic Claude and Google AI Overviews. It includes SSO and SOC 2. <a href="https://www.tryprofound.com/features/agent-analytics">Agent Analytics</a> tracks AI traffic to your site. Agents "connect to your existing CMS and publish approved content," and <a href="https://www.tryprofound.com/features/documents">Profound Documents</a> names Webflow and Contentful as destinations. <a href="https://www.tryprofound.com/ai-instructions">Profound says</a> it serves "more than 700 enterprise brands and large agencies," including MongoDB and Plaid.</p>
<p>These features cover brand and marketing-site visibility. For a developer tool, the docs are the pages AI assistants and coding agents read about how your product works. Profound's Agents and Documents pages do not mention Git or pull requests. Its Agent Analytics page does not mention Claude Code, Codex or Cursor. Its <a href="https://docs.tryprofound.com/answer-engine-insights/about">help docs</a> compute the Visibility score from "the number of responses that include your brand" and name no metric for whether a brand is recommended.</p>
<h2>When to choose EkLine and when Profound fits</h2>
<p>Choose EkLine if you sell a developer tool or API. Your buyers ask ChatGPT or Claude what to use, then build with Claude Code, Codex or Cursor. You need to know whether you are recommended and whether the agent completes the task. And you want the docs fixed through pull requests your team reviews. Marketing identifies the answer gap, and the docs owner reviews and merges the proposed correction.</p>
<p>Profound fits a large marketing org that tracks many engines and brands across marketing sites. That team wants agent traffic analytics and SSO, and publishes to a CMS. EkLine owns the documentation-accuracy workflow alongside that brand tracking. The EkLine homepage says the same about SEO tools: "Keep your SEO tool; EkLine works alongside it."</p>
<h2>Other Profound alternatives and where they fit</h2>
<p>The <a href="https://www.frase.io/blog/profound-alternatives">Frase</a> and <a href="https://www.airops.com/blog/profound-alternatives">AirOps</a> roundups sort these tools by how far they carry a visibility finding toward a published page. AirOps puts it plainly: "Dashboards show what's happening, but they don't update content." The roundups emphasize content workflows and CMS publishing.</p>
<p><a href="https://scrunch.com/">Scrunch</a> offers AI visibility monitoring, site audits and AI agent/bot traffic reporting. <a href="https://scrunch.com/pricing">Its pricing page</a> lists Core at $250/mo. Confirm billing terms directly with Scrunch. It fits a marketing team that wants monitoring at a published price.</p>
<p><a href="https://peec.ai/">Peec AI</a> offers "AI search analytics for marketing teams" across ChatGPT, Perplexity and Gemini, with recommendations and an API. It also offers a <a href="https://peec.ai/mcp">Peec MCP server</a>. It fits a marketing team that wants AI search data inside its own tools.</p>
<p>AirOps combines AI search insights with content workflows. <a href="https://www.airops.com/pricing">AirOps Pro</a> currently lists "Insights Across 10+ Answer Engines" and CMS integrations. Its pricing page and its Profound alternatives post do not describe Git pull-request delivery. It fits a content team that publishes marketing pages.</p>
<p>Gauge's own guide positions it for developer tool companies and lists Growth at "$599/mo." Its current navigation also links to Coding Agents and a guide to coding-agent visibility tools. Compare that offering directly if coding-agent evaluation is part of your buying criteria.</p>
<p>Docs platforms are a separate category. Mintlify's agent opens pull requests, and its agent page does not mention measuring AI visibility. If you are choosing a docs platform, our <a href="https://ekline.io/blog/mintlify-alternatives">Mintlify alternatives guide</a> covers that decision.</p>
<h2>A checklist for evaluating any Profound alternative</h2>
<ul>
<li>Does it report whether you are recommended, separately from whether you are mentioned, and does it say how it decides?</li>
<li>Does it check where you stand in the first answer of a conversation and in the last?</li>
<li>Which engines does it cover, and is Claude one of them?</li>
<li>Does it give tasks to coding agents such as Claude Code or Codex?</li>
<li>Does it judge a task by whether the commands actually succeeded?</li>
<li>When it finds a problem, does the fix go to a CMS or to a pull request in the repo where your docs live?</li>
<li>Does the fix start from your code and tickets?</li>
<li>Does it show which of your pages each answer cited?</li>
<li>Does it keep pages current on every release, or only react after an answer goes wrong?</li>
<li>Who approves the change before it ships?</li>
<li>Can you run the same question again after the fix and see the trend?</li>
<li>Are its prices and security claims, such as SOC 2 Type II and SSO, on its own pages?</li>
</ul>
<h2>FAQ</h2>
<h3>What is the best Profound alternative for a developer tool company?</h3>
<p>EkLine. For a developer tool company, the docs, API reference and help center are the pages AI assistants and coding agents read. EkLine checks whether ChatGPT, Claude, Gemini and Perplexity recommend you. It checks whether coding agents can complete tasks with your product. It shows which of your pages each answer cited, opens a pull request with the fix drafted from your code, and lets you run the question again. It also assesses non-draft pull requests when they become ready for review in monitored repositories, helping keep pages current with releases. For teams already using Profound, EkLine owns the documentation-accuracy workflow alongside brand tracking.</p>
<h3>How can we track whether ChatGPT and Claude recommend our developer tool, not just mention it?</h3>
<p>Define recommendation separately from mention and check it on every run. EkLine distinguishes recommendation from mention. For multi-turn evaluations, also record whether your product appears in the first answer and remains in the final answer. MentionX also defines a "Recommendation Rate." Profound's help docs describe Visibility score, Share of Voice, Average Position, Citations, Sentiment and FactCheck, and name no metric for recommendation.</p>
<h3>Which tools fix the pages AI assistants read instead of only reporting mentions?</h3>
<p>Profound and AirOps draft content and publish it to a CMS such as Webflow or Contentful. Mintlify's agent opens pull requests with proposed docs changes. Use an EkLine finding to request a product-grounded documentation pull request. Your team reviews and merges it, then you run the question again.</p>
<h3>Does EkLine replace Profound?</h3>
<p>If your AI visibility work is about docs and coding agents, yes. EkLine covers the recommendation checks, the coding agent tasks, the cited pages and the docs fixes in one loop. A large marketing org that also wants Profound's brand tracking across more engines and its AI traffic analytics can keep it alongside EkLine.</p>
<h3>How much does Profound cost now?</h3>
<p>Profound's pricing page lists a free Trial and an Enterprise plan priced as "Custom," with no dollar figure. <a href="https://www.eclincher.com/articles/profound-alternatives-8-ai-visibility-tools-after-profounds-pricing-change">Eclincher</a>, which sells a competing tool, reports that in mid-September 2026 Profound "removed its self-serve Starter ($99 per month) and Growth ($399 per month) plans for brands."</p>
<h2>Next step</h2>
<p>If you sell a developer tool and want to know whether ChatGPT and Claude recommend it and whether Claude Code can build with it, <a href="https://app.apollo.io/#/meet/puneet_arora/30-min">book a demo with EkLine</a>.</p>
]]></content:encoded></item><item><title><![CDATA[How to keep a Pylon knowledge base accurate after every release]]></title><description><![CDATA[A release renames a setting, but the help center still shows the old name and steps. Customers and Pylon's AI agent can then use the stale instructions. KB…]]></description><link>https://ekline.hashnode.dev/how-to-keep-a-pylon-knowledge-base-accurate</link><guid isPermaLink="true">https://ekline.hashnode.dev/how-to-keep-a-pylon-knowledge-base-accurate</guid><category><![CDATA[documentation]]></category><category><![CDATA[technical writing]]></category><category><![CDATA[knowledge management]]></category><dc:creator><![CDATA[Alisa Hester]]></dc:creator><pubDate>Fri, 23 Oct 2026 16:31:27 GMT</pubDate><enclosure url="https://ekline.io/assets/images/blog/pylon-knowledge-base-accurate-cover.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>A release renames a setting, but the help center still shows the old name and steps. Customers and Pylon's AI agent can then use the stale instructions. KB articles are <a href="https://kb.help.usepylon.com/articles/3127220247-what-sources-do-ai-features-have-access-to">one of the sources Pylon's AI features draw on</a>. Your support team may discover the mismatch only when a ticket or escalation arrives.</p>
<p>EkLine provides the accuracy workflow around that help center: scheduled agents draft missing or corrected articles from Pylon tickets, while a custom scheduled prompt can check the product changes you specify against relevant articles. Your team reviews the proposed changes and controls when they reach Pylon.</p>
<p>Keep the knowledge base under review from two directions. Tickets tell you what is missing or confusing. Releases tell you what may have become wrong. Start the release check from what is shipping and give each fix one named approver. Pylon's own guide recommends <a href="https://www.usepylon.com/blog/set-up-knowledge-base">updates with every significant product release and a quarterly audit of the full knowledge base</a>.</p>
<h2>TL;DR</h2>
<ul>
<li>Tickets show you which articles are missing or incomplete. Releases show you which articles became wrong. Each direction needs its own check.</li>
<li>Pylon provides ticket-based gap signals. Add release context to find articles affected by changes before the next support issue.</li>
<li>A release-time check starts from the list of user-facing changes, searches the help center for every old name and step, and gives each fix one approver before customers see the release.</li>
<li>Run three cadences with one owner: a weekly ticket check, a check for every release, and a quarterly sweep.</li>
</ul>
<h2>Tickets show what is missing, releases show what became wrong</h2>
<p>A knowledge base fails customers in two ways. In the first, the article was never written, and customers keep asking a question the help center does not answer. Your ticket queue shows this well, because repeat questions are the signal. EkLine has written about how <a href="https://ekline.io/blog/your-support-tickets-are-a-documentation-backlog-in-disguise">your support tickets are a documentation backlog in disguise</a>.</p>
<p>In the second, the article was right when you published it and a release changed the product underneath it. A support ticket may arrive later, when a customer follows the old steps and they fail. If that article is available to an AI agent, stale instructions can also enter its answers before your team notices.</p>
<p>In a <a href="https://slite.com/learn/dangers-of-stale-documentation">Slite survey of 143 founders, operators, and engineers about internal docs</a>, 41% of respondents who had seen an AI tool surface a stale document and produce a wrong answer said the wrong information had reached a customer. That is a reported experience within Slite's survey group, not an industry-wide failure rate.</p>
<p>Support teams have described release maintenance as manual work. In an <a href="https://community.intercom.com/ideas/product-release-intake-auto-flag-impacted-help-center-articles-and-update-fin-s-knowledge-14314">Intercom community feature request</a>, Audrey Ware asked for release notes to identify affected articles and suggest edits. Cassie Penatzer's April 16, 2026 reply described the time spent finding those articles. This is practitioner evidence of the task, not proof that the vendor still lacks a solution: Intercom now documents <a href="https://www.intercom.com/help/en/articles/14707198-fin-operator-explained">Fin Operator's product-update-to-article workflow</a>, with proposed changes reviewed before they go live.</p>
<h2>How EkLine runs the accuracy workflow</h2>
<p>EkLine connects ticket evidence, specified product changes, and reviewable knowledge-base edits in one accuracy workflow. Use the ticket template for recurring gap discovery and configure the release check for the changes your team needs to validate.</p>
<p>For the ticket side, the <a href="https://docs.ekline.io/agent/scheduled-agents/">Improve Pylon knowledge base scheduled agent</a> reviews recent Pylon tickets for questions that the knowledge base should have answered, then drafts missing or corrected articles for review. This template delivers knowledge-base drafts in Slack by default rather than repository changes. Review its prompt and notification settings before enabling it.</p>
<p>For the release side, configure a custom scheduled prompt. Each run executes the prompt against your connected repository. Specify the release context, managed Pylon articles, and draft output you want; the knowledge-base management guide illustrates a related check by comparing a billing FAQ with the latest pricing page. Set a recurring cadence, or use Run now before a release. Treat this as a configured workflow to test, not an automatic release-event trigger or a claim that the ticket template checks code.</p>
<p>Keep publication approval with a named person. In the <a href="https://docs.ekline.io/agent/manage-knowledge-base/">documented knowledge-base workflow</a>, review the diff under View All Changes, then use Update KB to write the edits back. That action immediately changes a live article's content; for Pylon it does not change the article's published or unpublished status. Setup requires Docs Agent and knowledge-base management access, a Pylon API token, selected managed knowledge bases, editing permission, and a Default author for new articles.</p>
<p>Before: the support lead reads tickets individually, chases the ship list, and searches for old setting names by hand. After: EkLine runs the configured ticket and release checks, drafts the corrections, and brings the changes to a reviewer. The reviewer checks each fix in View All Changes, and the authorized publisher uses Update KB. Pylon remains the article destination throughout.</p>
<p>The ticket template is documented for ticket review; do not assume it also audits releases or code. A release check depends on the context and managed articles you make available, and it needs a test run before you rely on it. Scheduled agents require Docs Agent and a connected repository. Knowledge-base management is available on request.</p>
<p>To evaluate this accuracy workflow, <a href="https://docs.ekline.io/agent/manage-knowledge-base/">follow the walkthrough for managing a Pylon knowledge base with EkLine</a>, then request access at <a href="mailto:support@ekline.io">support@ekline.io</a> with your organization name. Test one ticket batch and one release against a small set of managed articles before expanding the cadence.</p>
<h2>Pylon signals and publishing controls</h2>
<p>The table separates support-driven signals from the controls used to review and publish a correction. The release check connects the ship list to the articles that need to change.</p>
<table>
<thead>
<tr>
<th>Pylon feature</th>
<th>What starts it</th>
<th>What you get</th>
</tr>
</thead>
<tbody><tr>
<td><a href="https://docs.usepylon.com/pylon-docs/knowledge-base/missing-content">Missing Content</a> (under Insights)</td>
<td>A support agent sets an issue's Resource status to "Needs new article" or "Needs article update."</td>
<td>A queue where you select issues and generate drafts with Article Generation.</td>
</tr>
<tr>
<td>Topics</td>
<td>Common questions absent from connected documentation. Suggestions begin after 300 logged issues; this AI Assistant feature is available on select plans.</td>
<td>Topics marked "Missing resources," "Needs update," or "Up to date."</td>
</tr>
<tr>
<td><a href="https://support.usepylon.com/articles/9248149312-improvements-kcs-flow">Improvements</a></td>
<td>The AI agent's escalation reason, the issue topic, and how often it comes up.</td>
<td>A suggestion to write or update an article, with "AI suggested edits" you Accept or Reject.</td>
</tr>
<tr>
<td><a href="https://docs.usepylon.com/pylon-docs/knowledge-base/articles-and-collections/copilot">Article Generation and Copilot</a></td>
<td>An issue conversation for generation; selected article text for Copilot edits.</td>
<td>A solution article draft, warnings about similar articles, and AI assistance revising text.</td>
</tr>
<tr>
<td><a href="https://docs.usepylon.com/pylon-docs/knowledge-base/analytics">KB Analytics</a></td>
<td>Reader traffic, searches, and feedback.</td>
<td>Views, "Top searches with no results," feedback scores, and alerts to Slack or email.</td>
</tr>
<tr>
<td><a href="https://docs.usepylon.com/pylon-docs/knowledge-base/articles-and-collections/article-review">Article Review</a></td>
<td>An author clicks Request Review.</td>
<td>Approvals, requested changes, and inline comments.</td>
</tr>
<tr>
<td><a href="https://docs.usepylon.com/pylon-docs/knowledge-base/articles-and-collections/synced-blocks">Synced Blocks</a></td>
<td>An author embeds a shared block in several articles.</td>
<td>"Edit the block once, and every article that embeds it updates automatically."</td>
</tr>
</tbody></table>
<p>The first five rows use support activity or article usage; the last two cover review and shared edits. Pylon's <a href="https://usepylon.com/knowledge-base">knowledge base page</a> describes turning conversations across Slack, Microsoft Teams, email, and in-app chat into suggested articles and updates. Its AI resource access differs by feature: AI Assistants can use replies, internal notes, fields, KB articles, recordings, and training data; AI Agents use configured KB resources and selected training data, rather than historical issues. Pylon also supports <a href="https://usepylon.com/ai-agents/skills">configurable Skills with connected tools</a>. The workflow here assigns recurring, repository-grounded accuracy checks and managed-KB corrections to EkLine; it does not assume Pylon is limited to the signals in this table.</p>
<h2>Why ticket signals need release context</h2>
<p>The ticket-based checks above can already produce drafts and suggested edits. Missing Content collects issues that agents flag, while Improvements uses the AI agent's escalation reason, topic, and frequency to suggest article work. Reviewing another routine costs time, so each release check should name the changed behavior and the articles it needs to verify.</p>
<p>Use ticket evidence to prioritize corrections and release context to find affected pages that have not yet produced a support issue.</p>
<p>Those issue-based queues need support activity to supply evidence, while search and feedback reports need reader activity. An Improvements suggestion can follow an escalation; a Missing Content entry can follow a flagged issue. Topic suggestions begin after 300 logged issues and require an eligible plan. A zero-result search can expose missing terminology, but it does not identify every existing article with old instructions. A feedback score also depends on someone rating the page. These signals help prioritize work; they do not replace checking a known product change against affected content.</p>
<p>Pylon's guide recommends article updates with significant releases. To find affected content before customers encounter it, start the check from the release itself.</p>
<h2>How the release-time check works</h2>
<p><img src="https://ekline.io/assets/images/blog/pylon-knowledge-base-release-check.png" alt="Flow of five steps in the release-time check: get the ship list, list the old words, search the help center, assign one approver per fix, publish with the release" /></p>
<p>The release-time check, step by step.</p>
<p>The release check starts from the product change and looks for articles it may have made wrong. Run it for every release a customer can see, with enough time for review before rollout. The steps below define the check whether the team is testing an EkLine custom prompt or verifying its draft output.</p>
<ol>
<li>Get the list of user-facing changes before the release goes out, from the release notes, the changelog, or the product manager. In a <a href="https://community.intercom.com/knowledge-base-6/how-do-you-keep-your-faq-and-knowledge-base-accurate-releases-after-releases-7754">September 11, 2024 community reply</a>, Intercom's senior knowledge manager Beth-Ann described getting involved before shipping and typically receiving at least four weeks to prepare new content. That is a historical operating example, not a required lead time or a claim about Intercom's current process.</li>
<li>For each change, write down the old words customers would have read: setting names, button labels, menu paths, limits, and steps that moved or disappeared.</li>
<li>Search your help center for each old word and list every article that contains it. Check your Synced Blocks too, since one edit there updates every article that embeds the block.</li>
<li>Name one approver for each fix, usually the product manager or engineer who shipped the change, and add them as a reviewer under Review &amp; Publish if using Pylon's review flow. The author drafts the edit and clicks Request Review. Require review before publishing where appropriate, and check publishing permissions: Pylon allows reviewers with publishing permission to publish without a separate approval.</li>
<li>Publish the approved edits when the release reaches customers. <a href="https://knowmax.ai/feeds/blog/knowledge-lifecycle-management">Knowmax's knowledge-ops guidance</a> recommends reviewing content affected by launches, policy changes, pricing updates, or regulation within 24 to 48 hours after the change. Use publication with the release as the target for known changes, rather than treating that window as an acceptable delay for every update.</li>
</ol>
<p>Teams have done this by hand for years. In an <a href="https://blog.helpdocs.io/keeping-help-center-updated/">older HelpDocs roundup</a>, Front's support manager met the product team weekly and kept a running list of articles to update, while Wistia's team watched GitHub pull requests. In the 2024 Intercom reply above, Beth-Ann reported setting aside time from 13 support agents for product-change audits. These are historical examples of coordination work, not current staffing requirements. EkLine makes the repeated checks and draft preparation a configured routine, while the team retains review and release timing.</p>
<p>Keep the old words from each release on a running list. The next weekly ticket check can then show whether any article slipped through.</p>
<h2>Owners, cadence, and checkpoints</h2>
<p>Assign one knowledge-base owner to coordinate the routine and its reviewers. Knowmax's guidance recommends a named person responsible for each article's accuracy. One knowledge-base owner coordinates the three checks below; subject-matter reviewers own individual fixes.</p>
<table>
<thead>
<tr>
<th>Check</th>
<th>When</th>
<th>Inputs</th>
<th>Done when</th>
</tr>
</thead>
<tbody><tr>
<td>Ticket check</td>
<td>Weekly</td>
<td>Missing Content queue, Improvements suggestions, topics marked "Needs update," top searches with no results, feedback alerts</td>
<td>Each flagged issue has a draft, an approved edit, or a note that it is not knowledge base material</td>
</tr>
<tr>
<td>Release check</td>
<td>Every release with a user-facing change</td>
<td>Release notes, changelog, or the product manager's ship list</td>
<td>Every article that names a changed setting or step is updated, with one approver per fix, before customers see the release</td>
</tr>
<tr>
<td>Quarterly sweep</td>
<td>Every quarter</td>
<td>KB Analytics views and feedback scores, plus articles nobody touched since the last sweep</td>
<td>Every article has an owner and has been read against the current product</td>
</tr>
</tbody></table>
<p>The release and quarterly rows follow Pylon's recommended cadence; the weekly row makes ticket review repeatable. The release row explicitly starts from a known change before rollout, while the quarterly sweep checks the wider inventory. Knowmax also recommends periodic review of evergreen content, giving 90 days as an example. These are operating targets, not a guarantee that every mismatch will be found.</p>
<h2>One worked cycle</h2>
<p>Take one illustrative week. On Monday, the support lead reviews EkLine's scheduled ticket drafts alongside Missing Content, Improvements, and searches with no results. They check issues that agents flagged for article updates, use Article Generation where needed, and accept or reject suggested edits. Each correction gets an owner before it is published.</p>
<p>On Wednesday, a release will rename a setting. Earlier in the week, the product manager shares the ship list. The support lead gives EkLine's custom release check the changes and relevant managed articles, then runs it before rollout. The reviewer checks the drafts against the product and searches for the old name, including synced blocks. The product manager approves the corrections through the team's chosen review flow, and the authorized publisher applies the edits when the release reaches customers.</p>
<p>The next Monday, the ticket check also tests the release check. If a ticket still quotes the old setting name, the support lead investigates a missed article, a saved copy, or another source before deciding what to fix. If an article was missed, they correct it and add the search term or context that would have found it to the next run.</p>
<h2>FAQ</h2>
<h3>How do you know when a knowledge base article is outdated?</h3>
<p>Check from tickets and releases. A support agent can flag an issue for an article update, Improvements can identify articles needing revision from AI-agent experience, and readers can rate content unhelpful. Separately, a release can change a setting, label, or step that an article still describes. Checking the release before rollout gives the reviewer a chance to correct that mismatch before it produces a support issue.</p>
<h3>Can article view counts tell us which content needs updating?</h3>
<p>View counts help prioritize review, but they do not show whether instructions match the product. Pylon separates human and non-human traffic, so use the relevant traffic view when estimating customer exposure. Give heavily used articles priority in the quarterly sweep, and use release context to identify content affected by a specific change.</p>
<h3>How can AI improve my knowledge base?</h3>
<p>Pylon's Article Generation drafts from issues, Improvements suggests edits from AI-agent experience, and Topics groups uncovered questions. EkLine schedules drafts from ticket evidence and configurable checks against the product or release context you supply. Review the proposed fixes against that evidence before publishing; an AI system can use stale instructions if they remain in its accessible sources.</p>
<h3>Does EkLine replace Pylon?</h3>
<p>Pylon remains the destination where your team manages and publishes knowledge-base articles. EkLine replaces the fragmented accuracy work around it: reading ticket evidence, checking the product changes you specify, drafting corrections, and bringing those changes to a reviewer. Your team keeps publication control.</p>
<p>Start with one release and one named reviewer. Use the EkLine setup walkthrough above to connect the evidence, inspect the proposed corrections, and verify the updated Pylon articles after publication. Expand the cadence only after that cycle produces changes your team can review and trust.</p>
]]></content:encoded></item><item><title><![CDATA[AI Agent Pricing: What Should Count as a Billable Outcome?]]></title><description><![CDATA[Your agent retries a failed tool call, gets halfway through a workflow, hands the conversation to a person, and pays for inference at every step. Your…]]></description><link>https://ekline.hashnode.dev/ai-agent-pricing-billable-outcome</link><guid isPermaLink="true">https://ekline.hashnode.dev/ai-agent-pricing-billable-outcome</guid><category><![CDATA[Artificial Intelligence]]></category><category><![CDATA[SaaS]]></category><category><![CDATA[pricing]]></category><dc:creator><![CDATA[Alisa Hester]]></dc:creator><pubDate>Fri, 23 Oct 2026 16:19:08 GMT</pubDate><enclosure url="https://ekline.io/assets/images/blog/ai-agent-pricing-billable-outcome-cover.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Your agent retries a failed tool call, gets halfway through a workflow, hands the conversation to a person, and pays for inference at every step. Your customer looks at the same conversation and judges success by its own standard. When the invoice says "outcome" and nobody wrote down what that means, you get unpredictable invoices, disputes, and a margin you cannot forecast.</p>
<p>Write one auditable billable-event definition before you pick a rate. Choose an outcome unit only when completion can be observed, attributed, explained, and disputed under an agreed definition, at an operating cost you can accept. When it cannot, price an output your system observes, or a base fee with an allowance, and give the buyer spend controls.</p>
<p>The definition questions, record fields, and edge-case rules below are a proposed design. They are not a recognized standard, and they are not any vendor's policy or legal terms. Vendor rules and linked guidance were rechecked on October 21, 2026.</p>
<h2>TL;DR</h2>
<ul>
<li>Separate four layers: input cost, performed action, delivered output, and business outcome. Bill on a layer both sides can inspect.</li>
<li>Define the unit before the rate: success predicate, boundary, evidence, window, uniqueness, exclusions, reversal, inspection rights, and who settles disagreements.</li>
<li>Cost per attempt says little about cost per billable outcome. In the illustrative model below, $0.12 per attempt becomes about $2.89 per net billable outcome.</li>
<li>Seats, metered usage, and hybrid plans remain sound choices. Zendesk draws its outcome units from an allowance, and Intercom sets a minimum commitment for standalone Fin.</li>
<li>Before you set a price, replay recent task traces through the edge-case checklist.</li>
</ul>
<h2>Separate four layers before you pick a unit</h2>
<p>Scott Woody, identified in Stripe's October 1, 2026 post as Metronome's CEO and founder, <a href="https://stripe.com/blog/where-pricing-is-headed">splits AI pricing into three metrics on Stripe's blog</a>: inputs such as tokens, outputs that are objective and verifiable such as a generated image or a sent email, and outcomes, such as gains in revenue or pipeline and a reduction in customer churn. This post adds a fourth layer between input and output: the performed action.</p>
<table>
<thead>
<tr>
<th>Layer</th>
<th>What it is</th>
<th>Support-agent example</th>
</tr>
</thead>
<tbody><tr>
<td>Input cost</td>
<td>Tokens, compute, and tool calls, paid on every attempt</td>
<td>Model calls while drafting replies</td>
</tr>
<tr>
<td>Performed action</td>
<td>Something the agent did, as your logs record it</td>
<td>A ticket update, a task-complete flag</td>
</tr>
<tr>
<td>Delivered output</td>
<td>The result the customer asked for, checkable by both sides under a written rule</td>
<td>A conversation that meets the agreed resolution rule</td>
</tr>
<tr>
<td>Business outcome</td>
<td>The customer's own result, shaped by many causes</td>
<td>Lower churn, more pipeline</td>
</tr>
</tbody></table>
<p>An API call that succeeds, or a flag the agent sets on itself, shows that the agent acted. It does not show that the customer received value, so billing actions as outcomes is usage pricing with a misleading label. At the top layer, Woody identifies a measurement problem: agreeing on the result, detecting it, and separating your product's contribution from other causes.</p>
<h2>Compare the five units on the same criteria</h2>
<p>The alternatives a buyer already knows are seats, metered usage, and credits with an allowance. Intercom and Zendesk keep their outcome units next to those models. Zendesk <a href="https://support.zendesk.com/hc/en-us/articles/10479587390106-Managing-resolution-allowances">draws resolutions from an allowance</a>, and Intercom's <a href="https://www.intercom.com/pricing">pricing page</a> sets a minimum monthly commitment for standalone Fin. Salesforce <a href="https://www.salesforce.com/agentforce/pricing/">sells its agent product</a> as Flex Credits, a per-conversation price, and per-user add-ons and licenses.</p>
<table>
<thead>
<tr>
<th>Unit</th>
<th>Observability</th>
<th>Attribution</th>
<th>Buyer predictability</th>
<th>Implementation and dispute cost</th>
<th>Supplier unit economics</th>
</tr>
</thead>
<tbody><tr>
<td>Seats (status quo)</td>
<td>High: user count is known</td>
<td>Not needed</td>
<td>High</td>
<td>Low</td>
<td>Exposed when agent work per seat varies</td>
</tr>
<tr>
<td>Metered usage: tokens, calls, credits (status quo)</td>
<td>High: your own meters</td>
<td>Not needed</td>
<td>Low without caps</td>
<td>Medium: metering, deduplication, alerts</td>
<td>Tracks your cost closely</td>
</tr>
<tr>
<td>Actions or outputs</td>
<td>High when your system emits the event</td>
<td>Low risk</td>
<td>Medium</td>
<td>Medium: event definition, deduplication</td>
<td>On outputs, failed attempts are your cost; on actions, the buyer's</td>
</tr>
<tr>
<td>Outcomes</td>
<td>Depends on the evidence rule</td>
<td>High risk: people and other tools contribute</td>
<td>Medium to low</td>
<td>High: verification, reversals, disputes</td>
<td>Margin moves with the success rate</td>
</tr>
<tr>
<td>Hybrid: base fee plus allowance or credits</td>
<td>Inherits the inner unit</td>
<td>Inherits the inner unit</td>
<td>Higher: fixed base plus caps</td>
<td>Medium to high</td>
<td>Base fee covers fixed cost; overage covers variance</td>
</tr>
</tbody></table>
<p>The ratings are this post's assessment. They show a trade: the closer a unit sits to the customer's result, the better it tracks value and the more each charge costs to observe, attribute, and defend.</p>
<h2>Where each unit wins</h2>
<p>PricingOS <a href="https://www.pricingos.ai/en/blog/ai-agent-pricing-models">offers a decision path</a> that fits the table. It reserves outcome pricing for cases where success fits "one unambiguous sentence" and you can absorb the failures. When usage varies strongly across customers, it points to credits with a published conversion or usage with a spend cap. Seats remain the simplest sale when usage is stable and the agent is one feature among many. When buyers demand predictability and you need cost coverage, it recommends a hybrid of a base fee plus an allowance, with overage priced transparently.</p>
<p>Add one step to that path: when the customer's result is out of reach but your system emits a clear output, price the output. <a href="https://billingplatform.com/blog/ai-pricing-models-compared">BillingPlatform's comparison</a> draws the same line: its working examples share "a clean success signal that the AI system itself generates and the customer can verify."</p>
<h2>Define the unit before the rate</h2>
<p>PricingOS frames outcome pricing as defining, in writing, the single event that triggers a charge, in a way a customer will not dispute on an invoice. A billable-event definition that holds up answers nine questions:</p>
<ol>
<li><strong>Success predicate:</strong> the one sentence that says the unit happened. Brocoders <a href="https://brocoders.com/blog/outcome-based-pricing-architecting-agent-era/">asks whether "done" fits in one sentence</a> that a lawyer and an engineer would both sign off on.</li>
<li><strong>Unit boundary:</strong> what starts and ends one unit, such as a conversation, a ticket, or a job.</li>
<li><strong>Evidence source:</strong> the record that proves the predicate. <a href="https://flexprice.io/glossary/outcome-based-pricing-for-ai">Flexprice's glossary</a> says each verification signal needs "a timestamp and an actor so the charge survives a dispute."</li>
<li><strong>Observation window:</strong> how long you wait before an event becomes billable.</li>
<li><strong>Uniqueness:</strong> one identifier per unit, so a duplicate report bills once.</li>
<li><strong>Exclusions:</strong> the cases that never bill, written as a list.</li>
<li><strong>Reversal and dispute policy:</strong> what cancels a billed unit, until when, and how the credit appears.</li>
<li><strong>Inspection:</strong> which records behind each charge the buyer can see.</li>
<li><strong>Resolution:</strong> who settles a disagreement, and by when.</li>
</ol>
<h2>A billable-event record you can adapt</h2>
<p>The billable-event record stores those answers for each charge. The values below are invented placeholders and contain no customer data.</p>
<pre><code class="language-yaml"># Proposed billable-event record: an illustrative design, not a standard
event_id: evt_9a21_example        # unique; reused if the same event is reported again
task_id: task_7f3c
account_id: acct_example          # customer or account scope
outcome_type: ticket_resolved
definition_version: "2026-10-01"  # definition wording this event was judged against
success_evidence:
  method: customer_confirmation   # or system_check, no_follow_up_in_window
  ref: evidence/task_7f3c/final_turn
eligibility: eligible             # eligible | excluded
exclusion_reason: null            # for example greeting_only, default_escalation
occurred_at: "2026-10-14T09:12:05Z"   # UTC
observed_at: "2026-10-14T11:12:05Z"   # UTC, when the window closed
observation_window: PT2H          # ISO 8601 duration
status: billable                  # pending | billable | excluded | reversed
reverses_event_id: null           # on a reversal record, the event it cancels
credit_ref: null                  # link to the credit issued, if any
actor:
  completed_by: agent             # agent | human | agent_after_human
  human_touched: false
</code></pre>
<p><code>occurred_at</code> and <code>observed_at</code> separate when the work happened from when it became billable. <code>definition_version</code> ties each charge to the definition wording in force, which matters when you add outcome types later. <code>reverses_event_id</code> makes a reversal its own record, so the original stays intact for audit.</p>
<p><img src="https://ekline.io/assets/images/blog/ai-agent-pricing-billable-event-lifecycle.png" alt="Diagram of an example billable-event lifecycle: Attempted, where retries share one task_id, then Evidence recorded when the predicate is met, then Pending while the observation window is open, then Billable when the window closes. Attempted can branch to Excluded, not billed, for example a duplicate ID. Billable can branch to Reversed, credit issued, for example after a dispute." /></p>
<p>An example lifecycle: attempts, evidence, an observation window, then billing, with exclusion and reversal as the two exits.</p>
<h2>Test the definition against seven edge cases</h2>
<p>The example rules are this post's design choices. The last column describes a vendor's documented rule where one exists.</p>
<table>
<thead>
<tr>
<th>Case</th>
<th>Example rule</th>
<th>Treatment</th>
<th>Documented vendor rule</th>
</tr>
</thead>
<tbody><tr>
<td>Retries</td>
<td>All attempts share one <code>task_id</code>; retry cost stays with the supplier.</td>
<td>Part of the original unit</td>
<td>Intercom charges once for a conversation even when Fin performs several actions.</td>
</tr>
<tr>
<td>Duplicate delivery</td>
<td>A second copy with the same <code>event_id</code> is dropped.</td>
<td>Non-billable</td>
<td>Stripe tells you to use idempotency keys so a meter event is not reported more than once because of latency or other issues.</td>
</tr>
<tr>
<td>Partial success</td>
<td>Nothing bills unless the definition includes a smaller outcome type for the finished step.</td>
<td>Non-billable, or a new unit of a smaller type</td>
<td>Intercom does not bill when a technical error or logic issue prevents a Procedure from finishing.</td>
</tr>
<tr>
<td>Human handoff</td>
<td>A handoff the buyer configured as the result bills; an escalation because the agent failed does not. Record the actor.</td>
<td>New unit if configured; otherwise non-billable</td>
<td>Intercom bills a handoff that a Procedure calls for; default escalations are not charged.</td>
</tr>
<tr>
<td>Reopened task</td>
<td>A reopen inside the reversal window creates a reversal record, even after invoicing.</td>
<td>Pre-agreed credit</td>
<td>Intercom deducts a resolution when the customer returns to the same conversation for more help, including after the billing period changes.</td>
</tr>
<tr>
<td>Delayed outcome</td>
<td>The event stays pending until the window closes; evidence after a final invoice goes on the next one as an adjustment.</td>
<td>Part of the original unit, billed late</td>
<td>Zendesk evaluates email 72 hours after the first email, messaging 2 hours after the first message (adjustable up to 72 hours), and voice at hangup. Stripe may accept an event after an invoice is finalized without changing that invoice or adding it to the next one.</td>
</tr>
<tr>
<td>Disputed outcome</td>
<td>If the evidence fails the success predicate, the named reviewer issues a credit within the agreed time.</td>
<td>Pre-agreed credit</td>
<td>Zendesk has an LLM evaluate the conversation text for a verified resolution. Its page gives no dispute rule.</td>
</tr>
</tbody></table>
<p>The Stripe late-event rule has a contract consequence. If <a href="https://docs.stripe.com/billing/subscriptions/usage-based/recording-usage-api">your billing system</a> can accept an event without changing either invoice, your billable-event definition needs its own rule for late evidence.</p>
<h2>What vendor definitions teach</h2>
<p>Intercom <a href="https://www.intercom.com/help/en/articles/8205718-fin-ai-agent-outcomes">defines a resolution</a> as counted when, after Fin's last answer, the customer either confirms the answer was satisfactory or "exits the conversation without requesting further assistance." <a href="https://support.zendesk.com/hc/en-us/articles/9570369117338-About-automated-resolution-tiers">Zendesk</a> hands the judgment to an LLM. If you also use these definitions to judge support quality, see this <a href="https://ekline.io/blog/evaluate-ai-support-quality-beyond-deflection-rate">comparison of vendor resolution definitions as quality metrics</a>.</p>
<p>Definitions also change. <a href="https://stripe.com/blog/economics-of-ai-monetization">Stripe's account</a> says Intercom's Fin first charged for each support conversation it resolved. When Fin expanded into work such as lead qualification, a support-only unit no longer described all the work customers bought, so Fin added more billable outcomes. The <code>definition_version</code> field is there for that day.</p>
<h2>Give the buyer a control surface</h2>
<p>In the same Stripe post, James Brown names the buyer's side of usage-based billing: customers "need to understand what drives usage, anticipate spend, set spend limits, and connect usage to value." Design spending caps, alerts, cost and usage visibility, spend estimates, audit records, and a way to contest an event.</p>
<p>Know whether each control warns or stops. In Stripe Billing, <a href="https://docs.stripe.com/billing/subscriptions/usage-based/alerts">usage alerts</a> notify you when a customer crosses a meter threshold, or trigger an invoice at a billing threshold; the alerts page does not describe either one as stopping usage. For accounts on Zendesk's resolution-allowance model, "Don't allow overage" pauses capabilities that require paid resolutions at the allowance limit. The setting cannot be changed for Forethought AI agents by Zendesk plans. Under the default, "Allow overage," agents keep serving customers and overage is billed monthly.</p>
<p>The cited cap and alert pages do not specify a complete billing rule for work already in progress at the limit. Pick one answer (finish and bill, finish and waive, or stop and exclude) and write it into the definition. Credit pools are another control: Stripe reports that Intercom's Fin lets customers commit to a pool of credits and draw it down across outcomes without forecasting each one.</p>
<h2>Model cost per billable outcome</h2>
<p>This model is illustrative: every input is an assumption chosen to show the method. The boundary is one task type for one month.</p>
<table>
<thead>
<tr>
<th>Line</th>
<th>Input</th>
<th>Result</th>
</tr>
</thead>
<tbody><tr>
<td>Tasks started</td>
<td>1,000 (assumed)</td>
<td>1,000</td>
</tr>
<tr>
<td>Evidenced completions</td>
<td>600 complete, 400 do not (assumed)</td>
<td>600</td>
</tr>
<tr>
<td>Attempts</td>
<td>Succeeded tasks average 1.3, failed tasks 2.5 (assumed)</td>
<td>1,780 attempts</td>
</tr>
<tr>
<td>Inference and tool calls</td>
<td>$0.12 per attempt (assumed)</td>
<td>$213.60, of which $120.00 (about 56%) goes to tasks that never complete</td>
</tr>
<tr>
<td>Reversals after reopen</td>
<td>60 completions (assumed)</td>
<td>540 net billable outcomes</td>
</tr>
<tr>
<td>Supplier-side human assists</td>
<td>150 at $2.50 (assumed)</td>
<td>$375.00</td>
</tr>
<tr>
<td>Disputes</td>
<td>30 at $15.00 (assumed)</td>
<td>$450.00</td>
</tr>
<tr>
<td>Verification</td>
<td>$0.02 per task (assumed)</td>
<td>$20.00</td>
</tr>
<tr>
<td>Fixed overhead</td>
<td>$500.00 (assumed)</td>
<td>$500.00</td>
</tr>
<tr>
<td>Total cost</td>
<td></td>
<td>$1,558.60</td>
</tr>
<tr>
<td>Inference per net billable outcome</td>
<td></td>
<td>about $0.40</td>
</tr>
<tr>
<td>Total cost per net billable outcome</td>
<td></td>
<td>about $2.89</td>
</tr>
<tr>
<td>Inference share of total cost</td>
<td></td>
<td>about 14%</td>
</tr>
</tbody></table>
<p>At $0.12 per attempt, the model still costs about $2.89 per net billable outcome, and disputes alone cost more than all the inference. It sets no price and claims no margin. Replace each input with numbers from your own traces.</p>
<h2>When you cannot observe the customer's business result</h2>
<p>You may not be able to observe the customer's business result, or prove your agent caused it. You can still bill a system-observable event that both sides agree, in advance, to inspect.</p>
<p>Woody's sales-agent example shows why. Charging on the revenue an agent generates, he writes, invites an argument about which part came from the software and which from the sales team. Intercom bills a resolution under a published rule, and revenue never enters it. Your job is to prove the evidence rule was met, under a rule the buyer saw before it signed.</p>
<h2>The case for keeping it simple</h2>
<p>Seats are easy to budget, and a long billable-event definition adds friction to every sales conversation. PricingOS still calls seats fine, and simplest to sell, when usage is stable and the agent is one feature among many.</p>
<p>Woody goes further, as one CEO's opinion: "For everyone else, outcome-based pricing is, for all intents and purposes, a myth." He ties the exceptions to monopoly-like power or a ticket price high enough to justify the cost of measuring outcomes.</p>
<p>A procurement-minded commenter, u/highfivesalute, <a href="https://www.reddit.com/r/AIAgentsInAction/comments/1x5qrhm/for_enterprise_ai_agents_what_would_you_rather/pgsyy11/">described the budgeting objection on October 15, 2026</a>: "Procurement answer: boring old predictable pricing." The commenter preferred an annual amount finance could plan around. This is one practitioner report, not evidence of what all buyers prefer.</p>
<p>If agent work per seat is stable, seats may be the right unit, and you do not need a billable-event definition at all. Where you do write one, the buyer needs to see only the predicate sentence, the exclusions, and the way to contest a charge.</p>
<h2>When outcome pricing is a poor fit</h2>
<ul>
<li>Your system cannot observe the business result.</li>
<li>Attribution is ambiguous because people and other tools contribute to the same result.</li>
<li>The feedback loop is long, so the result appears weeks after the work and the invoice.</li>
<li>Dispute cost is out of proportion to the value of each unit. In the model above, disputes cost $450.00 against $213.60 of inference.</li>
</ul>
<p>In those cases, price a system-observed output, or a hybrid of a base fee plus an allowance or credits, with spend controls.</p>
<h2>Publish the definition where buyers read it</h2>
<p>A billable-event definition settles disputes only if the buyer can find the current version. Intercom's billing rule, for example, is a public help article. Put your success predicate, exclusions, and reversal window on the pricing page and in a help article, and change both in the same release that changes <code>definition_version</code>. A stale pricing page reopens every dispute the definition was meant to close, and AI assistants that answer "how does this product bill?" can draw on those same public pages.</p>
<p>Keeping those pages current is a documentation problem. EkLine's Docs Agent <a href="https://docs.ekline.io/agent/prevent-documentation-drift/">comments on pull requests when it detects documentation impact</a> and can open a pull request with the documentation fix for your team to review.</p>
<h2>Replay your traces before you set a price</h2>
<ol>
<li>Choose one task type with recent volume.</li>
<li>Write its billable-event definition, the predicate sentence and the nine answers, and map it to the record fields.</li>
<li>Pull recent task traces you already have access to under your current agreements.</li>
<li>Replay each trace through the edge-case table and count how many land in each row: clean billable, retry, duplicate, partial, handoff, reopened, delayed, disputed, and unclassifiable.</li>
<li>Decide what must change before you bill on this unit: a missing evidence field, a window that is too short, an unwritten exclusion, or a unit that should be an output.</li>
<li>Publish the definition on your pricing page and in a help article, and update both whenever <code>definition_version</code> changes.</li>
</ol>
<p>If many traces land in the unclassifiable row, fix the definition before you choose the model and the price.</p>
<h2>FAQ</h2>
<h3>How do you verify an AI outcome?</h3>
<p>Check it against a written success predicate and a named evidence source inside an agreed observation window. Intercom counts a resolution when the customer confirms the answer or leaves without asking for more help. Zendesk has an LLM evaluate the conversation text. Record a timestamp, the actor, and an evidence link for each charge.</p>
<h3>Is outcome-based pricing better than token-based pricing for AI agents?</h3>
<p>Neither wins in general. Token pricing tracks your cost and leaves the buyer carrying retries and failed attempts. Outcome pricing moves that risk to you and works only when the outcome can be observed, attributed, and disputed under an agreed definition.</p>
<h3>Who gets credit when a human finishes the conversation?</h3>
<p>Decide in the contract and record the actor on every event. Intercom documents one split: a handoff that a customer-configured Procedure calls for is billable, and default escalations are not billed.</p>
<h3>What's the hardest part of implementing outcome-based pricing?</h3>
<p>Defining the event so it survives a dispute, then paying to run that definition. In this post's illustrative model, inference is about 14% of total cost, so model verification and disputes before you set a price.</p>
<h3>Does outcome-based pricing always work better than usage-based or per-seat pricing?</h3>
<p>No. PricingOS still calls seats fine, and simplest to sell, when usage is stable and the agent is one feature among many, and Metronome's Scott Woody argues outcome pricing works only in a very limited set of circumstances. Outcome units fit when completion is discrete and system-observable.</p>
]]></content:encoded></item><item><title><![CDATA[What Is LFM2.5-24B-A2B, and Can It Run Your Agent Locally?]]></title><description><![CDATA[Liquid AI released LFM2.5-24B-A2B on October 13, 2026, calling it "a 24B-parameter reasoning model with just 2B active parameters, built for fast, private…]]></description><link>https://ekline.hashnode.dev/what-is-lfm2-5-24b-a2b-run-your-agent-locally</link><guid isPermaLink="true">https://ekline.hashnode.dev/what-is-lfm2-5-24b-a2b-run-your-agent-locally</guid><category><![CDATA[AI]]></category><category><![CDATA[Machine Learning]]></category><category><![CDATA[llm]]></category><category><![CDATA[ai agents]]></category><dc:creator><![CDATA[Alisa Hester]]></dc:creator><pubDate>Fri, 23 Oct 2026 14:41:21 GMT</pubDate><enclosure url="https://ekline.io/assets/images/blog/what-is-lfm2-5-24b-a2b-cover.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p>Liquid AI <a href="https://www.liquid.ai/blog/lfm2-5-24b-a2b">released LFM2.5-24B-A2B on October 13, 2026</a>, calling it "a 24B-parameter reasoning model with just 2B active parameters, built for fast, private agents on-device." If your product has a local or customer-hosted option, someone has probably asked whether this model can power it. So far the evidence is vendor benchmarks and a handful of user reports on speed and reliability.</p>
<p>Here is the short answer. By our arithmetic, a 4-bit build needs about 14 to 17 GB for the weights plus the conversation cache, at 32K to 131K tokens of context. That is before runtime overhead, the operating system and your agent harness. A machine with 24 GB available to the model has room for it. On a 16 GB machine, almost nothing is left for the rest.</p>
<p>Only a test on your own hardware shows whether it runs your agent. Today's evidence is vendor-run benchmarks and launch-week anecdotes, and we found no independent reproduction. So the sensible verdict for now is to test it. Base the decision on four checks on the target machine: memory at your real context length and concurrency, runtime support, tool-call reliability, and completed tasks.</p>
<h2>TL;DR</h2>
<ul>
<li>Memory follows all 24.0B weights plus a cache that grows with context length and parallel sessions. The 2.45B active count does not shrink it.</li>
<li>Our calculation: a 4-bit file plus a 16-bit cache comes to 14.27 to 17.18 GB for one session at 32,768 to 131,072 tokens of context, before overhead.</li>
<li>Runtime builds matter. MLX, Ollama and llama.cpp each have a version or flag requirement for this model family.</li>
<li>Tokens per second on a short prompt says little about finished tasks. A worksheet of real tool-using tasks on the target machine, with failure traces, tells you much more.</li>
<li>Local inference keeps the model on the device. Retrieval, web search, MCP servers, other tools and harness telemetry are separate data paths.</li>
</ul>
<h2>What the model is</h2>
<p>Liquid calls it "the largest and final model in the LFM2.5 family." The <a href="https://huggingface.co/LiquidAI/LFM2.5-24B-A2B">model card</a> lists 24.0B total parameters and 2.45B active. The launch post rounds the active count to 2B. The context window is 131,072 tokens.</p>
<p>It is a mixture-of-experts model. Each MoE block holds 64 experts, and each token routes through 4 of them. The configuration also declares two dense layers. That keeps compute per token small, and Liquid credits the model's speed to that small active count. Thirty of its 40 layers are short convolution blocks and only 10 are attention layers. That split matters for memory, as the next section shows.</p>
<p>The active count describes compute, and memory is a separate bill. The next token can route to different experts, so runtimes normally keep every expert loaded. Plan memory for all 24B weights.</p>
<h2>How much memory it needs (our calculation)</h2>
<p>Memory has three parts, and each moves for a different reason. We calculated the figures below with Python from Liquid's published files and config. We did not measure them on hardware.</p>
<h3>Weights and quantization</h3>
<p>Quantization stores each weight in fewer bits, and it is the biggest lever you have. Liquid's <a href="https://huggingface.co/LiquidAI/LFM2.5-24B-A2B-GGUF/tree/main">official GGUF files</a> are the format llama.cpp and Ollama load. They range from 13.6 GB at 4 bits to 48 GB at BF16, the full 16-bit precision. The <a href="https://huggingface.co/LiquidAI/LFM2.5-24B-A2B-MLX-4bit/tree/main">MLX 4-bit files</a>, for Apple's MLX runtime, are about the same size as the 4-bit GGUF. File size sets the floor for runtime memory. Everything else comes on top.</p>
<h3>Cache, context length and parallel sessions</h3>
<p>The KV cache is the memory that holds the conversation so far. It grows with every token in the context and with every session that runs in parallel. Only the 10 attention layers keep one, which is why this model's cache stays small. If all 40 layers were attention layers, the cache at full context would be four times as large.</p>
<p>Four parallel sessions at 32,768 tokens need the same cache as one session at 131,072 tokens. Count sessions as carefully as context length.</p>
<p>For implementers: the <a href="https://huggingface.co/LiquidAI/LFM2.5-24B-A2B/blob/main/config.json">config.json</a> gives 8 KV heads, a hidden size of 2048 and 32 attention heads. It lists no head dimension, so we assumed 64 (2048 divided by 32). At 16 bits per value, that is 2 (K and V) × 10 layers × 8 heads × 64 × 2 bytes, or 20,480 bytes per token.</p>
<h3>Runtime overhead</h3>
<p>We did not estimate runtime overhead or compute buffers. We also left out the operating system, other apps, the agent harness, the small fixed convolution state, and any embedding or tool server. Measure those on the target machine.</p>
<table>
<thead>
<tr>
<th>Weights file</th>
<th>File size (GB)</th>
<th>Weights + 16-bit cache, 32,768 tokens (GB)</th>
<th>Weights + 16-bit cache, 131,072 tokens (GB)</th>
</tr>
</thead>
<tbody><tr>
<td>QAD-Q4_0</td>
<td>13.6</td>
<td>14.27</td>
<td>16.28</td>
</tr>
<tr>
<td>Q4_K_M</td>
<td>14.5</td>
<td>15.17</td>
<td>17.18</td>
</tr>
<tr>
<td>Q5_K_M</td>
<td>17</td>
<td>17.67</td>
<td>19.68</td>
</tr>
<tr>
<td>Q6_K</td>
<td>19.7</td>
<td>20.37</td>
<td>22.38</td>
</tr>
<tr>
<td>Q8_0</td>
<td>25.5</td>
<td>26.17</td>
<td>28.18</td>
</tr>
<tr>
<td>BF16</td>
<td>48</td>
<td>48.67</td>
<td>50.68</td>
</tr>
</tbody></table>
<table>
<thead>
<tr>
<th>Context length (tokens)</th>
<th>16-bit cache, one session (GB)</th>
<th>8-bit cache, one session (GB)</th>
</tr>
</thead>
<tbody><tr>
<td>8,192</td>
<td>0.17</td>
<td>0.08</td>
</tr>
<tr>
<td>32,768</td>
<td>0.67</td>
<td>0.34</td>
</tr>
<tr>
<td>131,072</td>
<td>2.68</td>
<td>1.34</td>
</tr>
</tbody></table>
<p>Assumptions for both tables: head dimension 64 (derived), decimal GB, one session, and about 1 byte per value for the 8-bit cache. They exclude runtime overhead, the operating system and the harness. We calculated these figures and did not measure them.</p>
<p>Read the tables this way: quantization moves the total by tens of gigabytes, and context length moves it by about 2 GB at 4 bits.</p>
<p>A third-party calculator on <a href="https://llmrun.dev/model/liquidai-lfm2-5-24b-a2b">llmrun.dev</a> adds an overhead term and lands close to our figures, at 17.4 GB for Q4_K_M at full context. Neither the launch post, the model card nor the docs page gives a minimum RAM or VRAM figure. Liquid's <a href="https://docs.liquid.ai/examples/agent-harnesses">agent-harness guide</a> suggests that memory-constrained machines "serve a smaller window such as 32K tokens, which is usually plenty for a single agent task." Its worked example uses a smaller LFM2.5 model.</p>
<h2>Runtime support and version gates</h2>
<p>Liquid's <a href="https://docs.liquid.ai/lfm/models/lfm25-24b-a2b">docs page for the model</a> covers Transformers, vLLM, SGLang, llama.cpp and MLX. The model card also lists LM Studio. Neither names Ollama, but Liquid has a separate <a href="https://docs.liquid.ai/deployment/on-device/ollama">Ollama page</a> with a version note for its mixture-of-experts models.</p>
<table>
<thead>
<tr>
<th>Runtime</th>
<th>What Liquid states</th>
<th>Note</th>
</tr>
</thead>
<tbody><tr>
<td>Transformers</td>
<td><code>transformers&gt;=5.0.0</code></td>
<td></td>
</tr>
<tr>
<td>vLLM</td>
<td><code>pip install -U vllm</code></td>
<td>No minimum version given</td>
</tr>
<tr>
<td>SGLang</td>
<td><code>sglang&gt;=0.5.10</code></td>
<td>Served with <code>--tool-call-parser lfm2</code></td>
</tr>
<tr>
<td>llama.cpp</td>
<td>A recent release, run with <code>--jinja</code></td>
<td>No minimum build given; older builds fall back to a generic tool-call parser</td>
</tr>
<tr>
<td>MLX</td>
<td><code>mlx-lm&gt;=0.32.0</code></td>
<td>Earlier versions route the experts incorrectly</td>
</tr>
<tr>
<td>Ollama</td>
<td>v0.17.1-rc0 or later for LFM MoE models</td>
<td>v0.17.0 fails to load the <code>lfm2moe</code> architecture</td>
</tr>
<tr>
<td>LM Studio</td>
<td>Listed on the model card</td>
<td>No version guidance found</td>
</tr>
</tbody></table>
<p>The Ollama page says "To run any LFM MoE model you specifically need v0.17.1-rc0 or later." The models it names as affected are older LFM2 MoE models, and the page is undated. The gate covers any LFM MoE model, and this model's config declares <code>lfm2_moe</code>. Plan for the gate, and confirm it on the exact build your customers will install.</p>
<p>A runtime can also break the agent loop by itself. One <a href="https://news.ycombinator.com/item?id=50097369">Hacker News commenter</a> ran Ollama on an AMD Ryzen 7 8745HS and found it was not caching the prompt, so every turn reprocessed the whole prompt. They concluded it would not work in an agentic loop in that state. Record the runtime build as carefully as the model file.</p>
<h2>How tool calls work and what your parser must handle</h2>
<p>The model card says that by default "LFM2.5 writes Pythonic function calls (a Python list between <code>&lt;|tool_call_start|&gt;</code> and <code>&lt;|tool_call_end|&gt;</code> special tokens)." You can ask for JSON function calls in the system prompt instead. The <a href="https://huggingface.co/LiquidAI/LFM2.5-24B-A2B/blob/main/chat_template.jinja">chat template</a> places tool definitions in the system prompt and opens every assistant turn with a <code>&lt;think&gt;</code> block. The card says the model always reasons before it answers. Raw generated output includes a reasoning block; a serving layer may parse or hide it before the harness receives the response.</p>
<p>Liquid's <a href="https://docs.liquid.ai/deployment/on-device/llama-cpp/function-calling">llama.cpp function-calling guide</a> says <code>--jinja</code> is mandatory, because it renders tool definitions through the chat template and turns on tool-call parsing. Its examples use a smaller LFM2.5 model. From the same guide, your harness needs to handle:</p>
<ul>
<li>several tool calls in one turn, because "LFM2.5 may request several calls at once"</li>
<li>unknown tool names and malformed arguments, returned to the model as an error in the tool result instead of crashing</li>
<li>a limit on the number of steps</li>
<li>a short tool list, since every tool adds prompt tokens on every turn. The guide prefers 3 to 8 well-described tools over 30 vague ones.</li>
</ul>
<h2>Six things "good enough" can mean</h2>
<p>"Good enough for agents" bundles six separate properties. Launch-week reports mostly measure token throughput, which is the property least tied to finished tasks.</p>
<table>
<thead>
<tr>
<th>Property</th>
<th>What it tells you</th>
<th>Evidence today</th>
</tr>
</thead>
<tbody><tr>
<td>Token throughput</td>
<td>How fast text appears once decoding starts</td>
<td>Vendor laptop figures use llama.cpp, Q4_K_M and a 4K-token input context; <a href="https://news.ycombinator.com/item?id=50097369">user reports</a> with unstated quantization</td>
</tr>
<tr>
<td>Latency to completed work</td>
<td>Time to a correct, finished task, including prompt processing, retries and tool calls</td>
<td>No measurement found; one report of a runtime reprocessing the prompt each turn</td>
</tr>
<tr>
<td>Tool-call schema correctness</td>
<td>Whether calls parse and match the tool definitions</td>
<td>Vendor-run BFCLv4: 65.01 versus 65.00 for Qwen3.6-35B-A3B</td>
</tr>
<tr>
<td>Recovery from failed tools</td>
<td>Whether the agent corrects course after a tool error</td>
<td>No measurement found; Liquid advises returning errors to the model</td>
</tr>
<tr>
<td>Multi-step task success</td>
<td>Whether the whole task finishes</td>
<td>No independent benchmark found; one <a href="https://news.ycombinator.com/item?id=50097369">user reports</a> it "got stuck on a lot of tool calls"</td>
</tr>
<tr>
<td>Coding quality</td>
<td>Whether it writes and edits code well</td>
<td>Liquid says larger models keep an edge on coding benchmarks such as SWE-Bench Verified (OpenCode)</td>
</tr>
</tbody></table>
<h2>The case for adopting now, and its limits</h2>
<p>The case for adopting has real evidence behind it. Liquid reports the model "decodes 184 tokens/s on an Apple M5 Max and 114 tokens/s on an AMD Ryzen AI Max+ 395."</p>
<p>On agentic benchmarks that Liquid ran itself, it scores 27.69 on AutomationBench, against 8.72 for Qwen3.6-35B-A3B. The card recommends it for agents that reason, call tools and run on the device. <a href="https://news.ycombinator.com/item?id=50097369">Hacker News commenters</a> also report high local decode speeds, such as 200 to 320 tokens per second on a 5070 Ti in llama.cpp.</p>
<p>Each piece has a limit. Liquid's model card discloses the laptop test settings: Pipette benchmarking infrastructure, llama.cpp, Q4_K_M quantization and a 4K-token input context. Its separate GPU throughput test used 1,024 input tokens and up to 256 output tokens, far shorter than an agent's accumulated context. The benchmarks are vendor-run, and we found no independent reproduction. The same post says larger models keep an edge on knowledge-heavy and coding benchmarks. The card calls the model "not recommended for knowledge-heavy tasks on its own" and suggests pairing it with retrieval or web search. User reports split between speed and reliability. This evidence puts the model on your test list. Shipping it needs results from your own tasks.</p>
<h2>The evaluation worksheet</h2>
<p>Run each task several times on the target machine and fill in every column. Hold these constant across comparisons: tasks, prompts, tool definitions, runtime build, quantization, context setting, sampling settings and machine. If one of them changes between runs, you are comparing setups, not models.</p>
<p>The rows below are illustrative examples to adapt to your product. They are not results. The measured columns stay empty until you run the tasks.</p>
<table>
<thead>
<tr>
<th>Task</th>
<th>Required tool</th>
<th>Expected output</th>
<th>Pass/fail criteria</th>
<th>Retries</th>
<th>Latency to completed task</th>
<th>Peak memory</th>
<th>Failure trace</th>
</tr>
</thead>
<tbody><tr>
<td>Answer from a local file</td>
<td>File read</td>
<td>Answer matching the file</td>
<td>Reads the right file; no invented content</td>
<td>Up to 2</td>
<td>Record</td>
<td>Record</td>
<td>Raw output and parser result</td>
</tr>
<tr>
<td>Fetch two records in one turn</td>
<td>Lookup, twice</td>
<td>Both records in one reply</td>
<td>Harness runs both calls; reply uses both</td>
<td>Up to 2</td>
<td>Record</td>
<td>Record</td>
<td>Raw tool-call list</td>
</tr>
<tr>
<td>Recover from a bad argument</td>
<td>Tool that returns an error</td>
<td>Corrected call or clear stop</td>
<td>Fixes it or stops within the step limit</td>
<td>Step limit</td>
<td>Record</td>
<td>Record</td>
<td>Error result and next turn</td>
</tr>
<tr>
<td>Long session near 32K tokens</td>
<td>Your usual tools</td>
<td>Completed task</td>
<td>No repetition loop; task completes</td>
<td>Up to 1</td>
<td>Record</td>
<td>Record</td>
<td>Last turns before failure</td>
</tr>
<tr>
<td>Knowledge-heavy question</td>
<td>Retrieval or search</td>
<td>Answer from retrieved text</td>
<td>Calls search instead of answering from memory</td>
<td>Up to 2</td>
<td>Record</td>
<td>Record</td>
<td>Whether search was called</td>
</tr>
</tbody></table>
<p>Record peak memory with your harness and tool servers running, because that whole stack has to fit. Keep failure traces whole. They show whether the model, the parser or the runtime broke.</p>
<h2>Local inference does not make the agent local</h2>
<p>Running the weights on a laptop or a customer server keeps inference there, and only inference. The card suggests pairing the model with retrieval or web search, and each of those is a data path. So is every MCP server and tool the harness calls, and any telemetry the harness sends. We did not review any harness's telemetry, so check each harness's own documentation.</p>
<p>If the agent calls hosted services, it still needs credentials for them, and the questions in <a href="https://ekline.io/blog/oauth-for-ai-agents">OAuth for AI agents</a> still apply. One Hugging Face user <a href="https://huggingface.co/LiquidAI/LFM2.5-24B-A2B/discussions/9">reported the model insisting it was a cloud model</a> while it used local tools, so do not rely on the model to tell you where your data goes.</p>
<h2>License: read the revenue threshold</h2>
<p>The card lists the license as lfm1.0, the <a href="https://www.liquid.ai/lfm-license">LFM Open License v1.0</a>. It defines "Threshold" as "annual revenue of 10 million United States dollars ($10,000,000) or more." Commercial use by a legal entity above that threshold is not licensed under the agreement. The page shows no effective date.</p>
<p>One <a href="https://news.ycombinator.com/item?id=50097369">Hacker News commenter</a> called it "a questionably-enforceable non-commercial use clause," which does not match the revenue-threshold wording. For a customer-hosted option, ask who the licensee is and whose revenue counts. Have counsel read the license before you ship. This is not legal advice.</p>
<h2>What early reports cannot establish</h2>
<p>Launch-week reports show which questions to test. They cannot show how often a problem occurs or how the model performs on your workload.</p>
<ul>
<li>Speed reports come from single users who did not state the quantization. One <a href="https://news.ycombinator.com/item?id=50097369">reported 94.74 tokens per second</a> on an M4 Pro Mac mini with 64 GB, from a single prompt.</li>
<li>Reliability reports mix runtimes, and none states the quantization. One user on a 32 GB M5 MacBook Pro <a href="https://huggingface.co/LiquidAI/LFM2.5-24B-A2B/discussions/9">reported repetitive loops</a> around 32,000 tokens while using about 16 GB of RAM. The runtime and quantization were not stated.</li>
<li>Some reports use hosted endpoints. The <a href="https://news.ycombinator.com/item?id=50097369">stuck tool calls report</a> ran through OpenRouter in OpenCode, so it says nothing about a local quantization.</li>
<li>The laptop speed figures use disclosed settings: llama.cpp, Q4_K_M and a 4K-token input context. They do not measure completed agent tasks, and we found no independent reproduction of the benchmarks.</li>
</ul>
<p>For another model launch read with the same caution, see <a href="https://ekline.io/blog/gemini-4-argon">Gemini 4 Argon: what it does and where it falls short</a>. Treat each early report as a row to add to your worksheet.</p>
<h2>Adopt, test or defer</h2>
<p>Set your pass rate and memory headroom before you run the worksheet. Then apply these criteria.</p>
<table>
<thead>
<tr>
<th>Verdict</th>
<th>Criteria</th>
</tr>
</thead>
<tbody><tr>
<td>Adopt</td>
<td>Every must-pass task meets your pass rate across repeated runs on the target machine. Peak memory fits with headroom at the context and concurrency you will ship. The runtime build is pinned, counsel has read the license, and every external data path is reviewed.</td>
</tr>
<tr>
<td>Test (the default today)</td>
<td>The memory arithmetic fits and a supported runtime exists, but you have no task-suite results yet. Or the failure traces point to fixable parser, prompt or runtime issues.</td>
</tr>
<tr>
<td>Defer</td>
<td>Memory does not fit at the context and concurrency you need. Or your customers' runtime fails the version gate, your core tasks are knowledge-heavy or coding-heavy, counsel finds the threshold excludes you, or loops and stuck tool calls survive fixes.</td>
</tr>
</tbody></table>
<p>If your local option runs agent loops with a short tool list on a machine with 24 GB or more available to the model, put the model in your test queue now. If it mainly needs coding or broad knowledge without retrieval, keep the model you run today until independent results appear.</p>
<h2>FAQ</h2>
<h3>What hardware do you need to run LFM2.5-24B-A2B locally?</h3>
<p>Neither the launch post, the model card nor the docs page gives a minimum. By our calculation, a 4-bit GGUF file plus a 16-bit cache needs 14.27 to 17.18 GB for one session at 32,768 to 131,072 tokens of context. That excludes runtime overhead, the operating system and your harness. It points to a machine with about 24 GB available to the model at 4 bits. The BF16 weights alone are 48 GB.</p>
<h3>Is LFM2.5-24B-A2B worth running locally for agent workloads?</h3>
<p>It is worth testing. Liquid's speed figures and vendor-run agentic benchmarks are promising. We found no independent reproduction, and early user reports split between speed and reliability. Run a representative tool-using task suite on your target machine before you decide.</p>
<h3>Why does LFM2.5-24B-A2B say it is a cloud model?</h3>
<p>One Hugging Face user reported the model insisting it was a cloud model while it used local tools. The same user saw repetitive loops around 32,000 tokens. It is a single report, with runtime and quantization unstated. What the model says about itself does not tell you where your data goes.</p>
<h3>How does LFM2.5-24B-A2B tool calling work?</h3>
<p>By default the model writes Pythonic function calls as a Python list between special tokens. You can ask for JSON in the system prompt instead. In llama.cpp, Liquid says the <code>--jinja</code> flag is mandatory. Your harness should handle several calls in one turn and return an error for malformed arguments.</p>
<h2>Your next step</h2>
<p>Before you choose a deployment, write five or six representative tool-using tasks from your product. Run them on the target machine with a pinned runtime build, and record the failure traces. Liquid's guide to <a href="https://docs.liquid.ai/examples/agent-harnesses">running local agents with LFMs</a> shows how to point a harness at a local endpoint.</p>
]]></content:encoded></item><item><title><![CDATA[Your Support Tickets Are a Documentation Backlog in Disguise]]></title><description><![CDATA[The gap between what your support team knows and what your docs say is not a content problem. It is an operational one. Every ticket your team answers…]]></description><link>https://ekline.hashnode.dev/your-support-tickets-are-a-documentation-backlog-in-disguise</link><guid isPermaLink="true">https://ekline.hashnode.dev/your-support-tickets-are-a-documentation-backlog-in-disguise</guid><dc:creator><![CDATA[Alisa Hester]]></dc:creator><pubDate>Fri, 08 May 2026 14:38:00 GMT</pubDate><content:encoded><![CDATA[<p>The gap between what your support team knows and what your docs say is not a content problem. It is an operational one. Every ticket your team answers twice is a documentation update that never shipped.</p>
<p>P0 Security's engineering team was answering the same integration questions repeatedly. Customers would hit a gap in the docs, file a ticket, and an engineer would context-switch out of product work to write a response that should have been self-serve. Before they closed that loop, their docs repo averaged <a href="https://ekline.io/case-study/p0-security">2.7 commits per month</a> across 13+ integration guides. After: 42 merged documentation PRs, 110 hours of authoring replaced by 10 hours of review.</p>
<h2>The Cost of the Open Loop</h2>
<p>Support platforms like <a href="https://usepylon.com">Pylon</a>, <a href="https://intercom.com">Intercom</a>, <a href="https://plain.com">Plain</a>, and <a href="https://thena.ai">Thena</a> have gotten very good at managing conversations. Tagging, routing, SLA tracking, AI summaries. What they have not solved is the feedback loop: when a ticket reveals a documentation gap, who updates the docs?</p>
<p><a href="https://hbr.org/2017/01/kick-ass-customer-service">Harvard Business Review research</a> found that reducing customer effort is the single strongest driver of loyalty, yet most documentation teams operate reactively.</p>
<p>The cost compounds quickly:</p>
<table>
<thead>
<tr>
<th>Resolution Channel</th>
<th>Cost Per Resolution</th>
<th>Source</th>
</tr>
</thead>
<tbody><tr>
<td>Agent-assisted (B2B average)</td>
<td>\(18 - \)35</td>
<td><a href="https://www.lorikeetcx.ai/articles/customer-service-cost-per-ticket">Lorikeet CX</a></td>
</tr>
<tr>
<td>Self-service / documentation</td>
<td>\(1 - \)4</td>
<td><a href="https://livechatai.com/blog/customer-support-cost-benchmarks">LiveChat AI</a></td>
</tr>
<tr>
<td>Ticket deflection ROI (2,500 tickets)</td>
<td>~75%</td>
<td><a href="https://www.higherlogic.com/blog/ticket-deflection-metrics-community/">Higher Logic</a></td>
</tr>
<tr>
<td>Volume reduction (systematic doc updates)</td>
<td>20-30% per topic</td>
<td><a href="https://www.supportbench.com/feedback-loops-customer-success-can-influence-support-documentation/">SupportBench</a></td>
</tr>
</tbody></table>
<p>Here is what the ticket lifecycle looks like in most organizations:</p>
<pre><code class="language-plaintext">Customer hits doc gap
    ↓
Files support ticket
    ↓
Agent writes one-off answer
    ↓
Ticket closes
    ↓
Docs stay unchanged
    ↓
Next customer hits same gap
    ↓
Repeat ∞
</code></pre>
<p>If 30% of your tickets are questions your docs should already answer, you are spending thousands per quarter on a problem that documentation updates would eliminate.</p>
<h2>Three Components of a Closed Loop</h2>
<p>The support-to-docs loop has three components. Most teams have the first, some have the second, almost none have the third.</p>
<h3>Component 1: Signal Detection</h3>
<p>Identifying which tickets point to documentation gaps. Pylon does this well for Slack-based support, surfacing conversation patterns across channels. Intercom and Plain offer similar tagging and clustering. The tooling exists.</p>
<h3>Component 2: Prioritization</h3>
<p>Not every ticket is a documentation gap. Some are bugs. Some are feature requests. Some are edge cases that affect one customer. The signal needs filtering: which questions repeat, which affect onboarding, which block self-serve adoption?</p>
<h3>Component 3: Action</h3>
<p>This is where it breaks down. Someone needs to take the support answer, restructure it for a public audience, verify it against the current product state, and ship it as a documentation update. That "someone" is usually nobody.</p>
<p>Here is a YAML workflow that connects the signal to the action:</p>
<pre><code class="language-yaml"># support-to-docs triage template
name: Documentation gap triage
trigger: support_ticket_tagged_docs_gap
steps:
  - classify:
      type: [missing_page, incomplete_steps, outdated_content, wrong_example]
      affected_page: "URL or path of the doc that needs updating"
      frequency: "How many times this question appeared in last 30 days"
  - prioritize:
      score: frequency * customer_tier_weight
      threshold: 3  # Act on anything asked 3+ times
  - action:
      if_missing_page: "Create new doc from support answer template"
      if_incomplete: "Add missing steps from ticket resolution"
      if_outdated: "Flag for engineering review and update"
      if_wrong_example: "Replace with verified working example"
</code></pre>
<p>And here is how you might implement the prioritization scoring in Python:</p>
<pre><code class="language-python">from dataclasses import dataclass
from typing import Literal

DocGapType = Literal[
    "missing_page",
    "incomplete_steps",
    "outdated_content",
    "wrong_example",
]

TIER_WEIGHTS: dict[str, float] = {
    "enterprise": 3.0,
    "business": 2.0,
    "starter": 1.0,
    "free": 0.5,
}

@dataclass(frozen=True)
class DocGap:
    ticket_id: str
    gap_type: DocGapType
    affected_page: str
    frequency_last_30d: int
    customer_tier: str

    @property
    def priority_score(self) -&gt; float:
        weight = TIER_WEIGHTS.get(self.customer_tier, 1.0)
        return self.frequency_last_30d * weight

def filter_actionable(
    gaps: list[DocGap],
    threshold: int = 3,
) -&gt; list[DocGap]:
    """Return gaps that meet the frequency threshold, sorted by priority."""
    actionable = [g for g in gaps if g.frequency_last_30d &gt;= threshold]
    return sorted(actionable, key=lambda g: g.priority_score, reverse=True)

# Example usage
gaps = [
    DocGap("TICKET-101", "missing_page", "/docs/sso-setup", 8, "enterprise"),
    DocGap("TICKET-205", "incomplete_steps", "/docs/api-auth", 5, "business"),
    DocGap("TICKET-310", "wrong_example", "/docs/webhooks", 2, "starter"),
]

for gap in filter_actionable(gaps):
    print(f"{gap.affected_page}: score={gap.priority_score}, type={gap.gap_type}")
# /docs/sso-setup: score=24.0, type=missing_page
# /docs/api-auth: score=10.0, type=incomplete_steps
</code></pre>
<h2>How P0 Security Closed the Loop</h2>
<p>P0 Security had 13+ cloud integrations, each requiring step-by-step guides for configuring just-in-time access controls. Their documentation was sparse: <a href="https://ekline.io/case-study/p0-security">76 commits across 28 months</a>. When docs were incomplete, customers filed support tickets, and engineers lost 3 to 4 hours per guide writing documentation from scratch.</p>
<p>The fix was not hiring a technical writer. It was inserting a documentation layer into the existing PR workflow. Documentation PRs were created alongside feature PRs. Engineers went from writing docs (3 to 4 hours each) to reviewing docs (15 minutes each).</p>
<table>
<thead>
<tr>
<th>Metric</th>
<th>Before</th>
<th>After</th>
</tr>
</thead>
<tbody><tr>
<td>Docs commits/month</td>
<td>2.7</td>
<td>42 merged PRs total</td>
</tr>
<tr>
<td>Engineer time per guide</td>
<td>3-4 hrs (writing)</td>
<td>15 min (reviewing)</td>
</tr>
<tr>
<td>Total authoring hours</td>
<td>110 hrs</td>
<td>10 hrs of review</td>
</tr>
<tr>
<td>Median time-to-merge</td>
<td>Weeks</td>
<td>Under 1 day</td>
</tr>
<tr>
<td>Engineer reviewers</td>
<td>Ad-hoc</td>
<td>6 rotating, avg 5 comments/PR</td>
</tr>
</tbody></table>
<p>P0 Security's CTO, Greg Vishnepolsky, put it plainly: "On customer calls now, we can just say, 'look at our docs.' That's new for us."</p>
<h2>The Proactive Docs Advantage</h2>
<p>Three forces make the support-to-docs loop more valuable than ever.</p>
<p><strong>Support cost reduction.</strong> Every documentation update that prevents a future ticket pays for itself. If your average B2B ticket costs $22 and a single doc update prevents 5 tickets per quarter, the ROI is immediate and measurable.</p>
<p><strong>Onboarding velocity.</strong> Customers who can self-serve through accurate docs reach value faster. P0 Security's customers went from relying on support for integration configuration to following step-by-step guides that shipped with each new integration. Faster integration. Fewer tickets. The same engineers who used to write 3-to-4-hour guides are now reviewing them in 15 minutes.</p>
<p><strong>Answer engine visibility.</strong> <a href="https://www.frase.io/blog/what-is-answer-engine-optimization-the-complete-guide-to-getting-cited-by-ai">AI referral traffic to websites grew 527% year-over-year through mid-2025</a>. Documentation that answers the exact question a customer asked in a support ticket is the exact content AI answer engines prefer to surface. Your support tickets are literally telling you what to publish.</p>
<h2>Start This Week</h2>
<pre><code class="language-bash"># Step 1: Export and analyze your support data
# Group tickets by documentation page
# Threshold: 3+ tickets pointing to the same gap = first update

# Step 2: For each cluster, restructure the best support answer:
# - Direct answer first
# - Steps below
# - Context at the bottom

# Step 3: Publish as doc update, not blog post

# Step 4: Track going forward
# - Tag tickets that could have been self-serve
# - Count monthly
# - Measure ticket volume reduction per topic
</code></pre>
<p>The data is already in your ticketing system. The answers are already written. The only missing piece is the workflow that turns one into the other.</p>
<hr />
<p><em>Originally published at</em> <a href="https://ekline.io/blog/your-support-tickets-are-a-documentation-backlog-in-disguise?utm_source=hashnode&amp;utm_medium=crosspost&amp;utm_campaign=support-to-docs&amp;utm_content=support-tickets-documentation-backlog"><em>ekline.io</em></a><em>.</em></p>
]]></content:encoded></item><item><title><![CDATA[When Code Examples Lie, Money Moves Wrong]]></title><description><![CDATA[A developer copies a code example from your API docs. Changes the account ID. Updates the amount. Hits send. The money moves. To the wrong account. Using a…]]></description><link>https://ekline.hashnode.dev/when-code-examples-lie-money-moves-wrong</link><guid isPermaLink="true">https://ekline.hashnode.dev/when-code-examples-lie-money-moves-wrong</guid><dc:creator><![CDATA[Alisa Hester]]></dc:creator><pubDate>Thu, 12 Mar 2026 17:43:31 GMT</pubDate><content:encoded><![CDATA[<p>A developer copies a code example from your API docs. Changes the account ID. Updates the amount. Hits send.</p>
<p>The money moves. To the wrong account. Using a deprecated endpoint your docs still show as valid.</p>
<p>In a social media API, a wrong code example posts the wrong image. Embarrassing. Fixed in seconds. Nobody loses sleep.</p>
<p>In a financial services API, a wrong code example moves money. And "Ctrl+Z" is not a feature that banking infrastructure supports. Reversing a bank transfer isn't a rollback — it's a new transaction that requires the receiving party's cooperation and days of processing.</p>
<p>Let me be blunt: wrong API examples in fintech aren't documentation bugs. They're operational incidents waiting to happen. The only question is when.</p>
<h2>The Numbers Behind the Problem</h2>
<p>Code examples are the most critical — and most fragile — part of API documentation. The data makes this uncomfortably clear:</p>
<ul>
<li><p><strong>75% of production APIs</strong> have variances from their OpenAPI specifications. Not minor style differences — actual behavioral drift between what the docs say and what the API does. (<a href="https://nordicapis.com/most-apis-suffer-from-specification-drift/">Nordic APIs / APIContext</a>)</p>
</li>
<li><p><strong>70% of developers</strong> rate code examples as the single most important component of API documentation — above reference docs, above tutorials, above everything else. (<a href="https://idratherbewriting.com/blog/smartBear-2020-state-of-api-docs-review/">SmartBear 2020 State of API Report</a>)</p>
</li>
<li><p><strong>55% of teams</strong> struggle with inconsistent or outdated documentation, with context fragmented across Slack, Confluence, and email. (<a href="https://www.postman.com/state-of-api/2025/">Postman 2025 State of the API Report</a>)</p>
</li>
<li><p><strong>83% of developers</strong> consider documentation quality when evaluating whether to adopt an API. <strong>71%</strong> have chosen one API over another specifically because of superior documentation. (<a href="https://www.getmonetizely.com/articles/what-role-does-api-documentation-play-in-developer-conversion/">Monetizely</a>)</p>
</li>
</ul>
<p>So: three-quarters of APIs don't match their own docs. The thing developers trust most in those docs is code examples. And documentation quality is the deciding factor for the majority of API adoption decisions.</p>
<p>In fintech, this isn't an inconvenience. It's a liability with dollar signs.</p>
<h2>Why Code Examples Go Wrong (And Why It's Inevitable)</h2>
<p>API documentation doesn't go stale evenly. Conceptual guides and tutorials drift slowly — they use general language that stays roughly accurate even as the product evolves.</p>
<p>Code examples break fast. They contain specific endpoints, parameter names, field values, and response formats. When <em>any</em> of those change — and in an actively developed API, they change constantly — the example either stops working or, much worse, works but does something different than what the developer expects.</p>
<p>That second scenario is the one that should terrify you.</p>
<p>There are three ways this plays out, and each one is worse than the last:</p>
<p><strong>The endpoint changes. The example doesn't.</strong> Your payments team ships V3 of the transfers endpoint. The API reference gets updated. The four code examples scattered across your quickstart, integration guide, and two tutorials still point to V2. V2 still works — for now — so nobody notices. Meanwhile, a developer builds their entire integration on a deprecated path.</p>
<p><strong>A required field gets added. The example is suddenly lying.</strong> Your compliance team mandates a new purpose_code field on international transfers. The API now rejects requests without it. But the code example in your "Getting Started with International Transfers" guide doesn't include it. A developer copies the example, gets a 400 error, and starts debugging.</p>
<p><strong>Default values change. Nobody tells the developers.</strong> This is the one that makes my stomach drop. Your API used to default settlement_speed to "standard" (T+1). A product update changed the default to "instant". The code example doesn't specify the field because "the default is fine." It's not fine anymore. Now every developer who copies that example is getting instant settlement — with different fees — and doesn't know it.</p>
<img src="https://cdn.prod.website-files.com/674f4dbb460e6b522ae1a5b6/69b2c14003a674ceaaae8f69_how-examples-break.png" alt="" style="display:block;margin:0 auto" />

<h3>This isn't theoretical</h3>
<p><a href="https://forwardemail.net/en/blog/docs/paypal-api-disaster-11-years-missing-features-broken-promises">A detailed post-mortem of PayPal's API</a> documented endpoints listed in the official docs that simply didn't exist, webhook delays that went unmentioned, and aggressive session timeouts that forced merchants to discover limitations through trial and error — in production, with real transactions.</p>
<p>And it's not just fintech. When deprecated endpoints get forgotten in documentation, the consequences compound over time. <a href="https://blog.stoplight.io/deprecating-api-endpoints">In one healthcare case</a>, a deprecated SOAP endpoint remained accessible for six months while vulnerabilities were only patched in newer REST services. The old endpoint was forgotten in the documentation. By the time it was discovered, 450,000 patient records had been exposed.</p>
<h2>The Cost Isn't Developer Frustration. It's Everything Else.</h2>
<p>When a developer hits a wrong code example in a non-financial API, the cost is time. They debug, find the issue, work around it. Annoying, but contained.</p>
<p>In financial services, the costs don't add — they compound:</p>
<p><strong>Money moves.</strong> If a code example sends a test transaction to a production endpoint — because the docs don't clearly distinguish sandbox from production URLs — actual funds transfer. This is <a href="https://developer.squareup.com/docs/devtools/sandbox/overview">a persistent, documented problem across payment APIs</a>. Failed payments alone cost the global economy <a href="https://www.craftingsoftware.com/the-real-cost-of-failed-payments"><strong>\(118.5 billion annually</strong></a>. And <a href="https://www.moderntreasury.com/journal/what-is-the-difference-between-ach-returns-and-reversals">wire transfers cannot be reversed once processed</a> — even ACH returns carry <a href="https://stripe.com/resources/more/ach-returns-101-what-they-are-and-how-to-manage-them">\)15-$35 in fees per transaction</a>.</p>
<p><strong>Compliance exposure.</strong> <a href="https://www.archbee.com/blog/build-fully-compliant-fintech-api-documentation-or-pay-the-price">Over 60% of fintechs incurred compliance penalties of at least \(250,000</a>, with a third paying over \)500,000. <a href="https://www.bradley.com/insights/publications/2024/11/3-billion-td-bank-aml-settlement-is-a-wake-up-call-for-all-banks">TD Bank paid \(3.09 billion</a> after eight years of documentation/monitoring failures that enabled <a href="https://www.piranirisk.com/blog/what-the-td-bank-case-teaches-us-about-modern-aml-failures">\)600 million in money laundering</a>.</p>
<p><strong>Trust damage.</strong> <a href="https://www.getmonetizely.com/articles/what-role-does-api-documentation-play-in-developer-conversion/">71% of developers have chosen one API over another due to superior documentation</a>. Developers who successfully implement during evaluation are <a href="https://www.getmonetizely.com/articles/what-role-does-api-documentation-play-in-developer-conversion/"><strong>3.7x more likely to convert</strong></a>. A broken quickstart example eliminates that multiplier.</p>
<p><strong>Support escalation.</strong> Financial services average <a href="https://resolvepay.com/blog/statistics-indicating-api-downtimes-cost-to-finance-operations"><strong>$300,000+ per hour</strong></a> in API-related downtime costs, with 91% of mid/large enterprises exceeding this.</p>
<h2>The Pattern: Write Once, Pray Forever</h2>
<p>Here's how fintech API documentation actually works in practice:</p>
<img src="https://cdn.prod.website-files.com/674f4dbb460e6b522ae1a5b6/69b2c173619fdbab762887b9_write-once-pray-forever.png" alt="" style="display:block;margin:0 auto" />

<p>Here's how fintech API documentation actually works in practice: An engineer writes a feature, someone writes the docs and code examples, and on the day they're written, everything is accurate. Then the feature evolves over 6-12 months. The API reference gets updated — maybe. But the code examples scattered across guides and tutorials? Almost certainly not.</p>
<p>The scale is measurable. Fintech teams experience <a href="https://apidriftalert.com/complete-guide-to-fintech-api-reliability-solutions-in-2025/"><strong>3+ payment failures per month</strong></a> from unannounced API changes — each costing ~\(50,000. That's <strong>\)1.2 million per year per organization</strong>. And <a href="https://apidog.com/blog/fintech-api/">76% of failed API integrations</a> result from inadequate documentation or support.</p>
<h2>What the Best Fintech Platforms Do</h2>
<h3>They generate examples from the API itself</h3>
<p>Stripe <a href="https://brandur.org/fragments/stripe-codegen">built their SDK generation pipeline</a> on a Ruby DSL converted to OpenAPI specs, then auto-generated library code in multiple languages. They also <a href="https://stripe.com/blog/markdoc">built and open-sourced Markdoc</a>. Result: <a href="https://www.getmonetizely.com/articles/what-role-does-api-documentation-play-in-developer-conversion/">interactive examples see 62% higher engagement</a>.</p>
<img src="https://cdn.prod.website-files.com/674f4dbb460e6b522ae1a5b6/69b2c21eebcfce7e4e5cfe04_what-best-platforms-do.png" alt="" style="display:block;margin:0 auto" />

<h3>They auto-generate and test at scale</h3>
<p>Twilio <a href="https://www.twilio.com/en-us/blog/developers/new-era-for-twilio-documentation">migrated 5,000+ pages with Yoyodyne</a> — samples update automatically when API or codegen tool changes.</p>
<h3>They listen to how developers actually use examples</h3>
<p>Plaid <a href="https://plaid.com/blog/how-listening-to-developers-improved-our-api-docs/">discovered developers bypassed navigation for search</a> and expanded their search index by hundreds of entries.</p>
<h3>They use contract testing</h3>
<p><a href="https://swagger.io/blog/financial-orgs-embracing-api-contract-testing/">Over 65% of banks/fintechs report integration issues directly delay launches.</a> Contract testing via Pact catches breaking changes before production.</p>
<h3>They automate mechanical quality</h3>
<p>Tools like <a href="https://vale.sh/">Vale</a> (open source) or <a href="https://ekline.io/?utm_source=blog&amp;utm_medium=blog&amp;utm_campaign=fintech-meetup-mar26">EkLine</a> (managed, CI/CD integrated) handle style, links, and terminology automatically on every PR.</p>
<h2>The Business Case (for When Your CFO Asks)</h2>
<ul>
<li><p><strong>API downtime costs financial institutions</strong> <a href="https://resolvepay.com/blog/statistics-indicating-api-downtimes-cost-to-finance-operations"><strong>$152 million annually</strong></a> on average</p>
</li>
<li><p><strong>Every \(1 in docs quality saves ~\)4 in support costs</strong> (<a href="https://www.getmonetizely.com/articles/what-role-does-api-documentation-play-in-developer-conversion/">Monetizely</a>)</p>
</li>
<li><p><strong>Downtime costs Global 2000 companies</strong> <a href="https://www.splunk.com/en_us/newsroom/press-releases/2024/conf24-splunk-report-shows-downtime-costs-global-2000-companies-400-billion-annually.html"><strong>$400 billion annually</strong></a> — 9% of profits</p>
</li>
<li><p><a href="https://www.craftingsoftware.com/the-real-cost-of-failed-payments"><strong>60% of organizations lost customers</strong></a> due to failed payments; 20-40% quarterly subscriber churn</p>
</li>
</ul>
<img src="https://cdn.prod.website-files.com/674f4dbb460e6b522ae1a5b6/69b2c2790160542e6d11b52c_business-case.png" alt="" style="display:block;margin:0 auto" />

<h2>The Minimum Viable Safety Net</h2>
<p><strong>Week 1:</strong> Audit your quickstart. Fresh environment. Current sandbox. Note what's broken.  <br /><strong>Week 2:</strong> Fix the quickstart examples. Highest-traffic docs. Make them work.  <br /><strong>Week 3:</strong> Add example testing to CI for the quickstart. One file, one test.  <br /><strong>Week 4:</strong> Expand to top 5 integration guides. Set up freshness tracking.</p>
<img src="https://cdn.prod.website-files.com/674f4dbb460e6b522ae1a5b6/69b2c312da3384d0baf79bbd_four-week-plan.png" alt="" style="display:block;margin:0 auto" />

<h2>"Mostly Right" Is Not Right</h2>
<p>In most software, documentation that's 95% accurate is fine. In financial services, the 5% that's wrong is where someone loses money.</p>
<p>Your code examples are the most copied, most trusted, and most fragile part of your documentation. In fintech, they're also the most consequential. Treating them as testable, versionable, maintainable code — instead of as static text in a Markdown file — is the difference between documentation that works and documentation that creates incidents.</p>
<p>Outdated docs isn't a typo. It's a bug. And in fintech, that bug moves money.</p>
<p><em>We'll be at the Fintech Meetup at the end of March. If you're building a fintech developer platform and any of this hit a nerve, come talk to us about code example testing, documentation freshness, and keeping API docs honest.</em> <a href="http://ekline.io"><em>ekline.io</em></a> <em>or</em> <a href="mailto:support@ekline.io"><em>support@ekline.io</em></a><em>.</em></p>
]]></content:encoded></item></channel></rss>