Skip to content

Marketing Studio

See what your campaigns do and cost, with entering figures, the advice to stop in time, margin and break-even, winning creatives and Ad Spy.

DocumentationMarketing Studio

What your campaigns do, and what that costs. The studio shows what has been spent, what it earned, which campaign needs attention and which creatives are doing well or badly. You work with figures here, not images: you make the images in the Creative Studio.

One rule runs through everything: the studio does not invent a figure that is not there. "No measurements" is something different from zero, and that difference stays visible. Where a source is missing, it says which source is missing. A figure that was entered by hand is shown as manual, with how old it is.

Overview

The start screen shows at a glance:

  • Spent and revenue across all campaigns, and the return per euro (ROAS).
  • What needs attention now, ranked by advice and by how far a campaign is over its limit.
  • Campaigns that do not pay for themselves: the campaigns whose measured ROAS is below break-even.
  • Spend versus revenue per day. That is only possible once one campaign has been measured on two different days, because it is the difference from the previous measurement. If none qualifies, the screen says there are too few measurements.
  • Best and worst creatives by ROAS.
  • Which connections exist and what you are missing while a connection is absent.

Campaigns

A list of your campaigns with, per campaign, the latest measurement: spent, revenue, ROAS and the advice: continue, warn or pause. You can filter by advice and source. Click a campaign open for the measurement history, per measurement.

The advice to stop in time

A campaign that keeps running while the money is already gone is not a margin problem but a discipline problem. That is why the studio has rules. By default:

Once spend reachesAnd there is still noAdvice
10 eurosadd to cartwarn
20 eurosadd to cartpause
30 eurossalepause

On top of that, break-even applies: if the studio knows the break-even ROAS of a product and the campaign is below it, that is shown too. The screen also shows how far a campaign is over the threshold, because that figure is the reason the rules exist.

Conversions sometimes arrive late. Within the attribution window (24 hours by default), a pause advice therefore becomes a warning. Not ignored, but someone does have to look at it.

It is advice. The studio does not pause anything at Meta or Google. You do that yourself in the ad platform.

Entering figures

Under Figures you enter what a campaign or an ad has done.

  • A campaign. Give the key, the name, when it started, and the total so far: spent, adds to cart, sales and revenue. That is the total since the start, not what was added since the previous measurement: adding two measurements together would count the same spend twice.
  • An ad. On the creative key from the delivery, in the form batch_variant_hoek_formaat_taal. It is in the file name and in the utm_content of the landing link, and it is the only thing an ad platform reports back intact. With impressions, clicks and spend.
  • Pasting an export. Paste the CSV from Meta, TikTok or Google Ads. Column names are recognised in Dutch and English, with point or comma decimals and with the semicolons from Dutch Excel. One row per ad, not per day. Rows that are not valid are reported and not silently skipped. If an export is too long, the screen says how many rows are allowed at a time and you split it.

What you enter by hand is recorded as manual, a pasted export as CSV. Two measurements at the same moment count as one, so an export that you paste again duplicates nothing.

Automatic figures from Meta Ads, Google Ads and Google Analytics 4 are marked "Coming soon": you cannot turn those connections on yourself yet. Until then, figures only come in by hand or via a CSV, which is why every figure shows how old it is. Once a connection works, Denkploeg fetches the figures every morning, read-only: nothing goes back to the platform.

Creatives

Which choices win? Real results per angle, format, language or ad, ranked by ROAS, only what already has spend. That way you see whether the angle "gift" works better than "discount", or landscape better than portrait. Results only appear once an ad has been measured with the creative key attached.

Margin

The question: what may a customer cost? Enter:

  • selling price including VAT,
  • cost price (without it the studio does not calculate: the server refuses),
  • shipping costs,
  • VAT fraction (21% is 0.21),
  • transaction fees, as a fraction and as a fixed amount.

You get:

  • Revenue excl. VAT per unit sold.
  • Gross margin per unit, after cost, shipping and transaction fees.
  • Break-even ROAS: how much revenue you need per euro of ad spend to break even. Below that, every sale costs you money. If there is nothing left to advertise with, it says "Not achievable".
  • Max CPA: the most one sale may cost in ad spend.
  • Sensitivity: what your max CPA becomes if the cost price turns out ten percent lower or higher.

The break-even comes from the product's margin, not from the ad platform. If you enter it with a campaign's figures, the advice can check against it.

Ad Spy

