Categories
General Uncategorized

Dark Patterns: Buying a Bahncard at Deutsche Bahn

How do two well liked companies, deutsche Bahn and adobe, advertise their subscriptions? Badly.

Deutsche Bahn, the fully state-owned railway company, is a well-liked company running most major long-distance railways in Germany. So, it will come as a surprise to many that I have some complaints about them. Today, however, I won’t talk about the numerous delays, cancellations and frankly bad service interactions I had with them in the past. Today is about dark patterns that cost me 500€ for nothing.

I apologise in advance for using mostly German material, as it is the primary language. I thought it wasimportant to use it. Also, DB manages to make the English part even worse by breaking their reference to additional material (see header image). Also, if your sarcasm detector is broken, you might have trouble with some sections.

A dark pattern is a design mechanism to get people to buy, do or allow things they don’t actually want. Examples include: Forced continuity of free trials with paid subscriptions, hiding the true costs of a service, and many, many more.

These are especially prevalent with subscriptions, so it might not come as a surprise that we will look at subscriptions today. At first, let’s look at two other well-liked and respected companies: Adobe and Deutsche Telekom. Both make use of subscriptions: One for an ongoing connection to the internet and one for software. This is how they are advertised on their website.

Both note prices in Currency Per Timeframe: €/month or €/year. Telekom even includes some discounts: 9.95€/month and in smaller font: 43.95€/month starting with the 4th month! Adobe clearly states they are selling a monthly subscription (“Monats-Abo”) or a yearly subscription, but paid monthly. There is no misunderstanding. (Note: Adobe is highly criticised for its subscription practices.)

Based on these examples, let’s see how Deutsche Bahn advertises their BahnCards. A BahnCard is a discount offer; it is not a product or service in itself, but rather allows you to get discounts. They exist on various levels: Normal and Business, 25/50/100, Probe or Normal, first or second class. I’ll limit this to the first class BahnCard 50, as that’s the one I got and the Probe version, which is only valid for 3-month period.

A Bahncard 50 gives you a 50% discount on regular fares (which are rarely paid by most casual users) and a 25% discount on discounted tickets. After using it for a year, I’d say it is a very bad deal for most casual travellers, but that’s beside the point. I bought mine on sale (50% off), but those are not available at the time of screenshotting.

The “weitere Informationen” link lets us see additional details about this order and an FAQ section with important information.

The details page does not contain a mention of a subscription. It mentions cancellation.

It even contains a neat question about the cost of the BahnCard 50! That’s nice. 492 Euro for the first-class card. We knew that, it was clearly advertised! Silly. We can even link to this section specifically.

Even the “How much does it cost” FAQ entry does not mention a subscription.

So: Is this a subscription? Yes, of course it is! The Probe Bahncard page actually mentions this.

As well as the sales process, once you hit “jetzt bestellen” (buy now).

Deutsche Bahn states here that it is a subscription. This is the clearest mention of the subscription, but it does not indicate the prices are recurrent prices and only states it in text.

In case you missed it, it is the text in the centre of the screen, you won’t see the word “Abonnement” again. I used a fake account to generate some screenshots of the current sales process, but Deutsche Bahn changes it around every now and then, so neither can I be sure it looked like this when I bought my Bahncard, nor is it guaranteed to look like this when you go through the process.

I have some objections to the layout of this page. In my opinion, this text is designed to make people not take notice of the subscription. No mention of the timeframe or recurrent nature of the price. For completion: The probe Bahncard screen does not mention the price of the full Bahncard (492€) at all, only the probe price.

Let’s head on to the final sales screen; the intermediate screens only take in the user information and provide no additional information on the Bahncard.

Final sales screen contains the mention of an automatic extension, avoids the mention of the word “Abonnement” here and does not highlight prices as recurrent. If you buy a probe Bahncard it does not mention the price of the recurrent bahncard. (All personal data is fake.)

