Notice that I'm passing the hash reference "\%item_hoh" to TT2 via TmplParams whereas you passed $HoH. I need to generate my HoH on the fly. While your code works for a hard coded HoH, mine doesn't and I don't understand why.

None of the data is displayed in my emails when I use this code ... and I don't understand why. Thank you so much, I really appreciate your help, and I would be happy to buy you lunch because I'd really like to include this data in a table format in my emails :D.

When you refer to something like item_hoh in the template, this is a key in the hash, not the name of the hash itself (TT2 knows nothing about the name — the hashref could also be anonymous). This isn't any different from using flat hashes to define/set TT2 variables, btw.

The solution is to just wrap another hash around it, e.g. an anonymous one (in my example above I used a named one, $HoH):

The curlies create an anonymous hash(ref), and the value of the entry keyed by "item_hoh" is the ref to your hash %item_hoh. The name of the latter is irrelevant. In case you need to pass more top-level items (like the item_hoh), just add further entries in the anon hash.