The issue is, that even e.g. you have two instances of the timer running you only have one instance of the item & contact name variable and once a new timer is starting your variables value will change.
The only way I know to accommodate this issue is to pass additional arguments to the timer.
I have resolved it by creating a new timer block that will keep the original event context (link). However this is only working if the blocky code is directly called from a rule and not as a script by another rule. maybe you need some further adjustments if you want to use it within a script triggered by a rule