Trend-arb · internal · 28 Aug 2026

Twelve stages.
Only five spend money.

TikTok Shop US trend signal → 1688 sourcing → NZ Shopify landing page → Meta ads. This is the flight plan, not the pitch. It exists to show where cash enters, where the risk sits, and what is still blocked — everything else is sequence.

External API stages
5Apify ×5, plus FX, Shopify, Meta downstream
Free internal logic
4Buildable today, no token needed
Hard blockers
1Apify token — nothing runs without it
Cost / weekly cycle
$23Measured at BRONZE tier · test cost $0.25

00 / How to read thisConfidence is labelled. Don't skip it.

VERIFIED

Pulled live from the Apify API on 28 Aug 2026 — actor IDs, per-event pricing, and 30-day success rates. These are measured, not quoted from a listing page.

UNVERIFIED

Actor input schemas are not public — readable only with a token. Field names marked are the expected shape. Do not code against them until the real schema is read.

Model decision — locked

(a) Accept 2–4 week China→NZ ship times. No capital tied up, lower conversion. Every margin figure below therefore carries a refund provision, and the landing page must show an honest ETA. Under this model that provision is not optional — margin that ignores it is fiction.

Live test 28 Aug — the kill rule was wrong

The 1688 cost × 3.5 gate passes products that lose money. On the tested product (US$11.19 retail) the cheapest 1688 match was CNY 2.89 = NZ$0.68 — ×3.5 clears easily, yet the real net margin is −NZ$5.96. Product cost is nearly irrelevant: a 40× swing in supplier price moves net by NZ$27, while CAC and freight move it far more. The gate is now a US retail price floor, applied before the growth ranking. See S7.

01 / Stage detailWhat goes in, what comes out

Each stage names its API, its inputs, its outputs and where the result is stored. Amber stages spend money; green stages are logic we own and can build today.

S0

Config

No API
InAPIFY_TOKEN, DATABASE_URL, FX rate, thresholds — MARGIN_MULTIPLE=3.5, KILL_SPEND_USD, KILL_CPA_NZD, REFUND_PROVISION_PCT
Out
Store.env — never committed
S1

Discover

$0.0045/item · 2k ≈ $9

Sweep TikTok Shop US by category. Runs on Apify's cloud with US proxies — this is why the NZ geo-block is irrelevant. It only ever blocked you, not the pipeline.

APIunseenuser/TikTok-Shop-Scraper — 100% success / 10,197 runs
POST api.apify.com/v2/acts/{actor}/run-sync-get-dataset-items
In category or keyword list · market US · maxItems
Out mode enum shop_search·shop_catalog·product_details·product_reviews·creator_showcase · region US GB ID MY PH SG VN TH DE FR (no NZ) · getRelatedVideosmay return S3's videos itself, collapsing two stages
Storeupsert Product; append ProductSnapshot — never update

The velocity trap

This response is cumulative lifetime units — "12.5k sold" says nothing about the last seven days. There is no trend in this data. Trending is a delta between two snapshots, which is the entire reason S2 exists and why snapshots are append-only.

S2

Velocity

Free · ours

The one piece of genuine IP in the pipeline. Diff our own snapshot history rather than trusting an actor to compute it.

In≥2 ProductSnapshot rows for the same productId
Outunits24h units7d growthPct7d velocityScore
Mathunits7d = snap(t).unitsSoldTotal − snap(t−7d).unitsSoldTotal
RankGrowth % off a low absolute base — not volume. A 50k-unit product is already saturated and its 1688 price is bid up.

Cold start

Day one has no history, so this stage produces nothing until the second run. That is what S2b is for — and it is also why building the store comes before the analysis.

S2b

Cold-start bridge

$0.002 + $0.004 / product

The only actor that keeps its own daily history — so it has a trend on day one, while ours is still building.

APImemo23/tiktok-shop-sales-scraper — 100% success
In product URLs or IDs
Out soldCount (cumulative) unitsSoldInWindow unitsSoldPerDay salesGrowthPercent trendWindowDays firstSeenAtverified live
ProofRanked by cumulative: 136,585 units, 0.3% growth — dead. Ranked by growth: 71 units, 491.7% — just moving. Two different businesses, for 13 cents.
TraptrendWindowDays is capped by their history depth — min 0.9 / mean 5.4 / max 6.9, all first seen within 8 days. Reject rows under 5 days; 491% over 0.9d is noise.
ThenWean off it. lurkapi was the best-fitting actor in this category and went UNDER_MAINTENANCE mid-research. When an actor dies, our snapshot history is the only thing that survives.
S3

Creative capture

Per product

The hook that made the product trend is already public and already proven. Capture it here, while the product URL is in hand — not at S10 when you'd otherwise write ads cold.

