A computer-implemented method at a server of identifying an installed instance of a software product, the method comprising: receiving (310, 402) a plurality of consecutive heartbeat messages, wherein the heartbeat messages comprise automated periodic communications sent from the installed instance indicating that the installed instance is running, each particular heartbeat message of the plurality of heartbeat messages comprising a respective identifier (702, 704) transmitted to the installed instance in response to a previous heartbeat message in the plurality of heartbeat messages; characterised in that, in response to receiving each particular heartbeat message of the plurality of heartbeat messages, the method further comprises: determining whether the respective identifier (702, 704) comprised in the particular heartbeat message corresponds to an entry in a historical list of identifiers and, in response to determining that the respective identifier (702, 704) does not correspond to the entry in the historical list of identifiers, determining that the respective identifier (702, 704) is not a valid identifier; generating (304, 406) a unique identifier; linking, in the historical list of identifiers (500, 600, 700), the unique identifier to the respective identifier (702, 704) in the particular heartbeat message; and transmitting (308, 410) the unique identifier to the installed instance to be used as the next identifier (702, 704, 706) in the plurality of heartbeat messages. receiving (310, 402) a plurality of consecutive heartbeat messages, wherein the heartbeat messages comprise automated periodic communications sent from the installed instance indicating that the installed instance is running, each particular heartbeat message of the plurality of heartbeat messages comprising a respective identifier (702, 704) transmitted to the installed instance in response to a previous heartbeat message in the plurality of heartbeat messages; characterised in that, in response to receiving each particular heartbeat message of the plurality of heartbeat messages, the method further comprises: determining whether the respective identifier (702, 704) comprised in the particular heartbeat message corresponds to an entry in a historical list of identifiers and, in response to determining that the respective identifier (702, 704) does not correspond to the entry in the historical list of identifiers, determining that the respective identifier (702, 704) is not a valid identifier; generating (304, 406) a unique identifier; linking, in the historical list of identifiers (500, 600, 700), the unique identifier to the respective identifier (702, 704) in the particular heartbeat message; and transmitting (308, 410) the unique identifier to the installed instance to be used as the next identifier (702, 704, 706) in the plurality of heartbeat messages. determining whether the respective identifier (702, 704) comprised in the particular heartbeat message corresponds to an entry in a historical list of identifiers and, in response to determining that the respective identifier (702, 704) does not correspond to the entry in the historical list of identifiers, determining that the respective identifier (702, 704) is not a valid identifier; generating (304, 406) a unique identifier; linking, in the historical list of identifiers (500, 600, 700), the unique identifier to the respective identifier (702, 704) in the particular heartbeat message; and transmitting (308, 410) the unique identifier to the installed instance to be used as the next identifier (702, 704, 706) in the plurality of heartbeat messages.