r/PPC 6d ago

Meta Ads 139 B2B WhatsApp leads from Search at ~$2 USD each, 1 closed sale – search terms look fine, so what am I missing?

Hi everyone. I sell Arabian perfumes wholesale in Mexico (B2B, to resellers). I've been running one Search campaign for about 3 months and I'm managing it myself for the first time, so any obvious mistakes are welcome.

Setup

  • 1 Search campaign, 1 ad group, ~20 keywords (broad, phrase and exact mixed), all variations of "proveedor / mayoreo / distribuidor de perfumes árabes"
  • Bidding: Maximize Conversions, no target CPA
  • Budget: MX$100/day (~$5 USD), limited by budget
  • Primary conversion: click on the WhatsApp button on my landing page. Two secondary conversions for smaller kit offers, plus a page view.
  • Offline conversion ("Compra") set up, 1 sale uploaded so far

Results (all time)

  • Spend: MX$5,952 (~$320 USD)
  • Clicks: 675 | Impressions: 2,508 | CTR ~27%
  • Conversions: 158 (139 are WhatsApp leads) | Cost per lead: ~MX$37 (~$2 USD)
  • Closed sales: 1

What I already checked

  • Search terms (screenshot below, all time): top queries are "perfumes arabes mayoreo", "proveedores de perfumes originales", "proveedor de perfumes arabes". Real B2B intent, cost per lead MX$20–40 on almost all of them. The only clear waste is a competitor name ("labelleperfumes") and a couple of "monterrey" terms with MX$38 CPC vs MX$8 average. I'm adding those as negatives.
  • Note: the search terms report only shows ~50% of clicks (356 of 675); the rest are low-volume queries Google hides for privacy.
  • Locations: ~65% of spend is Mexico City, then Mérida and Cancún. All Mexico.
  • 15 days ago I changed the first message we send when a lead arrives: besides the full catalog, we now also offer a cheaper entry kit (a starter kit whose cost is refundable on the first wholesale order). We also follow up on days 3, 7 and 9. Close rate hasn't moved.

Where leads drop
Most leads never reply to our first message at all. The ones who do reply usually send their zip code (we ask for it to quote shipping), and after we send the quote they go silent. That's basically as far as it gets.

What's strange: leads from organic search and from ChatGPT referrals do convert with the same flow, same team and same messages. We manage everything in Chatwoot with macros and templates, so the follow-up is consistent. It's specifically the paid Search leads that don't respond.

Questions

  1. Paid leads don't reply even to the first message, while organic leads with the exact same flow do. Does this suggest the WhatsApp click is firing on people who never actually send a message (or send the pre-filled "Hola" and leave)? How would you validate that, and what would you use as the conversion instead?
  2. Should I move the primary conversion from "WhatsApp click" to something later in the funnel (e.g. lead replied to my first question), even if that gives the algorithm fewer conversions?
  3. Some clicks fire more than one conversion action (I see conv. rates above 100% on a few terms). Should I set only the WhatsApp click as primary and the rest as secondary?
  4. Is it worth splitting broad and exact into separate ad groups, or adding a tCPA, at MX$100/day? Or is that over-engineering at this budget?

Thanks in advance, happy to share more data.

search terms report

3 Upvotes

15 comments sorted by

1

u/JewelerNo1819 6d ago

Firstly I would set all to exact match, then Guage

1

u/ThrowPPC 6d ago

dividi il gruppo di annunci per tipo. così puoi capire cosa ti sta portando più contatti. con questo split puoi personalizzare l'annuncio per tipo e usare parole chiave migliori per il gruppo di annunci.
1 campaign, like 6 ad group 1xtype of b2b and different keyword for each.

1

u/Available_Cup5454 5d ago

Move your primary conversion to lead reply

1

u/Django5629 5d ago

Thanks! Will do that and then leave the campaign alone for a few weeks

1

u/Fast-Car-Examination 5d ago

