<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Tanso</title>
    <description>The latest articles on DEV Community by Tanso (tanso).</description>
    <link>https://dev.to/tanso</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F12814%2Fed7788f7-dd36-446d-bfd8-f352a52bf0d8.png</url>
      <title>DEV Community: Tanso</title>
      <link>https://dev.to/tanso</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/tanso"/>
    <language>en</language>
    <item>
      <title>We open-sourced Tanso, a monetization engine for AI</title>
      <dc:creator>Kat Laszlo</dc:creator>
      <pubDate>Thu, 16 Jul 2026 03:48:54 +0000</pubDate>
      <link>https://dev.to/tanso/we-open-sourced-tanso-a-monetization-engine-for-ai-22gj</link>
      <guid>https://dev.to/tanso/we-open-sourced-tanso-a-monetization-engine-for-ai-22gj</guid>
      <description>&lt;p&gt;We open-sourced Tanso Core: a self-hosted monetization engine for B2B AI products. Usage metering, prepaid credits, entitlements, and Stripe billing in one Spring Boot service, with one property the rest of the stack doesn't have. Every metered event carries its cost.&lt;/p&gt;

&lt;p&gt;Repo: &lt;a href="https://github.com/tansohq/tanso-oss" rel="noopener noreferrer"&gt;https://github.com/tansohq/tanso-oss&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The gap
&lt;/h2&gt;

&lt;p&gt;If you sell an AI product today, your monetization stack is split across two categories of tools that don't talk to each other.&lt;/p&gt;

&lt;p&gt;Billing platforms meter usage and generate invoices, but they have no idea what your inference costs. They can tell you a customer consumed 40,000 events. They cannot tell you whether you made money on them.&lt;/p&gt;

&lt;p&gt;LLM observability tools know your costs down to the token, but they don't bill anyone. They can tell you a feature costs $0.038 per run. They cannot connect that to what the customer paid for it.&lt;/p&gt;

&lt;p&gt;So margin per customer, the number that decides whether your pricing works, lives in neither system. Most teams reconstruct it in a spreadsheet, quarterly, if at all.&lt;/p&gt;

&lt;p&gt;Tanso keeps both sides in one ledger. Every event you ingest records what you billed and what it cost you: input and output tokens, model, provider. Margin per customer, per feature, per model is a query, not a project.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it allows
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Enforcement at ingestion, not at invoice time.&lt;/strong&gt; Entitlement checks, usage caps, and credit limits are applied when the event comes in. If a customer is out of credits, the check fails now, not on a reconciliation job three weeks later. For AI products, where a runaway integration can burn real money in an afternoon, this is the difference between a limit and a suggestion.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Credits as a first-class primitive.&lt;/strong&gt; Prepaid credit pools per customer, with grants, deductions, expirations, and full transaction history. Most AI products end up selling some form of prepaid usage. Bolting that onto a subscription-shaped billing system is painful; here it's the core model.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stripe as a payment adapter, not the source of truth.&lt;/strong&gt; Billing state lives in Tanso. Stripe handles payments and invoicing. That inversion matters: your catalog, subscriptions, proration, and cycle rollover are in your database, inspectable and portable, not spread across webhook handlers trying to mirror someone else's state machine.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The usual platform pieces&lt;/strong&gt;, so you don't assemble them from scratch: multi-tenant accounts with role-based access, a product catalog with flat, usage-based, and graduated pricing, full subscription lifecycle with proration, idempotent high-throughput event ingestion.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;An MCP server, so agents can operate it.&lt;/strong&gt; This is the part I haven't seen anywhere else. Tanso ships an optional MCP server: agents can check credit balances, inspect entitlements, manage subscriptions, and pull billing insights through the same authenticated, account-scoped access as any other client. Tools that spend money or make hard-to-reverse changes (Stripe resources, billing operations, credit grants and deductions, subscription changes) require an explicit &lt;code&gt;confirmAction: true&lt;/code&gt; before they execute. Off by default, one YAML snippet to enable. If you believe agents are becoming a real share of software's users, your billing system needs a native, consented path for them, not a scraped one.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it's different from the alternatives
&lt;/h2&gt;

&lt;p&gt;Against hosted usage-based billing platforms: those are metering and invoicing businesses. They don't carry your cost side, so they can't answer margin questions, and your billing state lives in their cloud. Tanso is self-hosted, AGPL-3.0, and carries cost on every event, supplied by you or derived from plan rules, not bolted on through an integration.&lt;/p&gt;

&lt;p&gt;Against LLM observability tools: those tell you what you spent. They stop before the question that follows, which is what you charged, and whether the two are in the right order. Observability is input to pricing decisions; Tanso is the system that also enforces them.&lt;/p&gt;

