Client: an online store selling electronics and electrical goods. A mixed audience: B2C and B2B in one store, dropshipping, SalesDrive CRM, Khoroshop platform.
Start of cooperation: April 20, 2026
Data: April — August 2026 (August — 26 of 31 days)
Contents
- Starting point: ads on the edge of a loss
- April — May: building the foundation
- June: the first breakthrough. −20% spend, +20% margin
- July: more orders, margin almost unchanged. We figure out why
- August: B2B ×2, ROMI 212%
- The big picture: April — August
- Analytics dashboard: a tool, not a pretty picture for a report
- What’s next
- Key takeaways
- FAQ
Starting point: ads on the edge of a loss
The client came with ads already running. He had launched them himself; something was running, but end-to-end analytics showed a clear picture: margin-based ROMI was 37.1%. That means for every hryvnia invested, the client got that hryvnia back and earned 37 kopecks of margin profit. With operating costs factored in, that is practically break-even.
But the main problem was not in the campaign settings. It ran deeper.
Problem #1: two completely different audiences in one account
The average B2C order is 1,240 UAH ($28). The average B2B order is 7,295 UAH ($162). Almost a 6x difference. With dropshipping and a tiny margin, B2C orders were effectively break-even — after acquisition costs, the margin shrank to symbolic amounts. All the real profit came from the B2B segment. But the ads did not know that — they optimized for “any order” and attracted everyone.
How to Separate B2B and B2C in Google Ads and Improve Lead Quality
Problem #2: the system did not understand what “success” meant for it
Without real sales data, Google Ads optimized for raw online orders from the cart. But B2B clients often place orders by phone, email or messengers — not through the cart. These very orders — the highest-margin ones — the system did not see at all and did not take into account in training.
Problem #3: 17 direct competitors with an identical assortment
Plus a “parent” company with a strong market position. In these conditions, the winner is not the one who spends more, but the one whose algorithm is trained on better data.
April — May: building the foundation
The first month is not about results. It is about infrastructure.
Dynamic call tracking. I connected call tracking to record phone sales and pass them to Google Ads. For a B2B niche this is critical — a significant share of deals is closed by voice.
CRM integration with Google Ads — two separate goals:
- Actual revenue from a closed order
- Actual margin profit
Why margin and not revenue? Because different products have different markups. If you pass revenue, the algorithm will optimize for large orders regardless of their profitability. Margin gives the right signal: look not for large orders, but for profitable ones.
At first we built a general integration without splitting B2C and B2B. By the second or third month, together with the client, we found a way to classify all orders and send them back to Google Ads as two separate signals. When you pass one general signal, Google does not understand who is B2C and who is B2B, and keeps looking for any audience according to the strategy.
A custom system for collecting orders from all channels. This is a solution I developed for this project, and as far as I know nobody had implemented it in this form before: full attribution of messenger and email orders back to Google Ads via the Offline Conversions API.
B2B clients often write in Telegram or by email — especially when the order is large or needs clarification. Previously these orders were lost in the analytics blind spot. Now they are correctly attributed and returned to the system as conversions with actual margin. All orders from everywhere — cart, phone, email, messengers — are collected, correctly attributed and sent back to Google Ads. A fully closed loop.
May — the results barely changed compared with April. ROMI 32.2%. Spend grew slightly, and margin grew slightly too — proportionally. This is normal: the system was only starting to learn from the new signals.
The client knew this in advance. One of the conditions of our cooperation: I need three months. Anyone who promises you profit from the first month is either incompetent or lying. Google’s algorithms do not work that way.
June: the first breakthrough. −20% spend, +20% margin
In the second half of June we collected enough data and switched campaign optimization to the “margin profit from CRM” goal. Not revenue, not the number of orders — actual margin from confirmed sales.
We spent less and earned more. This is not street magic and I am not David Blaine — it is an algorithm that finally understood what was expected of it. In parallel, in June we significantly changed the campaign structure, which also contributed.
July: more orders, margin almost unchanged. We figure out why
July brought +25% orders with a practically unchanged budget. But margin profit grew by only 5%.
The reason became clear quickly: the system brought more orders, but the share of B2C among them was growing — small orders with a tiny margin. Enough B2B signals had already accumulated, so from the end of July we switched to optimizing exclusively for the B2B audience.
August: B2B ×2, ROMI 212%
August speaks for itself. Data through the 26th of 31 days.
Google Ads Case Study: 2.5x Profit Growth from B2B Leads in 3 Months + End-to-End Analytics
Fewer orders (−20%), but 63% more revenue and 54% more margin. Spend fell by 4%. The average order grew from ~1,582 ₴ ($35) to 3,206 ₴ ($71) — more than double.
B2B orders in August — 78. In July — 39. Exactly twice as many.
The system found its audience. There are fewer B2C orders — and that is good, they brought almost no margin. B2B orders doubled — and that made the whole August result.
The big picture: April — August
Over 5 months, ROMI grew from 37% to 212%. Margin profit more than doubled. The budget stayed at practically the same level.
Exact monthly data
| Period | Spend | Orders | Revenue | Margin | ROAS | ROMI |
|---|---|---|---|---|---|---|
| April 2026 | 78,518 UAH ($1,745) | 283 | 537,798 UAH ($11,951) | 107,652 UAH ($2,392) | 6.85x | 37.1% |
| May 2026 | 97,463 UAH ($2,166) | 425 | 658,177 UAH ($14,626) | 128,805 UAH ($2,862) | 6.75x | 32.2% |
| June 2026 | 80,756 UAH ($1,795) | 410 | 703,635 UAH ($15,636) | 153,933 UAH ($3,421) | 8.71x | 90.6% |
| July 2026 | 82,923 UAH ($1,843) | 503 | 795,955 UAH ($17,688) | 161,725 UAH ($3,594) | 9.60x | 95.0% |
| August 2026 | 79,924 UAH ($1,776) | 404 | 1,295,287 UAH ($28,784) | 249,524 UAH ($5,545) | 16.21x | 212.2% |
| TOTAL | 419,584 UAH ($9,324) | 2 025 | 3,990,852 UAH ($88,686) | 801,639 UAH ($17,814) | 9.51x | 91.1% |
Analytics dashboard: a tool, not a pretty picture for a report
Separately — about the tool I developed for this project. Not a Looker Studio template that is half-alive and glitches when data refreshes. A full-fledged analytics dashboard with:
- Order breakdown by client type (B2B/B2C), order status, traffic source (UTM)
- Metrics for each Google Ads campaign: margin, ROAS, ROMI, spend, number of orders, CPL
- An automatic forecast to the end of the current month — four independent statistical methods (run-rate, trend, weighted average, exponential smoothing) and a consensus between them
- A forecast for the next month for budget planning
- A dynamics chart with an “Enable forecast” button — linear extrapolation right on the chart
Everything updates automatically without human involvement. The client sees the real picture in real time — not a presentation once a month, but a live decision-making tool. If you need a simpler ad report without custom development, there are Looker Studio dashboards built around your data, not from a template.
What’s next
Scaling the budget. The correlation between spend and margin is confirmed — more budget brings more B2B orders and more margin. The system scales predictably.
Launching a second online store. All the infrastructure — integrations, attribution, dashboard — is carried over to the new project. There will be no need to start from scratch.
Key takeaways
- Data decides everything. Google Ads is an algorithm. The algorithm runs on data. If the data is raw or incomplete, the system optimizes in the wrong direction. If the data is clean, complete and correctly attributed, the system finds exactly the audience you need.
- B2B and B2C are two different businesses in one store. Optimizing them with one signal means optimizing neither. Separating audiences and sending separate signals for each segment is not an option but a necessity.
- Attribution is not a technical detail, it is money. Orders via email and messengers are often the largest B2B deals. If they do not reach the system, the algorithm does not take them into account and does not look for such clients.
- Results do not come in the first month. April and May — building infrastructure. June — first results. July — understanding the growth points. August — the jump. Those not ready to wait three months lose to those who are. The one who is ready to wait wins — and later picks the cherries.
No CRM, or a CRM without an API? How to send sales with revenue and margin to Google Ads through a simple web interface — in the case “Google Ads Offline Conversions Without a CRM”.
Where to find me
Message me on Telegram or by email — I respond quickly. Telegram channel and YouTube are for those who want to see real cases before reaching out and understand my approach.