Operations · 8 min read
How to Manage Ad Accounts Across Multiple Brands
If you run paid media for one brand, your problems are creative and CAC. If you run it for six, your problems are logistics — switching accounts, reconciling dashboards that disagree, and guessing which budget change actually shipped. That's not a strategy problem. It's an operations problem, and here's how to fix the structure underneath it.
Every brand you add makes the portfolio harder to see, and the harder it is to see, the more of your budget decisions get made on the loudest recent anecdote instead of the numbers. The fix is structural, in a specific order: access, naming, reporting, then budget.
The four failures that show up in every portfolio
Before you fix anything, name what's actually broken. In multi-brand setups it's almost always these four, in this order.
- Access is a hairball. Some accounts sit inside your Business Manager, some are shared to you as a partner, and some you reach through a client login that got emailed to you in 2024 and never rotated. You cannot answer, on demand, who has write access to a given brand's account — and that's a real risk, not a hypothetical one.
- Nothing is named the same way. One brand uses a bracketed human-readable scheme, another uses a lowercase slug, a third names campaigns after whoever built them. Any cross-brand rollup breaks immediately because there's nothing to group on.
- There is no portfolio view. Each platform shows you one account at a time. Nowhere does anything show you all six brands, on all three channels, against blended spend — so you rebuild it by hand every week and it's stale by Wednesday.
- Budget moves are reactive. Because you can't see the portfolio, you reallocate when someone complains. The brand with the most vocal owner gets the incremental dollar, not the brand with the best marginal return.
Fix the access layer first
Everything else depends on this, and it's the part people skip because it's boring.
Stop using shared credentials
If your team logs into a brand's account using its username and password, you have no audit trail, no revocation path, and no separation between what you did and what they did. When something goes wrong — and at portfolio scale, something always goes wrong — you cannot prove what happened.
The correct architecture is per-account OAuth. Each brand grants your tooling scoped permissions to its own ad account — write access for management, read-only for reporting — and the account owner keeps control of the asset while you hold a scoped, revocable token. Access is granted per brand, not pooled. Pooled credentials mean revoking one person forces a password rotation on everyone; per-account OAuth means revoking one brand is a single toggle and nothing else breaks. We go deeper on this tradeoff in per-client OAuth versus agency credentials.
Use asset groups, not sprawl
On Meta, business asset groups let you bundle a brand's page, pixel, and ad account together and assign access to the bundle in one move. One group per brand. Permissions get granted to the group, never to individual assets. When a contractor rolls off a brand, you remove them from one group, not from four separate assets you have to remember exist.
Write down who has what
A permissions matrix — brand down the side, person across the top, access level in the cells — takes an hour to build and answers the compliance question forever. Review it quarterly. Least privilege by default: read access unless someone has a stated reason to write.
Then standardize the naming
You cannot roll up what you cannot group on, and you cannot group on inconsistent names. Pick a convention and enforce it across every brand, even the ones that already have hundreds of live campaigns. A convention that survives contact with reality is machine-parseable, uses a fixed number of segments, and puts the things you filter on earliest.
- Campaign:
{brand}_{objective}_{funnel}_{geo}_{yyyymm}— for examplenorthwind_conv_pros_us_202607. - Ad set:
{audience}_{placement}_{budget-type}— for examplebroad_auto_cbo. - Ad:
{creative-id}_{format}_{hook}_{version}— for examplecr1184_video_ugc_v3. - UTM: mirror the campaign name exactly,
utm_campaign={campaign-name}.
Two rules make this stick. Use underscores between segments and hyphens within them, so splitting on the underscore returns your fields and nothing inside a field can break it. And make the UTM mirror the campaign name string-for-string — if your platform name and your analytics name don't match, you'll spend the rest of your life doing fuzzy joins in a spreadsheet.
Backfilling old campaigns is painful and you should do it anyway. Rename in place where the platform allows it; where it doesn't, tag the campaign and move on. Two days of tedium buys you a portfolio view that doesn't require manual reconciliation.
Build the portfolio view
With access clean and naming consistent, the rollup becomes mechanical. What you want on one screen:
- Blended spend and blended return across all brands, not six separate ROAS figures. Platform ROAS is measured per platform, per account, and it double-counts — it is not additive. A portfolio number has to come from your commerce data, Shopify or WooCommerce, divided by total spend across every channel.
- Marginal performance, not average performance. Average ROAS tells you where you've been. What you need is where the next dollar performs best, which means watching how return moves as spend moves within each brand.
- Pacing against plan, per brand. Not whether you spent it, but whether you're on track to spend it in a shape that makes sense.
- Change history. Who changed what, in which account, when. When a brand's performance falls off a cliff on a Tuesday, the first question is always what changed on Monday — and if you can't answer that in ten seconds, you're guessing.
The honest answer about that last one: none of the ad platforms will give you a cross-account change log. You either build it or you use tooling that maintains one for you, spanning Meta, Google Ads, and TikTok in one place.
Once you can see marginal return per brand, moving budget stops being political.
Make budget reallocation a rule, not a debate
The whole point of the structure above is that it makes the next question answerable. A workable rule set for a portfolio:
- Set a floor and ceiling per brand. Nothing goes to zero, because you lose learning; nothing takes more than a defined share, because you lose diversification.
- Reallocate on a fixed cadence — weekly or biweekly — not when someone complains.
- Move in bounded increments, no more than 20 to 25 percent of a brand's budget in one step, so the platform's learning phase doesn't get blown up.
- Reallocate on marginal return, with a guardrail on CAC payback so you're not buying revenue that takes fourteen months to pay for itself.
- Write the reason down. Every move gets a one-line justification — that's how you find out, three months later, whether your reasoning was any good.
Rules like these are simple enough to run by hand at three brands. At six or more, running them by hand every week is a part-time job — the point at which people either hire someone to do it or automate it.
At three brands, a disciplined spreadsheet and a weekly calendar hold can carry the whole system. Somewhere between four and six brands, the coordination overhead — reconciling access, chasing naming drift, rebuilding the rollup — quietly grows into a role of its own. That's the honest threshold where automation starts paying for itself.
Where this leaves you
The pattern is the same every time. Portfolio operators don't lose to a lack of tactical skill; they lose to the overhead of coordinating six of everything. Fix access so it's per-brand and revocable. Fix naming so the data can be grouped. Build one view so the portfolio is visible. Then make budget a rule instead of an argument. If you want the reallocation logic in detail, that's covered in cross-brand budget allocation for paid media, and you can see how the whole loop fits together in how Cesara works.
Run every brand from one control plane.
Reserve founding-member pricing — no card, nothing charged today.