惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Cyberwarzone
Cyberwarzone
F
Full Disclosure
V
Visual Studio Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
有赞技术团队
有赞技术团队
J
Java Code Geeks
博客园 - 【当耐特】
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 叶小钗
L
LINUX DO - 最新话题
T
Threatpost
S
SegmentFault 最新的问题
Vercel News
Vercel News
云风的 BLOG
云风的 BLOG
C
Cyber Attacks, Cyber Crime and Cyber Security
Google DeepMind News
Google DeepMind News
Know Your Adversary
Know Your Adversary
S
Schneier on Security
V
Vulnerabilities – Threatpost
D
DataBreaches.Net
G
GRAHAM CLULEY
Latest news
Latest news
P
Privacy International News Feed
D
Darknet – Hacking Tools, Hacker News & Cyber Security
C
CXSECURITY Database RSS Feed - CXSecurity.com
Scott Helme
Scott Helme
L
Lohrmann on Cybersecurity
T
The Exploit Database - CXSecurity.com
Security Latest
Security Latest
G
Google Developers Blog
L
LangChain Blog
MyScale Blog
MyScale Blog
Project Zero
Project Zero
N
News and Events Feed by Topic
Hacker News - Newest:
Hacker News - Newest: "LLM"
大猫的无限游戏
大猫的无限游戏
P
Proofpoint News Feed
Blog — PlanetScale
Blog — PlanetScale
阮一峰的网络日志
阮一峰的网络日志
N
News | PayPal Newsroom
www.infosecurity-magazine.com
www.infosecurity-magazine.com
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
SecWiki News
SecWiki News
T
Tor Project blog
C
Check Point Blog
Google Online Security Blog
Google Online Security Blog
GbyAI
GbyAI
The Last Watchdog
The Last Watchdog
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
WordPress大学
WordPress大学

DEV Community

