# Changelog of Instantly Lead Pusher — Push Any Apify Dataset to Campaigns (`programmx/instantly-lead-pusher`) Actor

- **URL**: https://apify.com/programmx/instantly-lead-pusher/changelog.md
- **Full Actor documentation**: https://apify.com/programmx/instantly-lead-pusher.md

## Changelog

### 0.1.1 — 2026-08-07

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.

### 0.1.0 — 2026-08-06

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.