There is zero indication of the payments (the value of 492) being recurrent (“492.00€/year”); the probe version does not contain the price of the full Bahncard at all. The mention of the subscription does not use the word “Abonnement” (subscription) this time, instead says that it gets automatically extended by one year unless you cancel. It has no visual weight, unlike the “bahnde-Newsletter” abonnement (so if you ctrl+f “abo” you’ll end up in that section), and there is no option to not get the Bahncard as a non-subscription.

You buy the Bahncard and receive a confirmation email for your subscription. Although it does not contain the word Abonnement, any mention of renewal, the price of the subscription (only the reduced price of the sale in my case) or any indication of cancellation. You also receive a welcome email, letting you know about the advantages of your Bahncard, which, again, contains no information about cancellation, renewal, subscription, or prices.

You Now Have A Subscripton. How Can You Tell?

Congratulations, you bought a Bahncard subscription. You used it for a while and decided it is not worth the cost. You don’t remember getting a subscription, but you want to make sure! Unfortunately, you don’t try the obvious thing, but make the mistake of checking your actual account at Deutsche Bahn. So, where to search for the subscription?

Deutsche Bahn thought about that! They have a subscription portal called Aboportal. It is clearly labelled in the account menu, right next to the Bahncard option! Amazing. Here’s what it looks like for me right now:

The subscription portal of DeutscheBahn contains no mention of the Bahncard subscription.

I had two subscriptions in the past for Deutschland-Tickets; they were cancelled long ago, and they still show up. They have a lot of space for additional menu items; it seems they don’t believe in separating functions or user-friendly design — that’s just my opinion. No Bahncard subscription, though. I would not fault you for believing you do not have a subscription active after this screen and just quitting, but let’s try more.

So it has to be in the Bahncard section. Here are two entries, one is my extended Bahncard I never wanted, and one is my Bahncard Business that, fortunately, my company provides. Can you tell if, and which, is a subscription?

It’s very obvious if you know what you need to look out for. If you hit the “options” selector, there will be a third entry saying “Cancel Subscription” for a subscription. Also, Bahncard Business is not available as a subscription, so it can’t be one.

Lastly, when are you informed of the renewal? The cancellation time is 4 weeks before the end of validity. 21 days, or three weeks, before renewal, you will receive a notification for your new bahncard. It is too late now. You are stuck with it for another year.

If you cancel instantly anyway, you will receive an automated cancellation reply with the following neat sentence:

Ihrem Wunschtermin können wir leider nicht entsprechen, da eine Kündigung nur bis spätestens vier Wochen vor Ende der Laufzeit möglich ist. Dafür bitten wir um Verständnis.

Automated DB Email for cancellation

Translation: “Unfortunately, we cannot accommodate your requested date, as termination is only possible up to four weeks before the end of the term. We apologise for any inconvenience.” Deutsche Bahn has fully incorporated the subscription trap into the response. They are aware of it, they know you do not want it, and they let you know: They will not cancel.

Contacting Deutsche Bahn Support

If you are remotely acquainted with German support standards, you can probably skip this section. Deutsche Bahn has no intention of providing any form of good support.

First, you’ll have trouble finding a way to contact them, that is, not by phone (or in person). After some searching, you’ll find a contact form linked in some places that does not work. In the end, I managed to get a response from this email address: bahncard-service@bahn.de

I sent them a message about how I tried to figure out that I have a subscription recently and did not find anything, and how I never wanted this renewal, how I was never informed of the increased cost (as I bought it on sale). To prevent any misinformation about my email, here is the translated original:

Last year, I purchased a Bahncard as part of a special offer.
A few weeks ago, I checked to see if I could find any information about a subscription, as I don’t want another Bahncard—I only needed it for one year.
I couldn’t find any information in my original confirmation email or on the website, and the subscription portal doesn’t list it either.

Today, I suddenly received a message saying that I will receive a new Bahncard in three weeks.
I canceled it immediately online, but unfortunately I was told that it was too late and that I should have done so at least four weeks before the expiration date.
The only email with the words “subscription” and “Bahncard” is the new Bahncard email.
Furthermore, the email does not contain any information about any costs associated with the Bahncard.

???

Translation of my email to the support.