Authentication Security Deep Dive: From Brute Force to Salted Hashing (With Java Examples) Why AI Systems Don’t Fail — They Drift Spilling beans for how i learn for exam😁"Reinforcement Learning Cheat Sheet" I Replaced Chrome with Safari for AI Browser Automation. Here's What Broke (and What Finally Worked) How Python Borrows Other People's Work The $40 Architecture: Processing 1 Billion API Requests with 99.99% Uptime Vibe Coding: A Workflow Guide (From Zero to SaaS) Most webhook security guides protect the wrong side. The scary part is delivery. Headless CMS for TanStack Start: Build a Blog with Cosmic EU Age Verification App "Hacked in 2 Minutes" — What Actually Happened Comfy Cloud’s delete function does not actually remove files Running AI Models on GPU Cloud Servers: A Beginner Guide Event-driven media intelligence with AWS Step Functions and Bedrock I scored 500 AI prompts across 8 quality dimensions — here's what broke How to Call Google Gemini API from Next.js (Free Tier, No Backend Needed) The Portal Protocol: Reclaiming Human Connection in the Age of AI How to Fix Your Team's Scattered Knowledge Problem With a Self-Hosted Forum Intro to tc Cloud Functors: A Graph-First Mental Model for the Modern Cloud Designing Multi-Tenant Backends With Both Ownership and Team Access I Built a Neumorphic CSS Library with 77+ Components — Here's What I Learned PostgreSQL Performance Optimization: Why Connection Pooling Is Critical at Scale Cómo construí un SaaS multi-rubro para gestionar expensas en Argentina con FastAPI + Vue 3 🚀 I Built an Ethical Hacking Scanner Tool – Open Source Project I Replaced /usage and /context in Claude Code With a Single Statusline A Pythonic Way to Handle Emails (IMAP/SMTP) with Auto-Discovery and AI-Ready Design I Collected 8.9 Million Polymarket Price Points — Here's What I Found About How Markets Really Move EcoTrack AI — Carbon Footprint Tracker & Dashboard Everyone's Using AI. No One Agrees How. 5 self-hosted ebook managers worth trying in 2026 Building Your First AI Agent with LangChain: From Chatbot to Autonomous Assistant Common SOC 2 Failures (Real World) Stop Vibe-Checking Your AI App: A Practical Guide to Evals How to Use SonarQube and SonarScanner Locally to Level Up Your Code Quality Your Next To-Do App Is Dead — I Replaced Mine with an OpenClaw AI Sign a Nostr event in 60 lines of Python using coincurve — no nostr-sdk, no nbxplorer, no rust toolchain ITGC Audit Explained Like You’re in Big 4 Patch Tuesday abril 2026: Microsoft parcha 163 vulnerabilidades y un zero-day en SharePoint Stop scraping everything: a better way to track competitor price changes Listing on MCPize + the Official MCP Registry while routing payments OUTSIDE the marketplace — how I kept 100% of my x402 revenue Building an AI-Powered Risk Intelligence System Using Serverless Architecture Why We Ripped Function Overloading Out of Our AI Toolchain Testing AI-Generated Code: How to Actually Know If It Works SaaS Churn Is Killing Your Business. Here Is What to Do About It (Without a Support Team) The Speed of AI Is No Longer Linear - And Self-Improving Models Are Why How to Implement RBAC for MCP Tools: A Practical Guide for Engineering Teams From Standard Quote to Persuasive Proposal: AI Automation for Arborists I built a CLI that scaffolds complete multi-tenant SaaS apps Axios CVE-2025–62718: The Silent SSRF Bug That Could Be Hiding in Your Node.js App Right Now The dashboard that ended our friendship Data Pipelines Explained Simply (and How to Build Them with Python) The Hidden Cost of AI Systems Nobody Talks About. undefined vs undeclared, and how typeof behaves Switching from file-based jobs to NATS/Kafka in Rust without changing code io_uring Adventures: Rust Servers That Love Syscalls Why Agentic AI is Killing the Traditional Database The POUR principles of web accessibility for developers and designers Quantum Neural Network 3D — A Deep Dive into Interactive WebGL Visualization How To Install Caveman In Codex On macOS And Windows Automation Pipeline Reliability: Why Your Workflow Breaks When Nobody Is Watching I Built an 'Open World' AI Coding Agent — It Works From ANY Folder From Freelancing to Product: A Tech Service Company's SaaS Transformation China's AI Giants: Adding Tencent Hunyuan & ByteDance Doubao to AI University (74 Providers) On the Vibe Coders and Their Lies clerk: Auto-Summarize Your Claude Code Sessions AI Weekly — 2026/04/10–04/17 | The Model Lockdown Is Here, but the Toolchain Is the Real Battleground AI 週報 — 2026/04/10–2026/04/17 模型封鎖潮來了,但工具鏈才是真戰場 Maybe this is how Open-Source apps are born... 🚀 Fine-Tune LLMs with LoRA and QLoRA: 2026 Guide tRPC v11 + Next.js App Router: End-to-End Type Safety Without the Boilerplate ShadCN UI in 2026: Why I Stopped Installing Component Libraries and Started Owning My Components SaaS Billing in React Server Components: Stripe + Supabase Without a Single `useEffect` Join our DEV Weekend Challenge — $1,000 in Prizes Across TEN winners! Submissions Due April 20 at 6:59 AM UTC. Implementing FSRS Spaced Repetition in Flutter + Supabase — Adding Memory Science to an AI Learning App "I Texted My Localhost From the Train — Claude Code Fixed the Bug Before I Got Home" I Built a Sales Prep AI and It Went Deeper Than Expected Design to Code #2: One JSON, Eleven Outputs Solving the 100M-Row Problem: A Summary Table Pattern for High-Volume Push Notification Logs Flutter Web With Wasm: What Actually Changes For Developers I Built 50 Royalty-Free Soundtracks for My Side Project in a Weekend Using AI Music Generation The Vibe Coding Security Checklist: 7 Things to Check Before You Ship Stop Letting Googlebot Guess Fix Your React App's SEO Right Desconstruindo o Streaming do LinkedIn: Como Criar um Engine de Extração de Vídeo de Alta Performance com HLS e FFmpeg (EDA Part-1) EDA (Exploratory Data Analysis) Explained With Real Life — Why Looking at Your Data Is the Most Important Step in Machine Learning Brand Relationship Management at Scale: Our 4-Touch Outreach System for 200+ Brands Why String.fromEnvironment() Might Return an Empty String in Dart JGuardrails 1.0.0 — Hardening Java LLM Apps Against Jailbreaks, Toxicity, and Prompt Injection Plan and Schedule a Full Week of Threads Content From One Claude Conversation Coding Cat Oran Ep3, Five Tables Changed Everything Updated: BFF Pattern I'm done watching freelancers get buried by 200 proposals. So I'm building the alternative. This is my first post BFS Algorithm in Java Step by Step Tutorial with Examples Tracking LLM Pricing Monthly: An Open Dataset for 22 AI Models How We Measure Content ROI on a Comparison Site: Revenue Attribution Without Perfect Data Introducing Nova AI Ops: The AI-Native Operating System for SRE Teams I built a free desktop video downloader for Windows — Grabbit How Talkie OCR Helps Vision-Impaired & Dyslexic Users Read the World Around Them VRCFaceTracking安装和iPhone面捕配置教程,有bug Even CrowdStrike Can't See Your Agents The Automation Gold Rush: What n8n Workflows and Claude Are Opening Up for Developers Right Now
Why we treat credits and wallets as first-class billing primitives
Arnon Shimon · 2026-05-17 · via DEV Community

