Auto-exchange bug - order in full balance amount fails execution despite sufficient funds

In May 2019, my mother had Revolut balances of GBP 57.20 and EUR 35.00. She knew that later in the year she would need to make a payment of EUR 100. Therefore upon my advice, she created a limit order (which Revolut calls “auto-exchange”) to sell GBP 57.20 against EUR at a GBP/EUR rate of 1.1363 (equivalent to a EUR/GBP market convention rate of 0.8800). This would buy her EUR 65.00, which would top her EUR balance up to the required EUR 100. After she patiently waited several months, the Revolut app confirms that Revolut’s GBP/EUR rate rose above 1.1363 up to 1.1375 on Friday 20th September 2019, but her order was not filled and her Revolut app instead gave an error message of “We couldn’t perform your auto-exchange due to low balance”. The error message is implausible, because the amount of her order was exactly equal to the balance of the currency that she was selling, i.e. GBP 57.20. When she queried this with Revolut support, they responded:

Insufficient balance of £57.20; required £57.21 (extra £0.01 is required)

My mother asked Revolut support five times for its calculations to demonstrate why GBP 57.21 was required, but each time they responded with unhelpful waffling drivel, devoid of any calculations, for example:

If the price hits your set amount, we do an exchange with the market price. We don’t guarantee this price, as the price might have moved between the time the auto exchange price is hit, and the time that the server executes the price. We will just execute the exchange at the current price after the target is triggered. The exchange will only trigger once your target rate has been reached, but you should be aware that the rate could be slightly different from your target value when the auto-exchange takes place. This happens because the exchange rate never settles.

As the rate is changing constantly (every second), even if the auto exchange was triggered for the specific amount: 57.20 GBP, it can slightly change during the actual process of the exchange. And in your case, this rate changed a bit and the amount that was required to complete it changed from £57.20 to £57.21. That’s why we are stating this in advance: The exchange will only trigger once your target rate has been reached, but you should be aware that the rate could be slightly different from your target value when the auto-exchange takes place.

Auto exchange process depends on the current exchange rate. And we cannot keep a fixed rate just to complete the transaction. We don’t guarantee this price, as the price might have moved between the time the auto exchange price is hit, and the time that the server executes the price. If the rate changes while we are trying to execute the exchange that you set up, the system has to apply it, and the initial amount for completing it can be different. So, to sum up: you set up 57.20 GBP to be exchanged to EUR. When the rate was reached, auto exchange was triggered, but it could not be completed, because at that moment, the current rate changed, and the price for this exchange was raised by 0,01 GBP. As you did not have this amount in your account, we could not finish this auto-exchange. I can also send a request for the relevant team so they could check what was the exact rate when this auto exchange was triggered, so you could see how it changed when we tried to complete this exchange. Is that ok?

Our technical team has replied and the balance occurred too low due to fact that during processing this exhchange rate has changed, and 52.01 GBP was required

The last response containing the technical team’s explanation shows that they are even more incompetent than the support team, given that they believe amount of the order to be £5.20 less than it actually was. So there’s no hope of them being capable of providing a calculation.

All of Revolut’s explanations fail to understand that:

  • The starting amount, i.e. the sold currency, was exactly GBP 57.20. In other words, the GBP amount was the entered amount and consequently fixed, whereas the EUR amount, i.e. the bought currency, was potentially variable, for example if the GBP/EUR rate moved immediately after the order level of 1.1363 was triggered. Therefore no movement in the GBP/EUR rate could have caused GBP 57.21 to be required.
  • After Revolut failed to fill the order, it subsequently failed to fill the order at any point during the many minutes while GBP/EUR was between 1.1363 and 1.1375. If an order fails, then Revolut should not stop trying to fill it, particularly if the customer has more-than-sufficient funds in the sold currency.

I expect that the EUR/GBP interbank rate will soon drop below 0.8800 again (1.1363 in inverted GBP/EUR terms), in which case my mother will complete her transaction manually. However, as I often use limit orders in Revolut myself, I am concerned that there is a bug and that one of my own orders will in future fail in a similarly unexplained manner. My profession is an eFX consultant (foreign exchange e-commerce), which involves designing and implementing FX trading systems, including order management functionality, for tier one and two investment banks. Therefore I gave my mother carefully-worded questions to ask Revolut support. It is clear that Revolut lacks FX subject matter expertise, having implemented its “auto-exchange” functionality with this bug and another bug, and its support staff are incapable of understanding the existence of this bug or supplying calculations. My mother will be submitting a complaint to Revolut, but before she does so, can anyone shed any light on this? Has Revolut failed to fill anyone else’s orders, particularly when they sold exactly their full balance in a particular currency?

3 Likes

