Thank you for the response, @andrewatfornax My thought is that since I'm already using PHP to generate a random number for the CB argument, I could do the same thing for a correlation identifier argument. Yes, each email would have its own CI, but generating those would be as simple as creating a GUID or large random number. Those identifiers wouldn't need to be tracked by the ad server until the banner is served. When we log the impression, we would also temporarily cache the CI. When the banner is clicked, we look up the banner ID using the CI. And the cache self trims with time.
If someone is going to click that Banner, I imagine it would be within minutes or an hour of the impression, so the cache items should not need to hang around too long. This hopefully reduces scalability issues unless you get hit with a massive amount of email reads at once. Even then, we can limit the size of the cache and the worst case is that some clicks go unlogged.
To be explicitly clear, the ad server cache of CIs would only include at any given moment the most recent Banner impressions. The invocation code in each email would be different, but no more difficult to create than the CB parameter. And as a mail recipient, the email may include different banners each time I view it.
What do you think?