APIthenetaji/tiktok-shop-creator-videos-scraper — 100% / 163 runs
In product URL
Out every showcase + affiliate video promoting it — videoUrl creatorName followers views likes
StoreCreative → feeds S10 directly
S4

Shippability filter

Free · kills ~half

A pure text filter that costs nothing and runs before any sourcing spend. Never pay to source something that can't fly.

InProduct.title · category · description
OutshipVerdict: pass | reject + shipReasons[]
Rejectslithium / battery (air freight) · liquids & aerosols · oversized · branded or counterfeit-risk · electricals needing NZ approval · dead-season
S5

Reverse-image source

$0.005 / result

This is the bridge. It is the single step that turns "trending" into "sourceable" — everything upstream is signal, everything downstream is commerce.

APIdevcake/scraper-by-image — 100% / 11,911 runs
In Product.imageUrl
Out 30 matches, 50+ fieldsprice_min price_max moq sold_90d month_sold years_as_gold_supplier factory_inspected delivery_hours service_score
Gotchasprovider takes one value per run — all three platforms = 3 runs, 3× cost. maxProducts has a minimum of 30. Matches are a candidate set, not an identification — an LED-strip image also returned car ambient lights, so a relevance filter belongs before S7.
StoreSourceMatch — this returns so much supplier data it may make S6 partly redundant; re-scope S6 to finalists only
S6

Supplier enrichment

$0.005 + $0.003 / product
APIzen-studio/1688-wholesale-scraper — 9 failures / 35,357 runs
In 1688 product URLs from S5
Out tiered wholesale pricing · MOQ · supplier verification · factory stats · dropship channels · certifications
StoreSourceMatch — enriched in place
S7

Margin gate

FX only

The gate is a number, not an availability check. Something being purchasable is not the same as it being worth buying.

APIFX rate CNY→NZD — still to be chosen. Cache daily; never call per product.
InunitCostCny · FX · freight/unit · target sell price · NZ GST 15% · Meta CAC estimate · refund provision
OutlandedCostNzd netMarginNzd marginPct marginVerdict
Mathnet = sellNzd/1.15 − landedCost − metaCac − (sellNzd × refundProvision)
Kill US retail price FLOOR — applied before the growth ranking. Freight (~NZ$6.50) and CAC are near-fixed per unit, so a cheap product cannot carry them.
CAC NZ$6 → break-even US$12.00, 25% net at US$17.25 · CAC NZ$12 → break-even US$16.25, 25% net at US$23.50 · CAC NZ$18 → break-even US$20.75, 25% net at US$30.00
Working rule: US retail ≥ US$25. Under ~US$16 is structurally dead however well it trends.
NoteCAC and freight are estimates until the first real campaign — the table moves with them, but the shape holds.
S8

Human gate

Greg · weekly

One list, once a week. Nothing past this point is free — this is the last stop before ad spend.

InCandidate where status = pending, ranked by velocityScore
Outstatus → approved | rejected · decidedAt · decidedNote
S9

Landing page

Shopify Admin API
APIShopify Admin API (product + page create), or SettledLoop for a single-product funnel
Inapproved Candidate + Creative
Outlive URL
MustHonest delivery ETA on the page. This is the model (a) tax — skipping it converts into chargebacks, not sales.
S10

Meta ads

Meta Marketing API
APIMeta Marketing API — campaign / adset / ad create
InLP URL + Creative from S3
Outcampaign + ad IDs
Reusemeta-ads · meta-creative-engine · meta-ads-copy skills already exist — assembly, not greenfield
S11

Monitor

Meta Insights + Shopify Orders
APIMeta Insights (spend, CPA) + Shopify Orders (actual sales)
Incampaign IDs · KILL_SPEND_USD · KILL_CPA_NZD
Outcontinue | kill

Kill criteria set before spend

"Monitor" is not a stage until it carries a number. Kill at $X spend with zero purchases, or CPA > $Y. Without thresholds fixed in advance, monitoring is just watching it bleed.

S12

Scale

Decision

Winners only — and this is where the model (b) question returns. Pre-buying a validated winner into NZ stock cuts delivery to three days and lifts conversion, but that is a capital decision taken per product, on evidence, not a strategy switch.

02 / InventoryEvery API, and what's blocking it

APIStagesAuthStatus
Apify — 5 actorsS1 · S2b · S3 · S5 · S6APIFY_TOKENNo token — hard blocker
FX rate CNY→NZDS7tbdNot chosen
Shopify AdminS9 · S11store tokenAvailable — Coy precedent
Meta Marketing + InsightsS10 · S11existing accessAvailable

The only hard blocker

The Apify token. Everything at S2, S4, S7 and S8 is internal logic that can be built and tested against fixtures right now — that is a third of the pipeline, and the third that holds the actual IP.