As far as I can tell, I received a standardised response. You can find the translated version here:

Thank you for your email dated September 21, 2025.

For all offers on www.bahn.de, the contract is only concluded at the end of the booking process.

Before completing your purchase, we will inform you about the terms and conditions for purchasing and using the BahnCard.

You acknowledged this directly during the online booking process and accepted it by clicking “Buy now.”

From October 1 to October 13, 2024, the BahnCard 50 was available at a discounted price.

After that, the BahnCard will be converted into a regular subscription.

We regret that you disagree with our decision to cancel your BahnCard.

The BahnCard subscription can be canceled annually up to four weeks before the end of the validity period. The date of receipt of the cancellation by BahnCard Service is decisive.

We ask for your understanding that we are sticking to our decision.

We have still scheduled the cancellation of your BahnCard **** for **. **** 2026.

Translated with DeepL.com (free version)

Translation of the support email.

Another back and forth led to the same result. This problem is common enough that a lawyer put out a default letter template for refusing, which I used for my second letter. It comes up on Reddit frequently, although I do not understand the people who defend this.

As far as I can tell, the previous attempts by Verbraucherschutz to sue Deutsche Bahn over this were unsuccessful. The layman’s summary I got from this court decision: As the Bahncard is a discount card and not a subscription to a product or service itself, it does not fall under the consumer protections that the Verbraucherschutz sued over.

Deutsche Bahn: No Reputation To Lose

The Deutsche Bahn has no reputation they lose. The discourse is dominated by their terrible service, delays and cancellations. They have no incentive, as a company, to improve other sections like the Bahncard sales tactics. They, as a company, have nothing to lose.

We as a society have a lot to lose. Deutsche Bahn is 100% owned by the state of Germany. We consumers do not cleanly separate companies from their owners. Many even think of Deutsche Bahn as a state company. Feeling cheated by your government is not good.

Further, Deutsche Bahn is a core infrastructure company for more eco-friendly transportation. Driving people, like me, away from using the Bahn is bad in so many ways. I have a high desire for fairness; if I feel cheated, I’d rather take a higher loss to myself than support the person or company that cheated me. However, I have little recourse in this whole debacle, but I’d rather drive my car more, or even rent one, than use Deutsche Bahn… and I really like taking trains. I love being lazy while the landscapes fly by instead of focusing on the road and getting annoyed at other drivers. All this, despite not a single one of my ~20 train journeys the last year being on time, and a dozen of them not even honouring my reservations, being overrun or flat out cancelled. None of that made me quit taking the train. Feeling cheated by Deutsche Bahn sure does.


This post was written as anger management. This whole desaster of communcation, despite “only” being 500€, cost me so much productivity, motivation and more. I hate dealing with these kind of things. It followed me around all day, made me lose sleep, just because it annoyed me so much. Now I feel better. So for some fun: My first email to Deutsche Bahn netted me 8 recipient confirmation emails by deutsche Bahn, neatly spaced by around 3 hours each. Then they took 2 days to respond to my first email. For the second email I received only 1 confirmation, but got to wait 15 days for a response.

Categories
Uncategorized

The Shitty Cactus Journey

Shitty Cactus Fake release ad.
Fake ad I created after seeing release ads by other games.

Like many devs, I started a few projects. And like many devs, I never really finished them. My self made website CMS? There’s no admin panel. Once the front was done, I just started editing the tables using phpMyAdmin.
My shitty idle game? It was stuck on version 0.11 with 7 half finished, or not even started, features. Or the insanely terrible 3D weekend game challenge.

But that 3D project gave me an idea.
The basic capsule shape with the weird texture looked like a cactus to me — with enough fantasy at least. How about honoring that cactus, and make it into an actual game?

The 3D version didn’t work well, so how about a 2D platformer?
Climbing up and up, evading deadly enemies, swinging on ropes!
I instantly started with some character sketches.

Shitty Cactus character design.

It had to be a cactus. I already wondered how many people would question the jump abilities of a cactus though. Quickly I set up a unity project and started working.

