1. When user clicks “I want to buy”, they lock a BTC-denominated price for him for the next 15 minutes. Since now, risk of exchange rate changes is on their side.
2. User can complete the transaction at any time between now and 15 minutes from now. They really can't know when. Or he may not complete and just drop out.
3. If they exchange BTC to fiat after user completes the payment, they risk more than their commission fee because BTC price is so volatile.
So I'd do it this way:
1. When user clicks “I want to buy”, they lock a BTC-denominated price for him for the next 15 minutes. Since now, risk of exchange rate changes is on their side.
2. They exchange BTC for fiat immediately after that, without waiting for the customer to actually pay. In bulk, eg. six times per minute, so every 10 seconds they exchange BTC to fiat for all transactions that were started within these 10 seconds.
But of course they don't exchange total volume of these started transactions as lot of these orders will drop out and will never be paid. They process fairly significant amount of transactions, so they can predict to some degree what percent of transactions will drop out and what percent will actually be finalized with a payment. They can segment that basing on website, transaction amount, time of day, and lot of other factors, to get pretty accurate.
So if they have 100 started transactions for total 200 BTC in the last 10 seconds, they should be able predict pretty accurately what BTC volume will actually go through. So they immediately exchange that amount of BTC which they think will be finalized for these started transactions.
3. After 15 minutes, when all these orders will be either paid or expired, they do additional exchange of some very fractional amount to correct what they missed. E.g. they exchanged 49 BTC for fiat based on their expected final volume from this 200 BTC started volume, but after 15 minutes it turned out, that 50 BTC were actually finalized. So they sell additional 1 BTC. Now their actual currency rate risk was much less than if they exchanged everything only after the fact. They actually risked changed rate for 1 BTC of 50 BTC transacted, so for 2% of traded volume. If price changed 2% in the wrong direction during these 15 minutes, they lost 2% of 2% = 0.04% of total. If they didn't convert BTC to fiat at the moment of starting orders and waited for finalizing these transactions, they would lost 2% of all 50 BTC so 2% of total volume, which is more than their fees.
This is just a statistics game. The more accurately they're able to predict transaction volume that will go through, basing on past performance and advanced segmentation, the lower their exchange rate risk is.
That is, assuming they do something like this. I would design it this way if I worked for them.
Interesting. Thanks for the explanation. The key is the reliability of your forecasting system. I'd assume they'd have to stop making a market in volatile times as their likely to get swamped -- unless they have a metric for that as well.