&lt;p&gt;Against building it in-house: this is the version of in-house you were going to build anyway. Java 21, Spring Boot 3.5, PostgreSQL, Liquibase migrations, standard REST with OpenAPI docs. Boring on purpose. It runs anywhere you can run a container.&lt;/p&gt;

&lt;p&gt;One thing worth being explicit about: Tanso Core is a building block, not a platform you conform to. It's a standard Spring Boot codebase you fork and shape. Swap the payment provider, add your own meters, cut the modules you don't need. The value is starting from a working ledger with the hard parts done (idempotent ingestion, proration, credit accounting) instead of from an empty repo.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;Docker is the only prerequisite:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/tansohq/tanso-oss.git
&lt;span class="nb"&gt;cd &lt;/span&gt;tanso-oss/deploy
&lt;span class="nb"&gt;cp&lt;/span&gt; .env.example .env     &lt;span class="c"&gt;# set JWT_SECRET&lt;/span&gt;
docker compose up &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--build&lt;/span&gt;
./setup.sh               &lt;span class="c"&gt;# seeds a test account and prints credentials&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;API on &lt;code&gt;localhost:8080&lt;/code&gt;, docs at &lt;code&gt;/swagger-ui.html&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why open source
&lt;/h2&gt;

&lt;p&gt;Because a billing system is the one dependency you should be able to read. It holds your revenue, your customer balances, and the enforcement logic between your users and your margin. That code being inspectable and self-hostable isn't a distribution strategy, it's what I'd demand as a buyer. AGPL keeps it that way.&lt;/p&gt;

&lt;p&gt;If you're building an AI product and pricing it in credits or usage, I'd genuinely like to hear what breaks. Issues and PRs welcome: &lt;a href="https://github.com/tansohq/tanso-oss" rel="noopener noreferrer"&gt;https://github.com/tansohq/tanso-oss&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;And if you want help standing it up or customizing it for your own product, credit models, meters, billing rules, we do that. Reach out through the repo or find me at &lt;a href="https://tansohq.com" rel="noopener noreferrer"&gt;https://tansohq.com&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>stripe</category>
      <category>ai</category>
    </item>
    <item>
      <title>Track Your AI Costs Per Customer in One API Call</title>
      <dc:creator>Kat Laszlo</dc:creator>
      <pubDate>Wed, 25 Mar 2026 18:27:44 +0000</pubDate>
      <link>https://dev.to/tanso/track-your-ai-costs-per-customer-in-one-api-call-32c7</link>
      <guid>https://dev.to/tanso/track-your-ai-costs-per-customer-in-one-api-call-32c7</guid>
      <description>&lt;p&gt;If you're building on top of AI APIs, you're probably calling OpenAI, Anthropic, Cohere, and a few others depending on the task. Each one bills differently. Costs shift when model prices change. And at some point, someone asks: "Are we making money on this customer?"&lt;/p&gt;

&lt;p&gt;Without instrumentation, that question takes a day to answer. With it, it takes a query.&lt;/p&gt;

&lt;h2&gt;
  
  
  The problem
&lt;/h2&gt;

&lt;p&gt;You ship a feature. It works. Customers use it. Then pricing changes, or a customer's usage spikes, or you realize token costs for one feature are eating your margin on that plan tier.&lt;/p&gt;

&lt;p&gt;The issue isn't that you don't have cost data. Your AI provider invoices you every month. The issue is that data isn't broken down by your customers or your features. You see what you spent. You don't see what each customer cost you.&lt;/p&gt;

&lt;p&gt;To know your margin per customer, you need to capture cost at the moment the AI call happens, with context attached.&lt;/p&gt;

&lt;h2&gt;
  
  
  One event call
&lt;/h2&gt;

&lt;p&gt;After each AI API response, send one event to Tanso:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;http://localhost:8080/api/v1/client/events&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Authorization&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Bearer sk_test_67d9fb04f0344036ba92ecc973f1445a&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;eventIdempotencyKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;crypto&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;randomUUID&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="na"&gt;eventName&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;chat_completion&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;customerReferenceId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;cus_123&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;featureKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;ai_summarization&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;costInput&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="na"&gt;model&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;gpt-4o&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;modelProvider&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;openai&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="na"&gt;usageUnits&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;total_tokens&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;costAmount&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mf"&gt;0.05&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;A few things worth noting:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;eventIdempotencyKey&lt;/code&gt;&lt;/strong&gt; required. If the same event is sent twice (network retry, duplicate webhook), Tanso deduplicates silently. Use &lt;code&gt;crypto.randomUUID()&lt;/code&gt; per call, or derive it from your own request ID if you need stable deduplication.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;customerReferenceId&lt;/code&gt;&lt;/strong&gt; your customer's ID, whatever you already use. Tanso maps this to their account.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;featureKey&lt;/code&gt;&lt;/strong&gt; ties the event to a specific feature on the customer's plan. This is how Tanso separates cost for &lt;code&gt;ai_summarization&lt;/code&gt; from &lt;code&gt;document_export&lt;/code&gt; from &lt;code&gt;chat_completion&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;costAmount&lt;/code&gt;&lt;/strong&gt; dollars, not cents. Pass &lt;code&gt;0.05&lt;/code&gt;, not &lt;code&gt;5&lt;/code&gt; for 5 cents.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;code&gt;costInput&lt;/code&gt;&lt;/strong&gt; model and provider metadata. Used for cost attribution when you want Tanso to calculate costs from usage rather than passing them explicitly.&lt;/p&gt;

