# Three manual n8n starters for Apify data

Turn a small Actor run into reviewed, spreadsheet-ready rows. These templates launch once, wait for completion, inspect the Actor’s `SUMMARY`, and check that the entire bounded dataset was retrieved before releasing business rows.

**The downloads are free. Running an Actor uses your Apify account and can incur charges. n8n hosting may also have its own cost.** No token, schedule, Google Sheets connection, or destination write is included.

## Choose a workflow

| Download | Small starting scope | Stable destination key |
| --- | --- | --- |
| [Shopify variant price tracker](shopify-variant-price-tracker.n8n.json) | One public product, at most 5 variants | Store URL including locale + variant ID |
| [Building permit project tracker](building-permit-project-tracker.n8n.json) | At most 5 published Chicago permits | Source city + permit ID |
| [CISA KEV triage watchlist](cisa-kev-triage-watchlist.n8n.json) | Two exact CVEs, at most 5 rows | CVE ID |

## Set up and run manually

1. In n8n, **Import from File** and select one JSON. It imports inactive with one manual trigger. Do not add a schedule yet.
2. Create an **HTTP Header Auth** credential: **Name** = `Authorization`; **Value** = `Bearer <your Apify API token>`. Keep the real token in the credential manager, never in the workflow JSON or URL.
3. Select that same credential on all five HTTP Request nodes: **Launch once - costs apply**, **Read run status**, **Fetch run SUMMARY**, **Read dataset count**, and **Fetch bounded dataset**.
4. Open **Edit small input**. Keep `existingRunId` blank for a new run. Edit `actorInput` for your source or watchlist. The starter accepts 1–25 total result rows and an Actor time budget of 30–120 seconds.
5. For Shopify or CISA, give `snapshotName` your own short unique name. The supplied settings enable comparison and keep unchanged observations (`onlyChanges: false`). Use the same name and scope sequentially for later comparisons; never overlap writers.
6. Execute the whole workflow once manually. Review **Require clean SUMMARY** and the final **Sheets-ready rows**. A valid empty run goes to **Valid empty - keep prior records**, not to the business-row output.

The HTTP requests use only `api.apify.com`, do not follow redirects, and do not automatically retry. A new run requests **256 MiB, a 180-second platform timeout, and `maxTotalChargeUsd=0.15`**. This is a requested run ceiling, not a quoted flat price or a guaranteed full collection. The Actor’s configured default build is used.

### What it costs

The FREE-tier result rates below and a $0.00005 Actor Start charge per run on each of these three Actors were verified on 2026-10-13. Check the linked Pricing tab for your current plan’s rate before running.