The inital cactus design looked terrible in unity, quite a disappointment. So I created a smaller one, but tried to keep at least the “facial expression”.
But I really wanted to keep the big design for something.

A game needs videos!

David, motivated by Humble Bundle

When I came across the 2D Animation Humble Bundle, I knew what I had to do. It was so obvious: A game needs videos! So without thinking, I bought it. It wasn’t as useful as I hoped, and probably a waste of money, as there are open source, or at least free, animation solutions out there. But it resulted in a nice, according to my standards, intro video.

When I finished the video after hours and hours of work, I felt like I was missing something. The game for the video! After setting up the unity project and creating a smaller character, I had done nothing.
No gameplay, no menu — just emptiness.

Art and Features: Not Easily Seperatable

I decided to scrap some features I had imagined.
Just getting the base gameplay down.
Jumping and platforms.
I started with the jumping.

The GDC talk on jumps made me create my own jumping physics.
I even redid all the math, because I needed it in my own notation.

Jump calculations.

By now I believe, I should have stuck with unity mechanics, but I thought I had to do it manually.
Implementing the jump and movement created a lot of problems later on, without much of a payoff: I couldn’t use many unity provided helpers, but had to solve most of the problems (e.g., getting stuck in platforms, not correctly using normals and more).
But in the end, it worked somewhat as I expected: I could set jump height and length, or duration, and have a jump with those properties, which came in useful much later on platform generation.

Creating platforms took quite a lot of trial and error, until I found some that didn’t look completely terrible.

Art design of shitty cactus.

Originally I wanted to scale the platforms during the level.
This turned out to be much harder than I expected.
Getting the tiles correctly was the easy part, but the level generation was tricky.

At first I just created 4 platforms on each plane with random distances from each other.
They mostly clipped into each other.
I created an array of distance ratios of the game width, which summed up to 1 when including the width of the platforms. While that fixed the clipping, the level was extremly boring. Each layer was at roughly the maximum jump strength from the last and everything looked very uniform.

I needed a better level generator.
So I wrote down all the constraints I had.

Platform calculations.

Most of them based on the jump properties, but also the width and height of the platform.
I made many many miscalculations, forgot as many details as I remembered, but in the end it… kinda worked.
Let’s say it was better than the previous one, and actually playable. I looked upon the game, and felt a little proud, but also that it was terrible.

I had two friends play the game (shoutout to Lazitus and Gariot, your suffering won’t be forgotten).

The worst bug was: Getting stuck in clouds, helplessly moving around.
Unless you let go of the controls, then it would magically move you upwards! At least it wasn’t gamebreaking. I tried a lot of things. I came across Platform Effector 2D and noticed: unity had what i needed. Platform effectors modify the behaviour of collisions with platforms, e.g., allows a character to jump through from one side!

Remember when I said it was a mistake to implement the mnovement myself?
Those don’t work if you do this. I tried implementing them myself, and it mostly worked. And by that, I mean: I could do as much as before, but still had the bug if the angle of collision was too low. So I scrapped all the complicated code, and used my simple version again, but put in more margin of safety and it mostly worked as well.
Finally a finished game!

Visual Only User Interface

Unless you count having a UI instead of just an endless level. Then it was unpolished and unsueable! As I wanted to do everything myself, I created some UI sketches, which I then made into UI elements.

Overview of the Shittycacus UI Design Process

I had to build my own ring indicator and combined upgrade elements, but I didn’t have upgrades yet anyways, so I didn’t put too much thought into it. Maybe I should have.

One of my design goals was being able to use it without any language, so everyone that would like to play it, could do so.
Mostly because I didn’t think there were more than 1 interested players if I restricted it to any language — I did call it ‘Shitty Cactus’ after all.

I made up some rough ranges for upgrade ideas and tested them.
Jumping too high, would be detrimental, making it much harder.
The same for many others.
After some hours of playtesting, I came up with some values, split them and made up some costs. I linked everything in the UI and felt I was done.
But the game felt open ended and unsatisfactory.

I decided that the game needed an outro video.
It was easily created, if you disregard 10 hours of getting back into the animator software and failing to create anything in the way I imagined it.
But how and when to play the video?