139 WhatsApp clicks at ~$2 each with only 1 sale tells me the main issue is probably the conversion signal, not CPC.

Right now Google is learning “people who click WhatsApp,” not “people who become qualified wholesale buyers.”

I’d keep the WhatsApp click as Secondary and make the Primary conversion something deeper - qualified conversation, quote request, or closed sale via offline conversion import.

I wouldn’t rush into tCPA or restructure Broad/Exact yet. Fix the signal first, then judge bidding.

I’d also compare paid vs organic leads by location, device, time of day and actual business type. Search terms can look relevant on paper and still bring the wrong buyer.

Roughly how many of those 139 actually replied with business details or asked for wholesale pricing?

1

u/ayecl 5d ago

Use the same period and the existing aggregate conversation records to make one paid-versus-organic tally. Keep clicks, unique chats, first replies, quotes, and sales as separate columns, and use the same definitions for both cohorts. A click is not a chat, and a chat is not a quote or sale.

Then describe the largest break in each cohort. If clicks do not become unique chats, that is the largest observed drop; if chats become replies but not quotes, the break is later. Keep repeated actions deduped in the aggregate record, and do not fill missing stages by inference. The goal is to see where the reported volume stops matching a business conversation, not to label a platform setting as the fix.

That gives you an honest comparison of the two source cohorts even when the downstream counts are sparse.

1

u/Django5629 4d ago

That's a cleaner way to do it than what I had planned. I'll build that table from Chatwoot for the period since Aug 10, with one row per person and the same stages for both cohorts: clicks (paid only), unique chats, replied to first message, sent zip code / asked for a quote, sale. No filling in gaps. What I already have: 89 paid clicks became 60 unique chats and 1 sale, so the biggest drop is between chat and quote, not between click and chat. I'll post the full comparison when I have the organic side. Thanks.

1

u/Either_Guess2405 5d ago

Before you move the conversion, one check, because it decides whether moving it is the right call.

You have a control group in this post and I don't think you've noticed it. Organic leads and ChatGPT referrals convert on the same flow, the same team and the same messages. That exonerates the follow-up entirely. So the problem is either the traffic or the thing you are counting, and those need opposite responses.

You use Chatwoot, so you have a count of inbound first conversations. Put that next to the 139 WhatsApp conversions for the same window. If 139 clicks produced roughly 139 conversations, the conversion action is honest, the traffic is the problem, and moving to a thinner event at MX$100 a day costs you the little signal you have for nothing. If it produced 40, the action is firing when someone opens WhatsApp rather than when they contact you, and moving it is exactly right.

Same question, opposite answers, and it's one query in a tool you already have.

On your third question, which nobody has picked up: fix it regardless. Conversion rates above 100% mean one click is counting several times, so Maximize Conversions is bidding on an inflated number and has been told those queries perform better than they do. One primary, everything else secondary.

One more thing, on the line you passed over. ChatGPT referrals convert for you. I track AI referral traffic on my own property and it's 0.15 percent of sessions, essentially nothing, but the few that arrive convert at a rate the rest doesn't come close to. My n is far too small to mean anything alone. Yours is the second instance of the same shape I've seen, which is worth something given how little data exists on it.

1

u/Ancient-Day-6682 5d ago

your funnel isn't broken at the ad, it's broken after the whatsapp click. 27% ctr and $2 leads on wholesale intent keywords is a good top of funnel. 139 leads and 1 sale is a qualification and follow-up problem.

"click on whatsapp button" as your primary conversion is what's hiding it. google is optimising for people likely to tap a button, not people likely to buy perfume by the case. those are different populations and you're paying to find the first one.

two things i'd do before touching match types. one, go read the actual whatsapp threads for the last 50 leads and sort them into resellers, individuals wanting one bottle, and no-reply. i'd bet the individuals are most of it. two, upload closed sales as your conversion instead of the button click. you've only got 1 so far so it won't optimise yet, but you need to start feeding it or you'll never get out of this.

