The agency connects the client's Google Ads or Meta account without ever touching their password. It's the right way to scale the onboarding of dozens of accounts.
Incremental on large tables, run during business hours and weekdays, and shut down pipelines for departed accounts.
Each agency organizes the layers as makes sense. What matters is the concept: raw, refined, ready.
| date | customer | channel | invest | leads |
|---|---|---|---|---|
| 2026-06-01 | Silva Store | Goal | R$320 | 18 |
| 2026-06-01 | Silva Store | R$410 | 22 | |
| 2026-06-01 | Cafe Aurora | Goal | R$ 280 | 15 |
Mixing customer data in the same table without isolation breaks everything, and confuses the AI. Manual cross-checking in a spreadsheet does not scale.
One layer per client, or folders per client within the layers. The important thing is that isolation has no exceptions.
With the metric recorded, the agent responds with the business rule for that account, instead of guessing.
| customer | channel | invest | revenue | roas |
|---|---|---|---|---|
| Acme | Goal | R$ 8.2 thousand | R$41 thousand | 5.0x |
| Silva Store | R$ 5.1 thousand | R$ 12 thousand | 2.3x | |
| Cafe Aurora | Goal | R$ 3.4 thousand | R$ 18 thousand | 5.3x |
Prefix per client guarantees isolation. A consolidated Gold with the client column gives an overview of the agency, without mixing.
| Column | Description |
|---|---|
spend decimal |
Investment of the day, net of taxes, in BRL |
actions int |
Conversions attributed by the platform |
campaign text |
Campaign name, agency pattern |
There are ready-made templates for common agency cases, media consolidation and mirrored CRM, so you don't always need to write the SQL by hand.
Don't create a star schema when a wide table resolves. A beautiful model in the diagram is often expensive in practice.
Enrich via external API, apply an ML model, process free text or nested JSON, and iterative calculations. Rule of thumb: SQL for most, notebook when you need logic or libs.
| data_id → dim_data |
client_id → dim_cliente |
channel_id → dim_canal |
invest |
|---|---|---|---|
| d_06 | cl_31 | ch_1 | R$320 |
| d_06 | cl_31 | ch_2 | R$410 |
| date | customer | channel | invest | conv |
|---|---|---|---|---|
| 06-01 | Acme | Goal | R$320 | 18 |
| 06-01 | Acme | R$410 | 22 | |
| 06-01 | Silva Store | Goal | R$ 280 | 15 |
{
"client": "acme",
"invest_mes": 8200,
"roas": 5.0
}
Prefix per customer, more table descriptions, more context documents. With this, the agent navigates dozens of customers without getting lost.
A token limited to a customer's tables means the agent only sees that account. The customer's dashboard never reaches another's data.
| date | customer | channel | investment | leads |
|---|---|---|---|---|
| 2026-06-01 | Silva Store | Goal | R$320 | 18 |
| 2026-06-01 | Silva Store | R$410 | 22 | |
| 2026-06-01 | Cafe Aurora | Goal | R$ 280 | 15 |
| 2026-06-01 | Cafe Aurora | R$ 190 | 9 |
The app reads Gold via the Data API, with little code: fast, stable, and the customer accesses it whenever they want.