See what others are advertising. Ad Spy searches the ad library of WinningHunter. For that you need your own account at WinningHunter, and that costs money with them. Denkploeg does not resell their data.

Connecting

  1. Take a subscription at WinningHunter. The starter plan gives a hundred searches a month; that runs out quickly once an agent searches along, because every search counts.
  2. Open Connections, choose WinningHunter and sign in with your account. Adding your own API key remains supported.
  3. An agency can explicitly share its account with this workspace. Your own connection takes priority; accounts are never shared without that choice.

Without a connection, Ad Spy shows "No connection yet". Sign-in and API keys give compact search results in the same format. Store country, active status and date filters are not yet available through sign-in; you get an explanation before any request.

The payment lock: every search costs a credit

Every search costs one credit at WinningHunter, even if it finds nothing. That is why you have to fill in at least one filter (a search term, a country or a run time) before you search: without a filter it is their whole library and it costs a credit without an answer. A search returns fifty results; Next fifty costs another credit. Their limit is sixty calls a minute. We cannot see how much allowance you have left.

Each result shows how long the ad has been running, how many copies there are and whether it is still running. Our score from that is a signal, not proof: whoever keeps paying for a long time is probably making money on it, but there is no revenue, no margin and no conversion figure with it. Filtering by run time happens within the fetched page; paging further brings up other candidates.

Saving and making a briefing

  • Save to a board. A board is a collection of ads that someone took the trouble to keep. A card is a reference with a snapshot, not a copy. An agent that wants to put something on a board asks for your signature first through the director. Viewing a board costs nothing.
  • To a briefing. Turns an ad into a briefing proposal. That costs no credit. You choose what you borrow (the hook, the build of the image, the type of offer, the format, the proof) and write it down in your own words. A tick without words does not count. What never comes along: their image, their literal text, their logo and brand name, their figures. As long as questions remain open, it is a proposal and not an assignment.

The weekly report

Under Weekly report the latest full week sits next to the week before: spend, revenue and what each euro returned, with per campaign a piece of advice (scale up budget, reduce budget) as soon as there is enough data. A day without figures is unknown and never counts as zero: it makes the comparison incomplete and is listed under "What we do not know". Advice also says which data is missing, for example revenue, break-even ROAS or the exchange rate. At the bottom is the decision log: what was proposed, what was signed or rejected and what it did afterwards.

For a campaign that does not earn itself back there is Propose pausing. That does not pause anything: the proposal appears under To sign and is only carried out after your signature. Raising a budget and resuming a campaign also ask for a code, because they let the platform spend more.

Via MCP and the director

Reading is direct and costs nothing: marketing_campagnes (the latest measurement with the advice, and verouderdRisico for figures entered by hand), marketing_besteding, marketing_killregels, marketing_marge, marketing_dashboard, marketing_maandrapporten and marketing_rapportanalyse, and for Ad Spy adspy_bord_lezen (the boards and their cards, without saying who saved something and without spending a credit).

Proposals that a human signs in the portal, under Approvals. The card shows the complete content that will be carried out, nothing cut off:

  • marketing_cijfers_invoeren: manual figures for a campaign. Only after your signature are they recorded, with source handmatig (manual), and the advice rests on them. A measurement is fixed. Figures are cumulative: spent, revenue, sales and add-to-carts are not below the previous figures, a Meta or Google figure is never overwritten, and an existing campaign keeps its name and start date. At most three open cards.
  • marketing_campagne_actie_voorstellen: pause, stop, resume or raise or lower the daily budget, with a reason. This stays a proposal: signing changes nothing at Meta or Google. You carry it out yourself in the ad platform. Setting live or changing a budget through MCP does not exist.
  • adspy_zoeken: a search costs a credit from your WinningHunter pot. The card shows the complete search and the estimate (one call, one credit). Only after your signature does adspy_zoeken_uitvoeren run it once; that is the only paid call. The result comes back once and is not stored, and a failed attempt is never silently repeated. At most two searches wait at the same time and a card is valid for one day.

adspy_bewaren puts an ad on a board of your workspace (a card of its own with a handful of fields, source mcp, at most 50 boards and 200 cards per board). It costs nothing and does not leave the workspace. Through the director it does ask for your signature; through an external MCP client it is direct. Google Ads has a page of its own.

Deliberately not: setting live or changing a budget at an ad platform, changing or deleting a measurement, removing a card or board, and searching Ad Spy without a signature. Everything read from Ad Spy (names, texts, notes) is text from outside: a client reads it as data and not as an instruction. See Connecting via MCP.

