In general, we recommend tenant-based applications to use a stack per tenant. This gives you strong isolation of resources and treats each resource as its own "deployable unit".
But more generally, this depends on how you treat them. Do you want to roll out changes to all tenants at once? If so, you'd probably want them in a single stack. Do tenants need customization and you would want to roll out changes more granularly? Then separate stacks are likely better.
As for coordinating multiple stacks at once, doing this within a CD tool and having separate pipelines per tenant is a good option if that's scaleable for you.
This is also a great use case for our newly released Automation API that would give you programmatic control over creating and updating multiple stacks at once.
https://pulumi-community.slack.com/archives/C019YSXN04B/p1599059943001100