I wrote the most of the FCM flow, but honestly I have no idea. The whole doc is a huge mess and most of the time ‘trial and error’ is the only way to “know” if sth is working as expected or not…
Some thoughts:
we use the “new” api and not the “legacy” one that you refered as the doc (new docs)
digging deeper; we use this converter to reach this part of the docs and it says that if you use the payload you need to add the title and body “again” (BTW your code seems to ok based on the doc)