Client dashboard proposal

The dashboard proposal opens with Ploeter from the shared demo set. A compact bar contains client, period and comparison; the other controls are under Refine. Three short statements summarise the selected figures before the charts. Tabs respond with a subtle underline; director rows provide feedback through the arrow. Source data is fictional. There is no simulated live activity.

Choosing or adding a marketing profile demonstrates the future CRM or Planning connection. It creates an empty profile in this browser session, then shows the sources you could connect. No real client or connection is created.

CSV and monthly reports follow the selected filters and comparison. Store revenue, GA4 attribution and platform claims remain separate. Report sharing, API, MCP, real connections and director investigations are explained but inactive. On-screen help explains these boundaries.

Reports follow the approved agency or own workspace brand profile. Sender, profile version, colours, typefaces and vector logo stay with the report snapshot. HTML includes brand fonts and PDF uses sharp vector shapes and selectable text. Reporting requires a valid sender profile. The local demo uses explicitly fictional brand profiles; the real profile adapter remains future work.

Help, Share and Monthly report are at the top right. Channel and campaign details show results, comparisons and source/measurement definitions. Without a comparison period, that detail tab is disabled with an explanation. Missing data, permissions or a brand profile disable export with a visible reason.

The demo supports several local client profiles with a website, including clients without a Denkploeg account. Website & shop includes fictional mobile/desktop PageSpeed results using the same component as Website Studio. Rerunning measurements is deliberately inactive. Real CRM storage, domain verification, measurements and automatic monthly drafts are covered by the implementation plan and are not yet connected.

Agency client reporting

An agency can manage multiple clients from its own workspace, including clients without a Denkploeg account. Link an existing CRM relationship and client brand, or create both with Add client. Different agencies retain separate client lists. Access requires Marketing, internal CRM read permission and the reporting feature being enabled. Adding clients requires CRM write permission; changing source accounts requires management permission and recent session confirmation.

Choose a client, calendar month and comparison. Source details show the selected account, measurement coverage, definitions and missing data. Calendar months can have different lengths. Partial data does not become zero; unique visitors are not added from daily counts. CSV, screen and report use the same selection. Unsupported breakdown filters remain visibly disabled.

Then choose the report type (SEA, SEO or Total), a calendar month or a custom period (from and to, at most 93 days, not in the future) and the platforms to include (Google Ads, Google Analytics, Online store). A custom period compares with the same number of days directly before it, or the same dates a year earlier. Create report gives you a PDF and an HTML page with charts, tables and the comparison, always in your own agency's brand. On a phone, tables become cards. In the overview, Preview opens a frozen report in a panel beside the list without leaving the page (also from the Client reports card on your workspace dashboard); Full screen opens the report itself.

Report for this client: per client you switch blocks on and off (key figures, goals, Google Analytics, Google Ads, campaigns, Google Ads by region, by hour and day, by age and gender, quality score and budget with pacing, SEO from Search Console, traffic from AI services, shop funnel, notes), choose the fields per block and their order, write your own notes and set goals, for the report period or for this year to date. Every report for that client, including the monthly schedule, follows this template. Copy applies the template to another client.

Google Ads in depth. For a linked Google Ads account (read only), five blocks show what is behind the total: the regions with the highest spend, clicks by weekday and hour, age and gender (search and display campaigns only), the quality score per keyword and the budget with a forecast. Region, time and audience are kept per whole calendar month: a custom period that is not a whole month does not show them, and a running month is provisional. The quality score is a status of one week, not a figure for the period, and the budget is known from the day Denkploeg started recording it. What is not known is never shown as zero.

SEO, AI traffic and shop funnel. Search Console belongs to the client's brand: choose the property in Measurement, and the report shows clicks, impressions, CTR and average position, with the ten search terms with the most clicks and how many places they rose or fell. Position and CTR are weighted by impressions, as Search Console itself calculates them; anonymised queries are missing from the search terms. Traffic from AI services counts visits from ChatGPT, Gemini, Perplexity, Copilot and Claude based on the visit source in Google Analytics; someone who copies a link from an AI answer counts as direct traffic. The shop funnel shows visits, product viewed, added to cart, checkout started and purchase from the Google Analytics e-commerce events. Measured days from before this feature do not have a source per visit or events yet: they show as unknown, not zero. An existing template gets the new blocks added, switched off.