| Actor | Base result rate | Five saved rows, excluding start charge |
| --- | --- | --- |
| [Shopify variants](https://apify.com/maydit/shopify-variant-monitor/pricing) | $1.50 / 1,000 | $0.0075 |
| [Building permits](https://apify.com/maydit/us-building-permits-scraper/pricing) | $3 / 1,000 | $0.015 |
| [CISA KEV](https://apify.com/maydit/cisa-kev-watchlist-monitor/pricing) | $2 / 1,000 | $0.01 |

The CISA sample requests two CVEs; the five-row figure is a comparison example, not an expected invoice. API/storage and n8n costs depend on your accounts. Creating these templates and their fixture checks made **no paid Actor runs**.

## Connect your own spreadsheet

The final business output contains one flat JSON item per observation. `record_key` supports an upsert; `replay_key` combines run ID and record key to help prevent duplicate delivery. `apify_run_id` preserves provenance. Nested values become JSON strings, decimal prices stay strings, and source strings resembling formulas are prefixed with an apostrophe.

Add and authenticate your own **Google Sheets → Append or Update Row** node after **Sheets-ready rows**, matching `record_key`. Configure values as literal text / **RAW**, keep identifiers and prices as text, and map the columns you need. Keep destination writes sequential and maintain replay deduplication. This template stops before that connection; it does not create a sheet, authenticate Google, deliver a report, or send alerts.

`bounded_sample: true` means a selected cap or reported source-window boundary was reached. `false` does **not** certify complete source coverage. The empty-result branch is execution metadata, not a fake business record; do not wire it into an append-rows destination.

## Resume delivery without another Actor launch

Retain the run ID from **Run context - retain this ID** outside transient execution history. If a later API request or destination step fails, paste that ID into `existingRunId` and execute again. The template skips POST, checks the Actor identity, and reads that exact run’s data. Keep the original input settings and row cap when replaying; the template does not compare the historical run’s INPUT with your edited settings.

**An uncertain launch response is different:** a network failure can occur after Apify accepted the launch. The template stops without retrying. Check your Apify Console for that run before starting again. Do not blindly use “retry whole execution” or execute the launch node alone. Changing an input and launching anew is another potentially chargeable run.

Polling stops after at most **48 status requests** or a **270-second polling deadline**, with five seconds between requests. HTTP request timeouts are 15 seconds; the workflow timeout is 360 seconds. A polling stop does not abort or relaunch the Actor. Check Console and resume the same run ID. The Actor platform timeout still applies.

## Keep each source’s meaning

### Shopify variants

`available` is public purchasability, not inventory quantity or proof of checkout. Currency can be unverified; do not compare different or unknown currencies. First comparison rows are `baseline`; later rows may be `new`, `changed`, or `unchanged`. History advances after saved observations, potentially before your destination write. Preserve locale roots in the key. Missing rows never prove removal or out-of-stock status. Public endpoint, product and variant windows can be bounded. [Actor guide](https://apify.com/maydit/shopify-variant-monitor).

### Building permits

The starter reads recent published Chicago records without a fixed date range. Change the supported city or add `issuedSince` / `issuedUntil` for your intended issue-date window. Source coverage and field availability vary. This Actor has no native change-only history; compare and deduplicate in your destination. Valuation is declared value, not actual spending, and a permit is not evidence of buying intent. Even a result below the cap does not certify an exhaustive window. Its SUMMARY uses `total`, `datasetItemsSaved`, `perCity`, and stop flags; it has no `status` or `incomplete` fields. [Actor guide](https://apify.com/maydit/us-building-permits-scraper).

### CISA KEV

The starter disables optional EPSS enrichment and monitors two exact CVEs. KEV inclusion is not an asset scan or proof of your exposure. `dateAdded` is catalog inclusion; `publishedDueDate` retains CISA’s context and is not your organization’s assigned deadline. Compare against inventory before action. Never close tickets or declare safety because an observation is absent or unchanged. First comparison is `new`. [Actor guide](https://apify.com/maydit/cisa-kev-watchlist-monitor).

## Failure and empty results

A failed Actor, failed source, time/spending stop, incomplete SUMMARY, mismatched dataset count, unusable identity, or duplicate identity stops delivery for review. A clean selected result cap is allowed and labeled. Rows saved before an operational problem remain available in Apify but do not flow automatically to the final business output.

A clean empty run can be a valid no-match or, when enabled, no-change outcome. Preserve prior records. Read SUMMARY before interpreting it; this workflow does not implement deletion detection.

The dataset fetch uses a 26-row limit while the template allows at most 25 saved rows. It verifies the dataset’s `itemCount`, SUMMARY saved count and returned row count agree. This deliberately bounded workflow does not silently deliver a first page of a larger run. Larger jobs need a separately designed paginated workflow and reviewed cost limits.

## Validation and privacy

See [validation.json](validation.json) for tested file hashes and a public validation summary. Tests use the installed **n8n 2.42.6**, synthetic loopback HTTP responses, and a dummy credential. They do not prove current availability of the public source or your production connection. No real Apify run or Google Sheets write was performed. Other n8n versions are not verified.

n8n can retain inputs, source records, run IDs and errors in execution history. Review access and retention controls before processing business data. Do not publish an exported workflow containing real credential references or pinned execution data.

## Official setup references

Consulted 2026-10-13:

- [n8n import/export](https://docs.n8n.io/workflows/export-import/), [Header Auth credentials](https://docs.n8n.io/integrations/builtin/credentials/httprequest/), [HTTP Request options](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.httprequest/), [Wait node](https://docs.n8n.io/integrations/builtin/core-nodes/n8n-nodes-base.wait/).
- [Apify async Actor launch](https://docs.apify.com/api/v2/actors-runs-post), [run status](https://docs.apify.com/api/v2/actor-run-get), [dataset items and pagination](https://docs.apify.com/api/v2/dataset-items-get), [key-value store record](https://docs.apify.com/api/v2/key-value-store-record-get).
