Don't go directly to Omniture; go to a "middleman" which fetches the data.
I've never even heard of Omniture, but it sounds like senarios where your UI is going straight to the data layer - in which case you need a business logic layer in between. That's the principle, anyway.
- Create a layer of logic that handles all communication between the UI and Omniture.
- The first UI call hits the logic layer / controller, e.g: Logic.GetPromotion()
- When that happens have the logic call omniture - get it do one batch call that gets all the data, much as you've descibed.
- Pass the requested data (Logic.GetPromotion()) to whomever called it.
- When the other calls hot the logic layer, it pulls that data out of the information it's just received - not from omniture.
Basically it's the Lazy-Load pattern; with the various concerns seperated - I'm not sure if I'd call it MVC - just properly structured (?).
One potential gotcha with this approach is that your calls are async - the logic controller might get a second call while it's still waiting for the results to come back from the first. I haven't done anything along these lines myself, but there are plenty of multi-threading / concurrency type design patterns out there that will help.