&lt;p&gt;That's it. No batch jobs. No ETL. No scraping provider invoices.&lt;/p&gt;
&lt;h2&gt;
  
  
  What you get
&lt;/h2&gt;

&lt;p&gt;Once events are flowing, Tanso aggregates them in real time by customer and feature.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Margin by customer.&lt;/strong&gt; You know what &lt;code&gt;cus_123&lt;/code&gt; costs you this billing period, broken down by feature. Compare that to what they're paying. That's your margin.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Margin by feature.&lt;/strong&gt; If &lt;code&gt;ai_summarization&lt;/code&gt; on your Starter plan is consistently underwater, you see it before it shows up as a bad quarter.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Usage against plan limits.&lt;/strong&gt; Tanso tracks &lt;code&gt;usageUnits&lt;/code&gt; against the feature's limit on the customer's plan. The entitlement check API (&lt;code&gt;POST /api/v1/client/entitlements/check&lt;/code&gt;) returns current usage and limit in real time, so you can gate access before a customer blows past their quota.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Automatic Stripe sync.&lt;/strong&gt; Events flow through to Stripe Billing Meters and land on the customer's next invoice. You don't manage the billing side separately.&lt;/p&gt;
&lt;h2&gt;
  
  
  Works from anywhere
&lt;/h2&gt;

&lt;p&gt;You don't need a dedicated service to send events. Tanso's event API is an HTTP POST. That means it works from:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Your backend&lt;/strong&gt; add the call after any AI API response&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Your terminal&lt;/strong&gt; curl for one-off testing or backfilling&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;An AI agent&lt;/strong&gt; Tanso exposes an MCP server, so Claude Code and other agents can instrument their own AI calls natively, or query cost data while they work
&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;curl &lt;span class="nt"&gt;-X&lt;/span&gt; POST http://localhost:8080/api/v1/client/events &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Content-Type: application/json"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-H&lt;/span&gt; &lt;span class="s2"&gt;"Authorization: Bearer sk_test_67d9fb04f0344036ba92ecc973f1445a"&lt;/span&gt; &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="s1"&gt;'{
    "eventIdempotencyKey": "550e8400-e29b-41d4-a716-446655440000",
    "eventName": "chat_completion",
    "customerReferenceId": "cus_123",
    "featureKey": "ai_summarization",
    "costInput": {
      "model": "gpt-4o",
      "modelProvider": "openai"
    },
    "usageUnits": 1847,
    "costAmount": 0.05
  }'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  Get started
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Get an API key from the &lt;a href="https://dashboard.tansohq.com" rel="noopener noreferrer"&gt;Tanso dashboard&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Configure a feature on your plan (e.g., &lt;code&gt;ai_summarization&lt;/code&gt;) with the expected pricing model&lt;/li&gt;
&lt;li&gt;Add the event call after each AI API response in your code&lt;/li&gt;
&lt;li&gt;Check the dashboard, cost and usage data appears immediately&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If you want to verify an event landed correctly, the dashboard shows raw event history per customer. You can also check a customer's current entitlement state at any time via the entitlement API.&lt;/p&gt;



&lt;p&gt;Tanso is built for teams shipping on top of multiple AI APIs who need to know their economics at the customer level, not just at the invoice level. The event API is the foundation. Everything else, entitlement checks, metered billing, plan enforcement, runs on the same data.&lt;/p&gt;

&lt;p&gt;Would love to hear if this is helpful or not. &lt;a href="https://cal.com/katrina-laszlo/meeting?duration=15&amp;amp;overlayCalendar=true" rel="noopener noreferrer"&gt;Happy to chat!&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The Docs:&lt;br&gt;
&lt;/p&gt;
&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;
    &lt;div class="c-embed__content"&gt;
      &lt;div class="c-embed__body flex items-center justify-between"&gt;
        &lt;a href="https://tanso-core.readme.io/reference" rel="noopener noreferrer" class="c-link fw-bold flex items-center"&gt;
          &lt;span class="mr-2"&gt;tanso-core.readme.io&lt;/span&gt;
          

        &lt;/a&gt;
      &lt;/div&gt;
    &lt;/div&gt;