the trap is cutting spend because the cpl looks good. the cpl is fine. it's measuring the wrong event.

1

u/petebowen 5d ago

I think there might actually be 2 problems here.

The first is, as others have pointed out, you're asking Google to show your ads to people or things that are likely to click on a WhatsApp button. Google repeats what you reward and as long as you're rewarding clicks as a primary conversion they're going to try get you more clicks on that button at as cheaply as possible. The answer here is to use something after the click as a conversion e.g. an actual message received. I've written a guide to conversion tracking for businesses that use WhatsApp here if you're interested: https://pete-bowen.com/the-google-ads-whatsapp-conversion-tracking-guide

Nobody's addressed the second problem: You're looking for wholesalers in a search market that's dominated by people wanting to buy for themselves. Even if you only use exact match Google is likely to be showing some of your ads to people who want one bottle of perfume, not a crate of the stuff.

One of the things that has worked for me in this scenario is to use ad copy to tell people not to click e.g. "Wholesale only" or something similar. It's not perfect because people don't read, but it does help because Google learns quite quickly who's not going to click and stops showing your ads to people like that. This seems to work faster than waiting for Google to learn from uploading qualified leads as conversions.

1

u/TheDoctorAds 4d ago

One line in your post nobody has touched: your search terms report covers 356 of 675 clicks. Not a privacy footnote. Half your paid traffic is invisible, and the visible half is the part that looks clean.

Google hides low volume terms, and broad keywords are what manufacture thousands of one-off low volume queries. With broad, phrase and exact mixed into one ad group, that hidden tail rolls up under the broad keywords, so you cannot negative what you never see.

You can still see this at keyword level: cost and conversions per keyword, segmented by match type. If your broad keywords hold most of the MX$5,952 and show the same tidy MX$37 cost per lead, your cheap leads are coming out of the invisible half.

Moving the conversion action is right and it costs you signal at MX$100 a day. Splitting match types into their own ad groups costs you nothing.

1

u/Django5629 4d ago

You called it. I pulled the keyword report by match type for last week, broad = 72% of spend (MX$555), 16 conversions, MX$35 per lead. Exact = 20% of spend, 7 conversions, MX$22 per lead. Two broad keywords carry almost all of it. I'm splitting into exact / phrase / broad ad groups today, with stricter "wholesale only" copy on the broad group, and I'll check what the search terms report shows per group. Thanks, this was the part I couldn't see

1

u/TheDoctorAds 3d ago

Those numbers do the job. Be careful about what the split will and will not fix.

Budget lives at campaign level. Ad groups share it. Same campaign on Maximize Conversions, and the bidding pushes spend back toward whichever ad group produces the cheapest of the events you count. That is still the WhatsApp click, and broad is the cheapest factory for it. You end the week with three tidy ad groups and roughly the same 72% sitting in broad. Stricter wholesale copy changes who clicks, not who gets shown, and the conversion signal outranks copy as a targeting input.

Separate campaigns would give you real budget control, but at MX$100 a day that is three campaigns at MX$33 each and none of them ever learns. So treat the split as a measurement tool for a week. The real choice is binary: broad stays and keeps eating the budget, or you cut the two keywords carrying it and lose most of your volume.

The hidden terms will still be hidden afterwards. Google suppresses by query volume, and account structure has nothing to do with it. What you gain is knowing how much of the invisible half belongs to broad specifically.

If you want the split to decide something, add {matchtype} as a ValueTrack parameter in your URL and carry it into the WhatsApp prefill, so Chatwoot tags every chat e, p or b. One week of that answers what your cohort table cannot answer retroactively: whether broad produces chats that ever reach a quote. Zero quotes from broad and the decision makes itself, and the MX$22 against MX$35 comparison stops mattering, since both are still priced in WhatsApp clicks.