Published to the Apify store at $0.002 per lead pushed.
- Every gate passed before publishing — real-workspace push (5 leads, custom
variables verified server-side with types intact), idempotent re-push (0
uploaded, 0 billed), cloud-dataset dry run on the platform, and the billing
gate:
chargedEventCounts equal to pushed exactly, on a keyless run proving
the env-var fallback.
- Title trimmed to the platform's 63-char cap (reported by the CLI as an
actor name error — now a playbook §8 trap).
- Sample dataset
instantly-pusher-sample-leads created and prefilled into
datasetId, so the daily store test and every first run are free, read-only
previews of real-shaped data.
Initial build: the full push pipeline, packaged as an attachable post-run
integration, gated behind a prefilled dry run.
- Verified the Instantly API v2 surface before writing the client — request
and response shapes for
/leads/add, /lead-lists, campaign/list GETs, and
the 401/402/404/429 error space were read from the live reference, not assumed
from the build brief. The one consequential find: custom_variables values
must be flat primitives, which forced an explicit per-column coercion policy
instead of pass-through.
- Custom-variables mapping as the differentiator — every unmapped dataset
column becomes a snake_case
{{merge_tag}}; drops (objects, arrays, NaN,
overflow past 40) are counted per column and reported with the fix, never
silent.
- Conservative auto-detection — bare
title and sourceDomain deliberately
excluded after checking them against the eBay actor's real columns; a wrong
auto-mapping would land in a user's live outreach copy.
- Billing safety inherited from actor #1's postmortems — spending-limit check
before every POST with batch trimming, charges driven by Instantly's
leads_uploaded (capped at sent count), sequential batches so the
claim-vs-await race cannot exist, summary written in a finally so no failure
loses it.
- 106 test assertions, zero network — mapping/coercion policy and the
client's retry/backoff/key-scrubbing behaviour run against a mocked fetch.