---
title: "n8n"
description: "Workflow automation for document sharing, tracking, and triggered actions using the n8n community node."
canonical: "https://everypage.co/docs/integrations/n8n"
plan: "free"
last-updated: "2026-08-18"
---

# n8n

The `n8n-nodes-everypage` community node brings EveryPage document management and event-driven workflows to n8n. Upload PDFs and generate tracked share links, access readership analytics, and trigger workflows instantly when documents are read, downloaded, or unlock lead gates.

## Install

The package is published on npm and approved by n8n — it is generally available, with no invite or early-access step.

On **self-hosted n8n**, go to **Settings** → **Community Nodes** → **Install** and enter:

```
n8n-nodes-everypage
```

Or install it on the host directly:

```bash
cd ~/.n8n/nodes
npm install n8n-nodes-everypage
```

On **n8n Cloud**, search for EveryPage in the nodes panel on the canvas.

Once installed, create an **EveryPage API** credential. Generate an API key at [everypage.co/account](https://everypage.co/account) under **API Keys** (keys start with `ep_live_`), paste it into the credential, and optionally set the **Base URL** — only needed when pointing at a staging or self-hosted EveryPage deployment. The key is sent as a bearer token and validated against `GET /api/v1/user`.

## Authentication

Credentials require a valid EveryPage API key. For details on generating and managing API keys, see [API Keys](https://everypage.co/docs/developers/api-keys).

## File actions

The **File** resource handles document uploads, imports, updates, deletions, and analytics retrieval. All file-producing operations return `shareUrl`, `qr_url`, and `embed_code` alongside `uuid` and `shortId`. The share link and embed code prefer the [short ID](https://everypage.co/docs/sharing/share-links-and-short-ids) and never use a vanity slug; `qr_url` is the public, unauthenticated QR endpoint keyed on the UUID, so downstream steps can render it without an API key.

| Operation | Description | Plan |
| --- | --- | --- |
| Upload | Upload a PDF and create a tracked share link with full settings control | Free |
| Import From URL | Fetch a PDF from a URL (without credentials) and upload as a tracked link | Free |
| Get | Retrieve a document by UUID or short ID | Free |
| Get Many | List your documents. The upstream list is unpaginated, so **Limit** (default 50) and **Return All** are applied by the node. There is no name-filter input — filter with an expression or a Filter node | Free |
| Update Settings | Modify viewer mode, expiry, passcode, gates, protections, and other settings | Free |
| Delete | Move a document to trash (restorable) or purge permanently | Free |
| Replace Content | Swap the PDF behind a link in place; UUID, settings, and readership history survive | Pro |
| Get QR Code | Download the tracked QR code as a PNG for print or embedded workflows | Free |
| Get Readership | Fetch the analytics report (summary, funnel, sessions, contacts) as JSON | Free |
| Get Page Marks | Fetch readers' pick / reject / maybe verdicts: per-page tallies, a per-viewer breakdown, and totals | Pro |
| Get Annotations | Fetch the annotations readers drew, grouped by page, with each reader's note | Pro |

**Upload and Import From URL** accept all plan-tiered settings in their **Options** parameter: viewer mode, passcode, email gates, domain allowlists, watermark, page ranges, protection toggles, expiry/never-expire, view limits, and more. **Update Settings** applies only the options you specify; omitted fields retain their current values.

Proofing feedback is a pull, not a push: the `proofing.updated` event fires once per viewer, on their first mark, and carries no verdicts. Trigger on it (or on a new comment) and then read the marks. See [page marks](https://everypage.co/docs/reader-interaction/page-marks) and the [photo proofing automation guide](https://everypage.co/guides/photo-proofing-automation).

**Import From URL** fetches the file without your EveryPage API key, so your credentials never travel to a user-supplied host, and checks the downloaded bytes actually start with a PDF header before uploading them.

**Delete** trashes by default (recoverable through the [trash and recovery](https://everypage.co/docs/library/trash-and-recovery) flow). Enable **Purge Permanently** to remove the document and all associated share links and readership data irreversibly.

**Replace Content** swaps the PDF behind an existing link while preserving its UUID, short ID, slug, QR code, settings, and readership history. Enable **Keep Page-Anchored Hotspots and Notes** only when the new PDF has identical page layout to the original; anchors are cleared by default to prevent broken references.

## Link variant actions (Pro)

The **Link Variant** resource creates per-recipient tracked links, so readership attributes to the individual you sent each link to. Every operation takes the parent document; all but Create also take a variant UUID.

| Operation | Description |
| --- | --- |
| Create | Mint a new variant with a recipient label and optional per-recipient overrides |
| Get Many | List a document's variants (**Limit** default 50, or **Return All**) |
| Update | Change a variant's label, revoked state, or overrides |
| Revoke | Deactivate a variant so its URL stops resolving (recipients who already opened it know the canonical link) |
| Delete | Remove a variant, or with **Redact Label** GDPR-redact it in place instead |

When updating variant overrides (`allowDownload`, `pageFrom`, `pageTo`), providing any override field **replaces the whole overrides object** rather than merging. Re-state every override you intend to keep. See [Link Variants](https://everypage.co/docs/sharing/link-variants) for the full variant contract.

Overrides are limited to download permission and page range. Per-variant passcodes and email gates are not supported — those settings live on the parent document and apply to every variant.

The **Delete** operation supports GDPR label redaction, and the two paths do opposite things. With **Redact Label** off, the variant is removed. With it on, the variant is *not* removed: its recipient label is scrubbed from the variant, readership history, and stored webhook payloads, while the variant keeps working and its anonymised analytics survive. The `deleted` and `redacted` outputs report which happened. A redacted label cannot be re-set afterwards.

## Event bulk pulls

The **Event** resource pulls analytics events in bulk for warehouse loads and incremental syncs. The **Get Many** operation walks one event stream at a time from a `since` cursor you supply — each stream has its own independent ID sequence. Use the trigger node instead when you want workflows to fire on new events. Supported event types are:

| Event Type | Description |
| --- | --- |
| View | Read sessions with pages viewed and time spent |
| Download | Explicit PDF downloads (includes your own saves) |
| Gate | Email-gate and lead-form completions with captured fields (Pro-gated) |

Cursor logic: `since = 0` (the default) returns a single newest-first window, descending, capped at 100 — there is no way to page further back from it. Supply a `since` above 0 and the node walks forward in ascending order from that event ID, pulling 100 at a time until it reaches your **Limit** or the feed runs out; **Return All** removes the limit. Cursors are per-stream: a view cursor is meaningless against the gate stream. Gate event IDs are 64-bit — pass them through unmodified.

## Trigger node

The **EveryPage Trigger** node fires workflows when documents are read, downloaded, gated, commented on, or burned. Choose between instant webhook delivery (default) or polling for firewalled self-hosts.

### Webhook mode (instant)

On activation, the node subscribes to your selected events; deactivating it deletes the subscription. Every delivery carries `X-Everypage-Signature` — HMAC-SHA256 over `<timestamp>.<raw body>`, keyed with the webhook secret returned once at subscribe time — and the node **verifies it and fails closed**: a missing stored secret, a missing signature, a mismatch, or a timestamp outside the 5-minute tolerance all return 401 and the delivery never reaches your workflow. Comparison is constant-time. This is a real advantage over the Make app, which cannot verify signatures at all.

EveryPage webhooks are available on every plan. The only plan requirement is on `gate.completed`, which the server delivers only while the account is on Pro at the time of the event.

Webhook mode covers all nine event kinds:

- `file.viewed` — read sessions with pages viewed, time spent, and link-variant attribution
- `file.downloaded` — reader downloads (non-owner only; the feed includes your own saves)
- `gate.completed` — email-gate or lead-form completion with captured fields (Pro at event time)
- `note.created` — reader feedback note with author, body, and page number
- `receipt.confirmed` — confirmation of receipt by a viewer who was asked
- `file.burned` — self-destructed link (view limit reached)
- `content.replaced` — PDF swapped behind a link
- `invite.viewed` — invited recipient opened their invite link
- `proofing.updated` — proofing review decision changed

Optionally scope the subscription to a single document.

### Poll mode (fallback)

For self-hosted n8n instances unable to receive inbound webhooks. Walks the events feed on your configured Poll Times with independent per-stream cursors, advancing a cursor only after a fetch that actually returned events. Poll mode covers the three feed-backed streams only: view, download, and gate. Event IDs are namespaced as `<type>:<id>` so a view and a gate event sharing a numeric ID cannot collide. Manual executions fetch a small newest-first sample without moving the cursors, so testing in the editor never skips a live workflow forward.

## Bundled workflows

Three example workflows are included:

- **`ai-report-to-tracked-link`** — AI agent generates a report, a Code node renders it to PDF, EveryPage creates a tracked link, Slack receives the share URL
- **`gated-leads-to-crm`** — instant `gate.completed` webhook triggers lead capture, shapes fields, and forwards to CRM
- **`agent-with-everypage-tool`** — chat agent with EveryPage attached as tools for document listing and readership lookup via `$fromAI`

On self-hosted n8n, enable `N8N_COMMUNITY_PACKAGES_ALLOW_TOOL_USAGE=true` to let AI Agent nodes call EveryPage directly.

## Plan-tiered features

Fields above your plan tier are labeled in their descriptions and link to [Pricing](https://everypage.co/pricing). The node maps server-side tier checks (403 responses) to user-friendly errors that name the plan and upgrade path. Size caps: Free 20 MiB, Basic 200 MiB, Pro 2 GiB. Rate limit: 120 requests/minute per key. Enable **Retry On Fail** in the node settings for resilience under rate limiting.

## Related

- [API keys](https://everypage.co/docs/developers/api-keys) — create and manage your API keys
- [Webhooks](https://everypage.co/docs/developers/webhooks) — signatures, delivery, and retries
- [Events feed](https://everypage.co/docs/developers/events-feed) — stream shapes and cursor semantics
- [Link variants](https://everypage.co/docs/sharing/link-variants) — the full variant contract
- [Trash and recovery](https://everypage.co/docs/library/trash-and-recovery) — how trash and purge differ
- [Plans and limits](https://everypage.co/docs/getting-started/plans-and-limits) — tier requirements and API rate limits
