Quite a peculiar story happened to me recently. I was buying a FlixBus ticket for 24.99 EUR. I already had it in my “cart” and I had 30 minutes to buy it before the cart expires. Then I started double checking other details and in the end it expired (actually couple seconds before I pressed “pay”). I tried to buy it again, but now the price was 29.99 EUR, i.e. 5 EUR more.


Uh, I was confused and surprised. They definitely knew that I am interested in this ticket. I already almost bought it once and, yes, I still wanted to buy it. But increasing the price by 5 EUR because of that would be mean. Fortunately, I knew that they can recognize me (by my browser session) and perhaps if I start fresh the price would be different. E.g. they could set a “cookie” in my browser saying something like “hey, this chap tried to buy this ticked already, let’s do +5 EUR, cheers!”. This cookie would be absent in my new session. Thus, I tried to open the same page in a Chrome Incognito tab. Guess what - the price was the old one - 24.99 EUR. They could potentially correlate my new session with my old one (e.g. by IP, time and my computer hardware), but that would be cumbersome.

Now I don’t remember precisely, but I feel like I refreshed the old session page as well after seeing 24.99 EUR in the incognito tab and it was still showing 29.99 EUR. This is actually a very important detail to understand how this happened.


Someone is being mean

Theoretically, this could be intended. Theoretically, FlixBus almost made +5 EUR out of nowhere (ok, out of my pocket to be precise). It is easy to see how this could benefit them. However, this would be pretty mean and I would be very surprised if this is the case. The approach does not look very sustainable, someone would definitely notice and complain. Also it is better to assume positive intention and give benefit of doubt.

Bugs, bugs, bugs

A bit more plausible explanation is that this is just a bug. So far this is my best guess. As far as I know, FlixBus uses “adaptive” pricing. I.e. if someone buys a ticket, the next ticket can cost more. This tries to adapt to the actual demand (people buy more tickets to some destination, demand must be high, so the price can higher too). Airlines go crazy with this stuff. I haven’t observed FlixBus increasing and decreasing their prices frequently, but airlines (based on my experience) do this a lot.

Thus, when “almost” my ticket (24.99 EUR one) was in my “cart”, FlixBus could already raise the price for the next one to 29.99 EUR. They could just assume that the first ticket is almost sold. And then when the first ticket “expires”, they need to decrease the price back. Perhaps there is some race condition here and I happened to open the state when my old not-bought expired ticket was still in the cart (but in the reality it wasn’t).

Then the question is why incognito helped. I could imagine them having multiple servers and perhaps some caching. Theoretically, my new tab could have hit some other server, which was already aware that 24.99 EUR ticket came back. Or the server serving the old session could have cached 29.99 EUR (but caching price pages sounds weird).

I know that my hypothesis is somewhat weak, but, hey, the info I have is limited as well.



Ok, originally I didn’t plan to experiment with this, but now I am curious. The plan is the following:

  • Add a couple tickets to “cart”.
  • Let them expire.
  • Check their price again.
  • Open incognito and check price there.
  • If I observe the increase, I could create a new Chrome profile, check the price and then and inject the cookie from the old profile into the new one and check the price again.


I decided to add Berlin - Munich tickets to my “cart”. Unfortunately, one cannot add two tickets on the same day in the same direction (which makes sense, but it is inconvenient for my experiment), so I added 3 tickets for each day from 21st of August to 23rd of August. FlixBus shows when there are 0, 1 or 2 tickets left at this price, so I varied this parameter:

  • 21st of August - price 27.98 and 2 seats left at this price Initial ticket price for 21st of August
  • 22nd of August - price 27.98 and 1 seat left at this price Initial ticket price for 22nd of August
  • 23rd of August - price 27.99 and no additional messages. Initial ticket price for 23rd of August

Overall my cart was 83.95 EUR.

Cart overview

Then I waited for ~20 minutes and checked from an incognito window. Only in the second case (22nd of August) price grew to 30.98 EUR. 22nd of August ticket price before expiry

This makes sense (they said I took the last seat at the previous price). On the 21st of August they say that 1 seat is left at this price, but the price is the same. 21st of August ticket price before expiry

For 23rd nothing has changed. 23rd of August ticket price before expiry

Then I let the cart expire. Funny fact: they say “1 minutes” when only 1 minute is left:

"1 minute**s**" expiry warning

Probably so few people reach this point (and observe the page while doing that), that no one complained or it is not worth fixing. Yeap, a minor nit.

Another fun fact: the number turns red when it is 0:

"0 minutes" expiry warning

And finally - expired:

Session expired message

Then I checked all the prices from the same browser window, i.e. same session. All prices were the same as they were when I started my experiment:

Final (after expiry) ticket price for 21st of August

Final (after expiry) ticket price for 22nd of August

Final (after expiry) ticket price for 23rd of August

I.e. I did not observe any price increase in any of the cases. I was just able to rebuild my “cart” with exactly the same prices.

Rebuilt cart with exactly the same prices


I was not able to reproduce the issue. Obviously they could do this trick only once in a while to prevent someone like me detecting this. My gut feeling is that this is a weird bug due to multiple system part interaction (e.g. caching or distributed servers).

FlixBus opinion

I have asked them on Twitter (tweet). Not sure whether they will reply (that would be very unpleasant to debug for someone there especially based on the scarce data I have here and me being unable to reproduce it), but let’s see.