You just charged a customer. The payment processor returned success. Your API logged the request. Your dashboard shows a new transaction. Everything looks fine but you don’t know if the work actually ran.


This gap between payment and execution is where real systems live. It’s also where trust breaks down, especially with usage-based pricing. The moment after a payment succeeds is quiet. Your code returns 200 OK. The customer sees a confirmation. Internally, you’ve queued a job, fired a webhook, or scheduled a task. You assume it will run. But you don’t know.
Retries happen. Network blips, database locks, queue backlogs, timeouts. Your system retries, and sometimes it retries the retry. A single customer action can trigger multiple attempts. Each attempt might succeed, fail silently, or partially complete. By the time you notice, the customer has been charged, and you’re left wondering what actually happened. Logs and dashboards can mislead because they show requests, not outcomes. A log entry for “job queued” doesn’t mean the job ran. A dashboard showing “3 API calls” doesn’t mean 3 successful executions. You see activity, but not results. It feels like visibility, but it’s not.


The difference between requests and outcomes is where things get messy. A customer pays for an API call that times out. They pay for a webhook that fails to deliver. They pay for a job that gets queued but never processes. From their perspective, they paid for work that didn’t happen. From your perspective, you charged for a request that was made. Both are true, and that’s the problem.
Usage-based pricing amplifies this. When customers pay per API call, per webhook, per job, they expect to pay for what worked, not what was attempted. But most systems charge on the request, not the outcome. This creates a mismatch: you charge for intent, they pay for results. When those don’t align, trust erodes.


We’ve seen this play out in production. A customer reports they were charged for ten API calls, but only seven completed. You check the logs: ten requests came in, ten were queued, ten were charged. But three failed after payment. The customer is right to be frustrated. You’re right that the requests were made. The system is wrong because it charged for attempts, not completions.
The uncomfortable truth is that most systems don’t know what actually ran. They know what was requested, what was queued, what was logged. But the final outcome—did the work complete successfully—often lives in a different system, or isn’t tracked at all. You piece it together from logs, monitoring, and customer reports. It’s detective work, not engineering.


This is why payment feels like the end, but it’s really the beginning. Payment is the commitment. Execution is the delivery. In a well-designed system, these are linked: you only charge when the work completes. But that’s harder than it sounds. It requires tracking outcomes, not just requests. It requires idempotency, so retries don’t double-charge. It requires visibility into what actually happened, not just what was supposed to happen.


We’ve built systems that charge on request and systems that charge on outcome. The request-based ones are simpler to build but create trust issues. The outcome-based ones are harder to build but create trust. The difference is whether you’re selling attempts or results.


The quiet moment after payment succeeds is when you should know, definitively, what happened. Not what was requested, not what was logged, but what actually ran. That knowledge is what separates systems that work from systems that merely appear to work. It’s the difference between charging for promises and charging for delivery.


Most of us learn this the hard way, after a customer asks why they paid for something that didn’t happen. By then, the trust is already damaged. The better approach is to build the system so that question never needs to be asked—because the system knows, and can prove, what actually ran.


Payment succeeded is just the beginning. What happens next is what matters.

Enjoyed this article?

Browse more articles