The whole Google Ads account. In the Google Ads source drawer you choose the client's account from the accounts your Google login can see. Denkploeg then reads the whole account, all campaigns, including those not created through Denkploeg, read only: nothing is changed at Google. The report shows cost, clicks, impressions and conversions, all campaigns, the split by device and the impression share of the search campaigns. Euro accounts only; you do not choose a manager account (MCC) itself, but the accounts under it that your login can access directly. Every night the last thirty days are fetched again, because conversions arrive later; a new account is filled in over a few nights from 1 January of last year. If Google refuses access, that shows on that source and nothing changes in your other connections. Connecting requires admin rights and a code from your app.

Create report freezes the measurements and the agency's active brand profile together. A vector logo and available licensed brand fonts are required. The PDF is a sharp digital A4 document with selectable text, vector shapes and embedded fonts. A missing profile, font file or failed quality check blocks the final download. Temporary failures retain the snapshot; Render again retries the same version. Downloads and document previews require an eligible subscription.

Reports remain private to the agency and outside the general asset library. Existing reports do not change when branding or measurements change. Sharing, delivery and automatic monthly drafts follow in a later phase. This version creates no public links and sends no messages.

The first version reads explicitly bound existing GA4 accounts and Google Ads campaigns created through Denkploeg. It does not import a complete external advertising account. Connect a client's online store in the Online store source drawer: the Denkploeg Webshop of your own agency, or Shopify (read only, with a key you keep under Secrets). You confirm it with a code from your authenticator. Denkploeg fetches net revenue (excluding VAT, after refunds) and the order count every night; the platform is shown on the source card and in the report. WooCommerce and Magento follow. Without a connection, or after an error, store revenue stays unknown and is never zero. Google Business Profile is a per-client source (views in Search and Maps, direction requests, phone calls, website clicks and a weekly review snapshot). In the source drawer you pick the location your Google login can see; Denkploeg reads only and fetches the figures month by month in the background. In Report for this client Google Business Profile is a block of its own with the five fields, and a measure can be a goal. The source sits behind a flag and is not available in production yet, because access to the Business Profile API is not proven. PageSpeed and additional platforms will reuse the existing services. Missing measurements or permissions produce a visible explanation when reporting is disabled.

Sharing a report with the client

The client link is meant for agencies and companies that want their client to read the reports themselves. By default the client sees nothing: first you create a link (with a signature), then you release reports one by one under Monthly reports with Release to client. Only a report whose fixed PDF passed the quality check can be released, and you can always take it back with Stop sharing with client. The client can only read, sees only the released reports of their own client record, and the link expires or can be revoked.

Website quality, investigation and monthly scheduling

For a CRM client, Marketing reads PageSpeed measurements for the exact website host registered in Relationships. Register and verify the domain in Website Studio, Speed first. Marketing reuses its DNS proof, storage, quotas and cooldown. Measurement is disabled without valid proof or permission. Mobile and desktop lab results stay separate from real-user field data. Missing field data is not a positive score.

Report analysis refers to the frozen snapshot and its SHA-256. Each finding contains its supporting source fields. Insufficient volume, attribution delay, incomplete data, currency differences or missing margin block budget recommendations. An investigation can become an internal draft task in an active Planning project belonging to the same CRM relationship. No risk level, agent assignment or external campaign is activated.

A monthly schedule creates one internal draft per client for the previous calendar month. Choose its timezone and the day to wait for late data. The worker rechecks membership, modules, source bindings, coverage and export entitlement. Incomplete data waits in the existing queue for at most seven days without consuming failure attempts. Pausing blocks new execution. Errors remain visible; reports are never silently delivered externally.

Sharing or sending a fixed report version

Share releases only the fixed PDF, excluding internal Planning notes, account credentials and separate font assets. Submit the exact report version and validity to Approvals first. A person signs with the required code. You can then retrieve a revocable link once. Save it immediately: the existing sharing engine stores only its hash. Extending validity requires a new signed proposal. Revocation closes future downloads; files already downloaded cannot be recalled.

Delivery requires an email-consenting CRM contact belonging to the same client. You can choose up to ten contacts at once; each recipient gets a proposal of their own to sign. The proposal binds the PDF and verified address. An address change or withdrawn consent blocks sending. An uncertain result is never sent again automatically. Local messages go only to the test mailbox.

The agency can read the same measurements and report references through its internal API and MCP. An agency token is workspace-wide internal access and must never be handed to a client. An external client receives only an explicitly released report. The feature stays disabled by default until the native pilot is released for the workspace. Real account imports and their coverage remain separate requirements.