tl;dr: Most billing systems model a credit wallet as a prepaid cash balance. That works at day zero. It breaks the moment your product has multiple types of credits with different per-unit costs, different margins, and different rate cards sitting between your token layer and your customer-facing price. Our customer Reson8 needed multiple wallets, structured around a rate card layer instead of one prepaid counter.

Lots and lots of billing systems model credits as prepaid cash. Pay $100, get $100 of credit. Burn the credit, the balance goes down. That's because it's often treated as "just an engineering thing" where it's a fancy counter.

The model is clean until your product has more than one thing customers buy credits for.

Why we'd rather hold credits than money

There's a line we come back to internally:

I'd rather have credits in a wallet than money, because money I have to give back. Credits I can expire.

A money wallet creates a liability. Whatever your customer deposits, you owe it back if they don't spend it. Credits work on your terms: when they expire, what they cover, under what conditions they're valid. The obligation is yours to design.

Not great for customers necessarily, but great for businesses running with AI.

A wallet targeting a single product category is what tax law calls single-purpose: intended use is known at purchase, so VAT is calculated when the funds go in. A general-purpose wallet, where a customer might spend across your product, is multiple-purpose: intended use is unknown at purchase, so VAT is calculated when they actually use it. Credits are a third category. You're selling a product (100 credits for $90), VAT applies at purchase, and the credit has its own exchange mechanics entirely separate from currency.

So if you have three wallet types, you get three different VAT treatments and three different points of revenue recognition.

If you model them as one thing and finance finds out later, and won't be happy with you.

Why single wallets aren't right

The single-wallet model assumes interchangability. All credits are equal. One credit buys one unit of anything in the product.

That assumption is kinda true for simple products but not for modern AI stuff where the cost of delivering one unit varies across workloads. A minute of transcription on a custom-trained domain model costs more to deliver than a minute of batch generic transcription. If you change languages it becomes even clearer, because the underlying token countss are not the same.

When those two workloads draw from the same credit pool, the billing system can't enforce that difference. That means customer's credits become fungible across products that aren't and the margin doesn't match what was invoiced.

That's a data model problem!

What Reson8 needed

Reson8 builds hyper-customizable speech recognition for European languages: real-time, domain-adaptive, running on EU GPUs with no audio retention. They bill by the minute across multiple workload types. Standard transcription. Custom-domain models adapted on up to 1M tokens of customer context with real-time processing versus batch - and each has a different cost basis.

The moment a customer at Reson8 pre-purchases minutes, the question becomes: which kind? Standard-transcription minutes and custom-domain real-time minutes are different products. You can't let customers use one pool for the other: the product doesn't allow it, and the margin profile doesn't support it.

What companies like Reson8, ElevenLabs, Wispr need is at least three distinct rating systems, that translate to wallet types: one for standard minutes, one for custom-domain minutes, and one that handles real-time processing overages as a metered charge when the pre-purchased pool runs empty.

In theory, each can have its own top-up schedule, expiry rules, and invoicing behavior.

A single prepaid balance doesn't model that. It guesses at it at best.

The token layer is why

Speech AI adds a dimension most billing systems weren't built around. The model thinks in tokens. The customer thinks in minutes. Contracts denominate in credits. Finance works in dollars (or Euros).

Each link is a rate:

tokens → minutes → credits → dollar

A minute of real-time transcription in a custom-adapted model on a dedicated EU cluster consumes more tokens than a standard batch job on a generic model. The conversion factor varies by workload, by model version, by language pack, by the level of domain adaptation the customer has configured.

Most billing systems let you set a price per event, or a price per unit of consumption. What they don't support is a rate card layer sitting between the metering layer and the wallet layer. A rule that says: one meter event tagged workload: custom-realtime burns 3 credits from wallet B, while one meter event tagged workload: standard-batch burns 1 credit from wallet A.

Remember I said engineers see it as a counter? That's not how counters work.

When that rate card lives in application code rather than billing configuration, it's invisible to finance and re-coded every time the cost model changes. Which in AI, is quote often.

Why the rate card has to be in the billing layer

Lots of speech vendors also have custom model adaptation as a product in its own right: a one-time charge to adapt the model on a customer's data, then a recurring credit pool to use it. The initial adaptation and the ongoing credit wallet are related but distinct events.

The whole revenue stack has to handle both on the same invoice and recognize revenue at the right moment for each.

You could call this hybrid, where a one-time charge triggers a wallet provisioning event, the wallet burns down as the customer runs workloads, it auto-tops-up on a schedule or on demand, and overages switch to real-time metering when the pool hits zero.

