In regards to timing, our general strategy is to specify targets (audience, context, dates) as much as possible to avoid creating too much noise.
We have an ongoing calendar for planned messaging, and also roll out "just in time" messaging when needed. Still, the goal is not to have multiple messages targeting the same user simultaneously, and ideally with downtime of at least a week between larger (systray/dashboard) messaging.
Right now, I'm working on making some very context-specific messaging and walkthroughs that may remain active since they involve processes that are used less often.