To me the only plausible reason is a concurrency problem (a common issue in IT) as the rates are not locked when the exchange is triggered:

  • The rate provider sends updated rates to Revolut
  • Auto-exchange is triggered by the set limit
  • Meanwhile the rate changes to market convention rate of 0.88015
  • exchange order is processed and is rejected due to lack of funds

I have already noticed that when I exchange money manually that the effective amount charged fluctuates by ±0.01 from the amount displayed before clicking the exchange button.

1 Like

How would any change in the EUR/GBP or GBP/EUR rate cause a change in the starting amount (sold currency)? This would cause only a change in the destination amount (bought currency).

1 Like

As I do not know about the details I can only guess that, once triggered, the exchange is submitted as normal exchange with a set destination amount and a variable starting amount.

Similar to the regular exchange in the app when you enter a destination amount and the starting amount remains variable.

OK, so you’re guessing that the bug is that a bought amount is calculated from the sold amount using the entered order level, and then the bought amount becomes the fixed starting point instead? It’s plausible, not least as the app doesn’t show whether the sold amount or the bought amount was the entered amount, and even worse it rounds or truncates amounts. In FX, the amount specified by the price taker is always fixed (often known as the “dealt amount”) and the other amount (often known as the “contra amount” is variable and calculated using the FX rate. But Revolut defies FX market convention in many ways, which is a shame as its FX rates are bang on market.

My mother complained to Revolut, who manually executed the order and compensated her. But Revolut still repeatedly failed to give her a calculation. Eventually they explained in words what had happened:

The projected exchange’s outcome was locked at 65 EUR. Nonetheless, in the next instance of the sequence of the automated processing steps, whereby your GBP account was asked for the funds, the exchange rate fluctuated infinitesimally so that the GBP worth of the locked 65 EUR increased to 57.21 GBP. Consequently, the auto-exchange could not have taken place as the system found the funds insufficient.

So in other words, regardless of whether you enter the amount as the sold currency or the bought currency, Revolut fixes the amount in the bought currency. This makes “auto-exchange” unsuitable for selling the entirety of a currency balance, which was the case here and will be for many other customers. If you enter an order (“auto-exchange”) to sell the entirety of a currency balance, there’s a good chance that it will fail.

This is a design bug. The functionality does not perform as expected. I hope that Revolut fixes it.

Never used auto-exchange so far. But if you want to get rid of some currency fully, isn’t there an option just to change all amount when desired rate is reached? That would be great, imo.

Yes, that’s what “auto-exchange” is supposed to do, but it doesn’t work because of the above bug in its design. To be clear, the bug is in the specification or design, not in its implementation (which no doubt follows the specification).

They even state that this can happen in the blog post. As they are dependent on a 3rd parties have rates delivered and to execute the exchange this will not change any time soon.

The exchange will only trigger once your target rate has been reached, but you should be aware that the rate could be slightly different from your target value, when the auto-exchange takes place. This happens because, just like us, the exchange rate never settles.

https://blog.revolut.com/introducing-auto-exchange/

No, they don’t. Where does it say that they will change the fixed amount from the sold currency to the bought currency (which creates a risk of the order failing to be filled)?

This bug is worse than I thought. This morning I created an order to sell EUR/HUF at 335.00 in HUF 100,000. Revolut then calculated HUF 100,000 ÷ 335 = EUR 298.51, and then calculated EUR 298.51 x 335 = HUF 100,000.85. The app now shows that my order is in HUF 100,001 as it rounds the displayed amounts in the app. So an order that I entered as HUF 100,000 has now become an order in HUF 100,000.85. Why doesn’t Revolut simply record the order as entered without at the time of entry converting the buy amount to the sell amount and then converting the sell amount back to the buy amount? No other FX service provider adds these convoluted and unnecessary conversion steps which change the order amount.

All this happens before the order is filled, which might fail if these unnecessary conversion steps cause the sold amount to exceed the balance of the sold currency.

3 Likes

Revolut should fix this asap. Otherwise auto-exchange is just super unreliable.

1 Like

I’ve worked in FX and it’s utterly bizarre that the sold amount (dealt amount) is not fixed. Whoever coded it to fix the bought amount must have been on funky mushrooms or something.

5 Likes

taking the “we are different than the competition” one step further :+1:

1 Like

I’ve experienced another bug with this. I entered an order today to sell EUR/PLN in PLN 150 at 4.2850. It was filled at slightly less than my order level (not a problem), but selling EUR 35.02 and buying PLN 150.06. So neither the EUR amount nor the PLN amount was a dealt amount that I entered.

I also entered another order today to sell EUR/HUF in HUF 100,000 at 331.00. That order now shows as EUR 302 = HUF 100,002, neither of which is an amount that I entered.

Revolut really needs to fix these bugs.

1 Like

And my EUR/HUF order was just filled at EUR 302.12 = 100,001.72, neither of which was the dealt amount that I entered. This is a disgraceful implementation of orders, full of bugs.

1 Like