I tested some more, and felt 1200 was a good height to unlock it. But unlocking it, and switching to the play scene, would kill the progress.
There’s a good and an easy solution to that! The good one, storing the state and being able to reload it. That would be useful in many other cases, too. Obviously I went with the easy one: Unlocking it, and you have to watch it in the main menu (or simply in the folder if you have the offline version).

Finally, I felt, I had a full game.
But now I wanted to feel like a real game dev, so I decided to publish the game on steam for fun. It was quite the interesting experience.
The requirements are easy: Pay 100$, fill out some tax forms, create lots of game art, have the shop page in “coming soon” mode for at least two weeks, and you get to release the game!

What steam doesn’t tell you: Once the shop page is online, you will get indie-game-marketing spam. It would have been nice, if they felt less than fully automated emails with a small placeholder for the game name. But that’s a lot to ask for such a small and terrible game.
Though, I didn’t take this too seriously, so I didn’t respond.

Instead, I gave my friends each a free key and one told me: “It would be cool to have leaderboards.” That was the day I realised: There are leaderboards on steam.

Steam Leaderboards and Achievements

There is a nice implementation of the Steamworks steam SDK for C#, and therefore unity. It was especially easy to get into. Adding some statistics and leaderboards was covered by the example, so they could be added with little code.
It was already time for my first patch!

As they say: Never play on patch day — and I enforced that! I never set up the steam pipeline, instead I uploadzip archives of the game folder. Those get preprocessed by Steam and are then published to players.
This time, I zipped the folder. Not the contents. This made the game unplayable, as steam was configured to search “shitty cactus.exe” only in the root folder. Quickly I created a new patch and uploaded it, hoping none of my 3 players would notice — so I could tell them instead personally.

I worked so well, I started to look into steam achievements, the culmination of steam! It’s quite easy, if you base them on existing statistics.
When you do that, they get awarded automatically, once a statistic above the threshold is submitted.
Otherwise, you manually have to set the achievement from code.
I opted to include only easy achievements for now, and created seven of them: Reach some height or reach a set amount of coins. One achievement for height was masked as a “play at least once” achievement, by setting the required game to height. I included a “don’t forget to jump!” in the description.
Each achievement needs two pieces of art: Unlocked and not unlocked.
Turns out, greyed out achievements are only a recommendation for not yet unlocked achievements.

After setting them up and publishing the changes, they were live instantly.
It turned out, I only manged to get 3 out of 7, while a friend of mine and a reviewer from japan created highscores that felt insane to me.

Marketing Attempts

Lastly, I wanted to try a feature of steam I didn’t know existed: Curator connect. You can send up to 5 keys to up to 100 curators and reviewers.
To be honest, I just randomly selected reviewers at first and wrote “don’t play it, I just wanted to try the feature”.

In the end, 10 people bought the game, and one actually played it. The best thing about all of this, was the feeling when that one guy, a person I don’t know personally, reviewed the game without even being asked to: “It’s aight”.

I was lowkey proud of it and created a short imgur post.
I even linked to a temporary free download of the game (without steam features), because I felt like I am writing an advert, which I didn’t like.

After retracting the keys from the curators, I wroter a nicer message this time, something like “Seems like the game is not as bad as I thought, it would be nice to get a review, thanks.” I guess in the end, if you want someone to play your game, you have to tell people. And people don’t like bad self degrading humor in advertisements and even less in call outs to reviewers. Maybe I should stop prefixing my game names with ‘Shitty’.

That’s it.
I continue to work on the game sometimes, currently I plan to add a leaderboard for shortest time to 1200, I want to try the steam sale feature, too. But I won’t do anything big with it.

Once I lose interest, I will put the whole project on github (probably january ’21 or later), but for now the repo is locked.
It’s not a great game, but it’s not terrible either.

Don’t make the mistakes I made, believe in your game if you want it to be a success — whatever that means to you.
But at least I can say: I shipped a game (and lost some money while doing it), which is a success in itself.

Good luck everyone!