I expected HelloFresh's LinkedIn ads to sell meal kits to office workers. The LinkedIn Ad Library shows something else. In the 30 ad texts I classified, 21 are German-language pitches from HelloFresh Media to FMCG brands (sampling, recipe sponsorship, newsletters), and the other 9 are English job ads. Meal kits come up twice, and both times it's inside a recruiting ad.
How the data was collected
On October 23, 2026 I ran two scrapers against public sources:
- LinkedIn Ad Library, company name "HelloFresh", capped at 50 ads. All 50 came from the HelloFresh page itself.
-
Google Ads Transparency Center, domain
hellofresh.com, capped at 150 ads.
The collector keeps aggregate counts for all ads, plus the first 300 characters of the first 30 LinkedIn ad texts. That 30-text slice is what the classifier sees.
One property of LinkedIn's library shapes everything below. Start dates, impression ranges, countries and targeting are published only for ads shown in the EU. Here that's 42 of the 50 ads, so every date or impression figure in this post describes those 42 ads only.
The classifier
There's no model here, just a keyword rule I can rerun and audit. A text is a B2B media offer if it mentions FMCG, sampling, a product launch ("Produktlaunch") or Kantar. Otherwise it counts as recruiting if it mentions hiring, careers, jobs or HelloConnect (the name used in the customer-service job ads). Language is a crude check for common German function words.
B2B = ("FMCG", "Sampling", "Produktlaunch", "Kantar")
HIRING = ("hiring", "career", "job", "HelloConnect", "Join the HelloFresh team", "looking for a")
def bucket(text):
low = text.lower()
if any(k.lower() in low for k in B2B):
return "b2b_media_offer"
if any(k.lower() in low for k in HIRING):
return "recruiting"
return "other"
def language(text):
words = set(text.lower().replace("\n", " ").split())
return "de" if words & {"und", "du", "dein", "wie", "die"} else "en"
The rest of the script loads the JSON, counts buckets, and checks which texts mention a meal kit. Output, pasted as-is:
LinkedIn ads: 50, texts kept: 30, unique openings: 16
b2b_media_offer 21
recruiting 9
By bucket and language:
b2b_media_offer de 21
recruiting en 9
Texts containing 'meal kit' or 'meal-kit': 2 | all of them recruiting: True
CTAs: [['Mehr erfahren', 36], ['Apply', 11], ['Learn more', 2]]
Google advertisers: [['Grocery Delivery E-Services USA Inc.', 112], ['HelloFresh SE', 32]]
The "other" bucket is empty, so every text matched one of the two rules. The 30 texts boil down to 16 distinct openings, because the same copy runs in several ads with small headline changes.
What the B2B ads actually say
The German ads read like a media sales deck aimed at brand and trade marketers: product samples in the box, sponsored recipes, newsletter placements.
"Dein nächster Produktlaunch verdient die richtige Kanalstrategie."
(Your next product launch deserves the right channel strategy.)"Die falsche Kanalwahl kostet dich beim Produktlaunch mehr als nur Budget."
(Picking the wrong channel costs you more than budget at a product launch.)"HelloFresh Media hat mit Sampling, Rezeptsponsoring & Newsletter die Kaufabsicht einer alkoholfreien Biermarke um +21% gesteigert – nachgewiesen durch Kantar."
(HelloFresh Media raised purchase intent for a non-alcoholic beer brand by +21% with sampling, recipe sponsorship and newsletters, measured by Kantar.)
The +21% is the ad's own claim about a case study. I haven't checked it. The offer behind most of these ads is a free download: a "Produktlaunch-Leitfaden" (product launch guide) or the Kantar brand lift study. That fits the button: 36 of the 50 ads use "Mehr erfahren" (Learn more).
Among the 42 EU-detailed ads, the two longest-running ads are B2B pitches that started on July 15, 2026 and ran 101 days through October 23. Each shows 10k–20k impressions. All 42 list Germany among their impression countries. Targeting categories are mostly Company (38) and Job (37), which is how LinkedIn advertisers reach people by employer and job title.
The recruiting side
The 9 English texts are hiring ads, and 11 ads in the full set of 50 use the "Apply" button. One of the two that mention meal kits uses them as an employee perk:
"We offer Day-1 health insurance (including a zero-cost option!), regular pay increases, and up to 85% off HelloFresh meal kits."
A cross-check on Google
Google returned 150 ads: 115 text, 27 image, 8 video. Most of them (112) come from an entity called Grocery Delivery E-Services USA Inc., and 32 come from HelloFresh SE. The decoded headlines repeat the LinkedIn split on a small scale. 5 of the 8 that the collector kept are recruiting ("Join HelloFresh Poland", "Apply for HelloFresh Jobs", "Jobs at HelloFresh"…). The other 3 are consumer lines such as "America's #1 Meal Kit".
I'm not drawing conclusions about Google ad copy or ad age. All 8 longest-running Google ads have empty headline and description fields, and 6 of them share a first-shown date of June 22, 2023. That pattern usually marks where the library's history begins, so it says little about the ads themselves.
What this data can't tell you
- 30 texts, truncated. The classifier sees the first 30 LinkedIn texts, cut at 300 characters, out of 50 ads. A different slice could change the 21/9 split, though the "other" bucket being empty suggests the two themes cover this account well.
- EU-only details. Dates, impressions, countries and targeting describe 42 of 50 ads. LinkedIn doesn't publish them for the rest.
- No spend, no results. Impression ranges aren't budgets, and nothing here tells you whether the B2B campaign or the hiring ads work. Consumer meal-kit advertising may happen on channels I didn't look at.
Reproducing it
I built these scrapers. The LinkedIn Ad Library Scraper takes a company name and returns ad text, format, CTA and advertiser, plus dates, impressions and targeting for EU ads. The Google Ads Transparency Scraper does the same for a domain. Both export JSON or CSV that drops straight into a script like the one above. They're free to try on the Apify free plan, and a run of a couple hundred ads costs well under a dollar. The LinkedIn input for this post was just:
{ "companies": ["HelloFresh"], "maxAdsPerQuery": 50 }
Not affiliated with HelloFresh; all data is from public ad libraries.
A keyword rule was enough for this account because the two themes don't overlap. Would you trust a rule like this on a messier advertiser, or at what point would you switch to labelling texts by hand?
Top comments (0)