Blueprint names may not contain a dot. Flask 2.1 (March 2022) turned what had been a deprecation into a ValueError raised when the Blueprint is constructed, and the same rule applies to endpoint names passed to add_url_rule.
The reason is that Flask builds endpoint names by joining the blueprint name and the view name with a dot, and nested blueprints join further. Allowing a dot inside a name makes url_for("admin.users.index") ambiguous between a nested blueprint and a blueprint literally named admin.users.
A second rule catches people at the same time: registering two blueprints with the same name on one app raises an error rather than silently overwriting the first. When the same blueprint object must be registered twice at different prefixes, pass name= at registration to disambiguate. Inside a blueprint's own views, url_for(".index") with a leading dot resolves relative to the current blueprint, which keeps the code working when the blueprint is renamed or nested.