It allows the service to be run in multiple instances. For example, the same script could be used with different usernames or sockets.
This is a copy-paste from systemd.unit manual
Optionally, units may be instantiated from a template file at runtime. This allows creation of multiple units from a single configuration file. If systemd looks for a unit configuration file, it will first search for the literal unit name in the file system. If that yields no success and the unit name contains an “@” character, systemd will look for a unit template that shares the same name but with the instance string (i.e. the part between the “@” character and the suffix) removed. Example: if a service [email protected] is requested and no file by that name is found, systemd will look for [email protected] and instantiate a service from that configuration file if it is found.
To refer to the instance string from within the configuration file you may use the special “%i” specifier in many of the configuration options.
edit: https://superuser.com/a/393429 has a good answer to this