&lt;/div&gt;



</description>
      <category>ai</category>
      <category>saas</category>
      <category>billing</category>
      <category>devops</category>
    </item>
    <item>
      <title>We built an MCP server so AI coding tools can set up your entire billing system</title>
      <dc:creator>Kat Laszlo</dc:creator>
      <pubDate>Wed, 18 Mar 2026 21:55:09 +0000</pubDate>
      <link>https://dev.to/tanso/we-built-an-mcp-server-so-ai-coding-tools-can-set-up-your-entire-billing-system-3npd</link>
      <guid>https://dev.to/tanso/we-built-an-mcp-server-so-ai-coding-tools-can-set-up-your-entire-billing-system-3npd</guid>
      <description>&lt;h1&gt;
  
  
  We built an MCP server so AI coding tools can set up your entire billing system
&lt;/h1&gt;

&lt;p&gt;Every AI and API company we've talked to ends up building the same internal system. Redis counters tracking credits. Cron jobs reconciling usage. If-statements scattered across the codebase gating feature access. It starts as a quick hack when you launch your first pricing tier and becomes a permanent headache every time pricing changes.&lt;/p&gt;

&lt;p&gt;Billing platforms like Stripe handle what happens after usage. They meter events, generate invoices, process payments. But nothing in that stack answers the question that matters at runtime: should this request be allowed to run?&lt;/p&gt;

&lt;p&gt;Does this customer have enough credits? Are they within their plan limits? Is this feature included in their subscription? That logic is still on your engineering team.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;That's what we built Tanso for.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One API call before the request runs. Subscription state, usage limits, and credit balance checked simultaneously. Allow or deny. If denied, no compute runs. No cost incurred. No surprise invoice.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// Check before running compute&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;isAllowed&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;tanso&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;entitlements&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;evaluate&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;customerReferenceId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cust_482&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;featureKey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ai-analysis&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;usage&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;usageUnits&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="c1"&gt;// Denied? No compute runs. No cost incurred.&lt;/span&gt;
&lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;isAllowed&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;403&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="c1"&gt;// Safe to run. This request is billable.&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;openai&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;chat&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;completions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The MCP server
&lt;/h2&gt;

&lt;p&gt;We shipped an MCP server with 34 tools so AI coding tools can configure the whole thing. Claude Code, Cursor, VS Code, Windsurf, and ChatGPT can:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Create plans with graduated pricing tiers&lt;/li&gt;
&lt;li&gt;Link features with usage limits and cost models&lt;/li&gt;
&lt;li&gt;Onboard customers and create subscriptions&lt;/li&gt;
&lt;li&gt;Check entitlements and ingest usage events&lt;/li&gt;
&lt;li&gt;Set up model-aware cost tracking for LLM spend&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No dashboard clicking required. Point your coding agent at the MCP and describe what you want.&lt;/p&gt;

&lt;p&gt;MCP config:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"mcpServers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"tanso"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"url"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"https://api.tansohq.com/mcp"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"headers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"X-API-Key"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"sk_live_your_api_key_here"&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We also have AI-native docs so coding agents can read the full API in context: &lt;a href="https://tansohq.com/llms-mcp.txt" rel="noopener noreferrer"&gt;https://tansohq.com/llms-mcp.txt&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  How it fits with Stripe
&lt;/h2&gt;

&lt;p&gt;Tanso plugs into your existing Stripe setup. You define plans and features in Tanso. Invoices push to Stripe. Payment status flows back automatically. Your payment processor still handles transactions. Tanso controls the pricing logic in your product.&lt;/p&gt;

&lt;h2&gt;
  
  
  What we're seeing
&lt;/h2&gt;

&lt;p&gt;Every team we talk to has some version of this held together with internal tools. The pattern is always the same:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ship a simple pricing tier&lt;/li&gt;
&lt;li&gt;Hardcode some limits&lt;/li&gt;
&lt;li&gt;Pricing changes, nothing updates&lt;/li&gt;
&lt;li&gt;Customers exceed limits, nobody notices until the invoice&lt;/li&gt;
&lt;li&gt;Spend weeks rebuilding&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;If that sounds familiar, we'd love to hear what you ended up building. What broke first?&lt;/p&gt;

&lt;p&gt;Self-serve is live with a free tier at &lt;a href="https://tansohq.com?utm_source=devto&amp;amp;utm_medium=blog&amp;amp;utm_campaign=mcp-launch" rel="noopener noreferrer"&gt;tansohq.com&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>mcp</category>
      <category>saas</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
