bPhone: charge to receive calls
Calls in bWalletX have always been free. From 5.1.87 you can put a price on yours: per second, minute, hour or call, in BSV, MNEE or a token, paid from the caller’s wallet to yours while you are still talking. This is how it works, and why it is built the way it is.
Status: built on a branch, 8 Oct 2026, not yet released. The wallet code, the server routes and the tests are done; the database change and device testing with real money come before it ships. Everything below describes the branch, not the released app (5.1.85).
Whose time is the product
A therapist, a solicitor, an accountant in January, a developer who will look at your broken deploy, a language tutor, someone who has been where you are. All of them sell time, and today most of them sell it through a platform that sits in the middle: it takes 15 to 30 percent, holds the money for a week or a month, decides when to pay out, and keeps the client list. The call itself goes through the platform too, so leaving it means losing the clients.
bWalletX already has the pieces that platform provides. Calls run on our own video server. Names resolve to identity keys. Payments go wallet to wallet in under a second. The missing piece was small: a published price, and a meter.
The rate card
Under Chat › Calls there is a new bPhone tab. You turn on “Charge to receive calls” and pick three things: the asset, the amount and the unit. The asset is dollars paid in BSV, MNEE, or any BSV-21 token you hold. The unit is a second, a minute, an hour, or the whole call. That is the whole rate card:
{ amount: 2, per: 'minute', asset: { kind: 'bsv' } }
It is published under your identity key on the paymail server, signed the same way your paymail claim is, so anyone who is about to call you can read it first. Your phone keeps a copy, because it is the side that has to enforce it.
BSV prices are in dollars. That is the rule we set for streams last week and it holds here: you say “$2 a minute”, the caller’s wallet turns each payment into satoshis at the live rate. MNEE is a dollar already. A token price is in tokens, which means a $NAME token finally has something its holders can spend it on: a call with you.
Nothing rings until the caller agrees
When someone dials you, their wallet fetches your card before it places the call. If there is one, they see it: the rate, “paid every 10 seconds from your wallet while you talk”, and three choices for the most they are willing to spend, worked out as 15, 30 and 60 minutes at your rate. Accept, and the call rings. Cancel, and nothing happened. There is no way to reach the ringing state without passing the quote.
We thought about charging from the moment of ringing, so a callee’s time waiting for you to pick up is paid. We decided against it: a missed call that cost money is the kind of thing that makes people stop using a feature. The meter starts when the callee answers.
The meter
The caller’s phone runs the meter. Every 10 seconds in BSV, every 60 in MNEE or a token (each of those transfers pays an indexing fee, so they are batched longer), it sends one ordinary payment to the callee: a paymail payment for BSV, a transfer to the address in the card for the others. It pays one interval ahead, five seconds before the paid time runs out, so the callee is never owed money and the caller’s exposure if the callee hangs up is one interval.
Rounding was the part we got wrong first. $2 a minute is 33.3 cents per 10 seconds; round that up every time and an hour costs $122.40 instead of $120. The meter now charges exactly what the rate says is owed through the new paid-until time, minus what has been paid: 34 cents, then 33, then 33, and so on. Over any length of call the total is the rate, to the cent.
After each payment the caller’s phone sends a small receipt to the callee over the call’s own data channel: a sequence number, the amount, the time it pays through, the transaction id. The callee’s screen shows “Received $4.20 · paid 7 s ahead”. The caller’s shows “Spent $4.20 of $60”, and a warning 30 seconds before the maximum. When the call ends, both see the total.
The callee enforces it
The callee’s phone trusts nobody. If the first receipt has not arrived within 20 seconds of answering, it hangs up. After that, if the paid-through time is more than 10 seconds in the past, it hangs up, with “Ended: not paid” on the screen. A caller on an older build, or on the store edition, never sees the quote and never pays, so they get about 20 seconds and are cut off. That is the intended behaviour: a callee who set a price should not be giving free calls to people whose app is out of date.
What the callee’s phone does not yet do is check the chain for each transaction id during the call. The paymail server already verifies that every BSV payment it receives pays the exact outputs it handed out, and the wallet collects those payments as it always has, so a forged receipt buys a caller at most one grace period before the inbox shows nothing arrived. A server-side ledger that matches receipts to transactions during the call is the obvious next step, and we have written down where it goes.
The directory and bookings
Charging and being found are separate switches. You can charge without being listed, so only people who already know your name pay for your time. Or you can list yourself: a title, a few lines about what you offer, a category, and opening hours in your own time zone. The listing appears under Chat › Calls › Experts for everyone, with your rate and whether you are open right now. Outside your hours you can still be called; the directory just says “Opens Thu 09:00”.
Bookings came out of the same conversation. Someone who wants an hour of your time next Tuesday should not have to catch you free. They pick a slot inside your hours, 15 to 60 minutes, and you confirm it or decline. From five minutes before the start a Call now button appears on both phones. The booked call is a normal bPhone call, quoted and paid the same way; there is no deposit and no charge for a no-show in this version. We would rather see how people use it first.
No middle, 0%
The Bitcoin Corporation takes nothing from a bPhone call, as with tips and with gifts. There is no platform balance anywhere: every payment is from the caller’s wallet to the callee’s, and the only server involved stores the published price and the bookings. If we disappeared tomorrow, the people in your call history would still be callable and payable by name.
There are no refunds either. A payment is a payment. The maximum the caller sets is the most a call can cost, and the grace period is the most a callee can be short. Both are small on purpose.
What is still to do
- Apply the database change on the paymail server and ship the wallet build, then test with real money: BSV, MNEE, a token, a flat price, an old build calling a priced callee, the cap, an empty wallet.
- A receipt ledger on the server, so “received” on the callee’s screen means “verified”.
- Push ringing, so a booked call rings a phone with the app closed. Calls still ring only while the app is open.
- Booking reminders, and a calendar export.
- Not in the store edition until the rules on person-to-person services are settled with a reviewer.
The rules as they stand, and a worked table of what a call costs, are on the bPhone page.
You are selling your time to people you may not know. Any licence, confidentiality or tax rule that applies to your profession applies here too; bPhone checks none of it, and says so.