Peach Payments
mSDK v2 · Target List Research
JUL 2026
Companion to the campaign planLiving document · updated as we expand

Who to
put the
ads in front of.

Building the target-company list for the mSDK v2 LinkedIn campaign: South African businesses with consumer apps that take in-app payments, assembled from public app-store data and uploaded as a Matched Audience. Method, results, and the shortlist to review, all here.

01

The approach

Our ICP qualifier is visible in public data, which most B2B lists can't say.

A company qualifies for mSDK ads if it has a consumer app that takes in-app payments. That's observable in the app stores, so we build the list from app-store and web data, then hand it to LinkedIn to match. Nothing scrapes LinkedIn; discovery happens entirely outside it.

Why category, not SDK detection. Category membership (food delivery, retail, travel, wallets) is itself the "takes payments" qualifier, and install count is the scale signal. Confirming whose payment SDK an app runs would only matter for per-company messaging, which ad audiences don't do. So SDK intelligence is deferred to a later enhancement (see the competitor-signal playbook).
02

The pipeline

Every step is a repeatable script in the project's list-builder folder.
01

Discover

Google Play + Apple charts across SA consumer categories, plus a by-name hunt for betting operators.

02

Dedupe & tier

Group apps into companies; tier by install / rating scale (T1 big or cross-platform, T3 long tail).

03

SA filter

Keep the South African companies: .za domains, then a homepage-signal pass to recover SA merchants on .com.

04

ICP flag

Drop banks, telcos, government and payment providers — not merchant prospects.

05

Review

Human tick over the ambiguous .com recoveries (this page, section 05).

06

Enrich

Resolve each company to its LinkedIn page URL (RapidAPI / Apify / spider.cloud).

07

Exclude

Remove existing Peach customers via HubSpot before upload.

08

Upload

Company Matched Audience in Campaign Manager; wait 24-48h to match, verify size clears 300.

03

Where it landed

Companies, not people — mind the units. The 300 threshold counts matched members, not companies. LinkedIn expands our 167 companies to their employees, then filters to relevant roles; the ~97 Tier-1/2 companies alone carry enough staff to put the member pool in the low thousands. Target by job function + seniority (not narrow exact titles) to keep that pool high, and confirm the estimate in Campaign Manager before spending. Financial institutions and government were flagged out.
04

The final list

Upload-ready SA merchants with a resolved LinkedIn company page. Click a name to open it.
CompanyDomainLinkedInTierVerticals
85 of these were resolved via a Google search fallback (SerpAPI) after the domain API missed the .co.za names. That method matches on name, so a spot-check of the recovered URLs before upload is worth the few minutes.
05

Held back

Flagged out of the upload set, kept on record.

Two buckets: excluded (banks, insurers, government — not merchant prospects), and unresolved (no LinkedIn page found yet; mostly tiny tier-3 apps, recoverable with a name search or manual look).

Excluded — financial / government

CompanyDomainReason

Unresolved — no LinkedIn page found

CompanyDomainTier
06

Tools & risk tiers

We stay on the low rungs. LinkedIn is only ever touched at the sanctioned upload step.
L0 · Use

App-store & web

Google Play + Apple + homepage checks. No LinkedIn. Our discovery engine.

L1 · Use

Public-page enrich

Apify anchor, spider.cloud — public LinkedIn pages, no login, no account risk.

L2 · Use

Scraped-index API

RapidAPI Fresh LinkedIn — vendor absorbs the scraping; name → company URL.

L3 · Careful

Own session

Sales Navigator in ego-lite, read-only, human-paced. For Tier 1 validation only.

L4 · Reject

Cloud cookie actors

Handing our session to datacenter scrapers. LinkedIn's classic ban trigger. Never.

ToolJobCostStatus
google-play-scraperSA Play charts + developer site + installsFreeTested
Apple RSS + iTunesSA App Store charts + seller siteFreeTested
Apify anchor actorCompany name → LinkedIn page + websiteFree tierTested
RapidAPI Fresh LinkedInDomain → LinkedIn company record$10/moTested
spider.cloudBulk LinkedIn company-page fetch~$5 balanceTested
Sales NavigatorTier 1 account validation (ego-lite)TrialActive
42matters / SimilarwebApp-SDK intelligenceEnterpriseDropped — sales-gated
07

How to re-run it

Scripts live in Ad Campaign/list-builder/. Repeatable and cheap.
1

Discover

node discover-playstore.mjs + discover-playstore-delta.mjs + discover-apple.mjs → raw JSON per store.

2

Merge & tier

node merge-and-tier.mjs → dedupes to companies, tiers, flags non-merchants and global giants → companies.csv.

3

Recover .com SA merchants

node recover-sa-dotcom.mjs then refine-recovered.mjs → homepage + contact-signal checks → sa-recovered.json (the review set on this page).

4

Enrich + finalize

enrich-linkedin.mjs (RapidAPI domain lookup) then finalize-enrich.mjs (SerpAPI fallback + flag non-merchants) → matched-audience-upload.csv.

08

Status & next

Living document — this section moves as we expand.

Discovery, review & enrichment done

182 companies assembled, reviewed, and enriched. 167 carry a LinkedIn URL and sit in matched-audience-upload.csv.

Spot-check + exclude customers

Sanity-check the SerpAPI-recovered URLs, then remove existing Peach customers via HubSpot before upload.

Upload

Company Matched Audience in Campaign Manager; wait 24-48h, verify size clears 300, attach to C1/C2.

+

Later enhancements

Competitor-signal passes (website payment-gateway detection; DIY APK SDK grep) — documented, for a future session.

← The campaign plan
Sources & references