I had the same issue on the FreeProduct promotion, still haven't looked for a nice solution. But for sure it has to be generic and works with any model.