Just in case anyone comes across this post and thinks this is useful information, I’ve been doing a little research and this is what I’ve found:
notify.notify will notify one of the platforms (and only one) without a “name” attribute.
The thing is, when calling the service “notify.xxx” you are calling the notify platform and the “xxx” notification integration through it’s name.
And here comes the confusion (and I think it’s not an ideal design), the name’s attribute default value is “notify” (in any notify platform integration). So, if you don’t overwrite the default value for the “name” attribute on your notify integrations, all of them will become the service name “notify.notify”. HA doesn’t call them all, probably the “notify.notify” service data is overwritten with each definition that doesn’t have a name. I’ve gone through the code trying to find it out but I am not into Python at all, so I don’t have a clue on which is the behaviour. I can tell it is not the first/last definition, I’ve tried moving platform configurations and I always got notifications in this order: “mobile_app” > “hangouts” > “smtp”.
This means in fact, that “notify.notify” is not really a default service for notifications, but the casual result of omitting an attribute in any of your notification platform configs. The fact that installing the HA mobile app automagically creates a notify integration configuration behind the scenes that also targets “notify.notify” service name only adds more confusion.
This means that if you only define one notify platform without name, it will be reachable through the “notify.notify” service. If you only define one notify platform with a name, you won’t have a “notify.notify” service (you’ll have to call it through “notify.platform_name”). If you have the mobile_app installed, no matter what, this is the one that will get “notify.notify” notifications.
It’s very confusing indeed, and I really think it could be better explained in the documentation. I found this issue that gave the best clues, but it was closed without a conclusion:
Hope this helps anyone.
PS: I know all of this is exactly what @tom_l was saying, but I just wanted to have a broader explanation.