For that to work, the wallet has to carry more than just a counter, but some extra metadata: which plan provisioned it, which meters feed into it, which rate card converts events into credit deductions. A counter doesn't do that.

The Stripe method (and lots of other vendors) have gift-cards or "balances" given to a customer, but they're not separate objects - you can't spin them up and move them around. Connecting them requires orchestration code you write and maintain. Lago's credit primitives don't compose naturally with multi-wallet, multi-rate-card configurations and if you're building on top of them - you need your own custom ogic that reimplements the billing layer on top of the billing layer.

In Solvimon, Wallets are a first-class primitive. Multiple wallet types per customer, each tied to a specific meter and a rate card, with configurable top-up and expiry rules. The rate card lives in configuration. Finance can see it, and the billing system enforces it.

What changes for revenue recognition

Good wallet modeling cleans up revenue recognition.

A customer pre-purchasing 10,000 standard minutes creates a deferred revenue liability. Each minute consumed triggers a recognition event against the right wallet. When the pool empties and the customer tips into metered overages, billing switches from credit burn to real-time usage. Finance sees one invoice, one ledger. The wallet's depletion is the revenue recognition schedule.

During billing calculation, credits are reserved against pending invoices, then deducted only when the invoice goes final. Available balance is real balance minus reservations. That gap between reservation and deduction prevents customers from overspending mid-cycle, and makes the recognition schedule traceable without a spreadsheet.

For Reson8, that matters. EU customers care about data handling and contract structure. An invoice that reflects custom-domain usage, standard usage, and real-time overages as distinct line items, each traced to its wallet and rate card, holds up in procurement, in audit, and in the customer relationship. That's not my favourite thing to have to design around, but healthcare and financial services procurement teams care quite a lot about this.

The big decision/question behind credit pricing you need to make

Credits carry a pricing decision inside them: what value to attach to each unit. The structural question is whether your billing system can model the relationships between your metering layer, your credit pools, and your revenue recognition without engineers maintaining the translation.

For AI companies running multiple workloads with different cost bases, that requires multiple wallets and a rate card layer that understands what each pool represents.

Frequently Asked Questions

Why would a company prefer credits over a money wallet?

A money wallet creates a financial liability: you owe the deposited amount back if the customer doesn't spend it. Credits are a product sale: the customer buys a defined unit with defined terms, including when those credits expire. That distinction affects your balance sheet, your VAT treatment, and how you recognize revenue. For many AI companies, credits are preferable precisely because you set the expiry terms rather than holding an open-ended obligation.

What is the difference between a credit wallet and a prepaid balance?

A prepaid balance is a single pool of value denominated in currency. A credit wallet is a typed pool denominated in a product-specific unit (minutes, tokens, API calls) with a rate card defining how it converts to currency and a meter defining what consumes it. For simple products, they're equivalent. For products with multiple workload types, only the wallet model holds up.

Why would an AI company need multiple credit wallets for the same customer?

When a product has multiple distinct workloads with different unit costs and different margins, a single pool treats all credit consumption as equivalent regardless of delivery cost. Multiple wallets enforce the boundary. Each wallet is tied to the workloads it covers, with its own rate card and top-up behavior.

What is a rate card in AI billing?

A rate card is a configuration layer that defines how a metering event converts into a credit deduction. For a speech AI company, this might be: one minute of real-time custom-domain transcription = 3 credits from the custom wallet. The rate card sits between the metering layer (which counts consumption) and the wallet layer (which tracks the balance).

When rate cards live in application code, they're invisible to finance and hard to update - which is why you should keep them in a billing system.

How does token-to-credit conversion work in practice?

The model layer consumes tokens. The product layer exposes a customer-facing unit (e.g., minutes). The billing layer converts that unit into credits at a rate defined by the rate card. A minute of transcription in a given model configuration costs a known number of tokens to produce. When the model changes and the per-minute token cost changes, the rate card updates in configuration.

Can Stripe Billing handle multiple credit wallet types?

Stripe Billing supports basic combinations of subscription billing and metered usage, and has a credit grants, but not tied to wallets. Getting them to interact, especially across multiple credit types with different rate cards, requires custom orchestration code. Most teams building multi-workload AI products end up maintaining that orchestration layer themselves.

How does Solvimon model credit wallets?

Solvimon treats Wallets as a first-class primitive: multiple wallet types per customer, each associated with a specific meter and a rate card, each with configurable top-up and expiry rules.

The rate card layer handles the conversion between consumption units and credit deductions. Revenue recognition is calculated against wallet events. Wallet configuration lives in Solvimon rather than in application code.