Skip to main content

CONNECT

Use paperplane in n8n

Justin WinterBy · Updated August 26, 2026

paperplane ships a real n8n community node — n8n-nodes-paperplane, not a generic HTTP wrapper. On self-hosted n8n: Settings → Community Nodes → Install, package name n8n-nodes-paperplane. It adds three operations (Quote a Letter, Send a Letter, Get Letter Status) with a confirmation-token contract binding what gets sent to what was quoted, and Send a Letter defaults to Sandbox: on so a workflow tests for free before anything mails.

n8n has an official community node for paperplane — the code lives in this repo under integrations/n8n and installs the same way any n8n community node does. To be direct about what this is: it is a real, declarative REST node, not a hypothetical or a thin wrapper you’d have to build yourself with the generic HTTP Request node. Every field in it maps onto the public paperplane API (/v1/quotes, /v1/orders, /v1/orders/:id), so nothing it sends differs from what the REST docs describe.

Install it (self-hosted n8n)

  • In n8n, open Settings → Community Nodes, click Install, and enter the package name n8n-nodes-paperplane.
  • Or install it on the host directly: cd ~/.n8n/nodes && npm install n8n-nodes-paperplane, then restart n8n. Either way the node appears in the nodes panel as paperplane.
  • n8n Cloud: community nodes only surface there once n8n has verified them, and that verification submission for this package hasn’t cleared yet — see the FAQ below for the REST fallback in the meantime.

Add the credential

paperplane is keyless, so the “paperplane API” credential has exactly one field: Base URL, defaulting to https://sendpaperplane.com. Leave it alone unless you’re self-hosting your own paperplane deployment. Clicking Test hits the free, read-only GET /v1/stats endpoint, so it confirms connectivity without creating or spending anything.

The three operations

  • Quote a Letter (POST /v1/quotes) — free, creates nothing. Set Mail Class and Page Count; fill the Confirmation Token Inputs collection (recipient + letter text or PDF URL) to also mint the single-use confirmation_token the Send step needs.
  • Send a Letter (POST /v1/orders) — the write operation: spends money and mails a physical object unless Sandbox is on, which it is by default. Wire {{ $json.confirmation_token }} from the Quote step into Confirmation Token so the recipient, content, and price can’t drift between quote and send.
  • Get Letter Status (GET /v1/orders/{id}) — free, read-only lifecycle polling (screening → printing → mailed → delivered). Or skip polling entirely and set Additional Options → Webhook URL on the send to get signed status pushes instead.

Sandbox-first: an example workflow

Send a Letter defaults to sandbox mode, so build the whole chain before ever turning it off:

[Manual Trigger] → [paperplane: Quote a Letter] → [paperplane: Send a Letter] → [paperplane: Get Letter Status]
  • Quote a Letter — Mail Class Certified, Page Count 1; Confirmation Token Inputs: Recipient Name “Maria Alvarez”, Street “1 Main St”, City “Richmond”, State “VA”, ZIP “23220”, Letter Text “n8n integration test.”
  • Send a Letter — same Mail Class and recipient fields, Content Source Letter Text with the same text, Confirmation Token {{ $json.confirmation_token }}, Sandbox left on.
  • Get Letter Status — Order ID {{ $json.order.id }}.

Run it: Quote returns a $12.99 price plus a confirmation_token; Send returns a completed ord_test_… order — address verification, content screening, and simulated printing all ran, and nothing was mailed or charged; Get Letter Status confirms the order exists and reports its stage. When the mapping looks right, turn Sandbox off and either set Additional Options → Credit Code for hands-off sending from a prepaid credit balance, or route the send’s returned payment_url to a human to approve.

Idempotency for unattended runs

Set Additional Options → Idempotency Key to something unique per logical letter — an invoice id, a spreadsheet row id. If n8n retries the Send a Letter node after a network error, the API replays the existing order (replayed: true) instead of mailing a duplicate. Worth setting on any workflow that runs without a human watching.

Where this fits

The node is built for exactly the workflows n8n already runs: an overdue-invoice chaser that escalates to a certified demand letter, a compliance automation mailing notices your ERP generates, a “new row in Google Sheets” trigger that mails a welcome letter per customer. The reference card for the node (install path, request shape, status polling) is on the n8n integration page; if a step would rather skip the node entirely, the plain HTTP Request node against the same endpoints works too:

curl -X POST https://sendpaperplane.com/v1/orders \
  -H 'Content-Type: application/json' \
  -d '{
    "mail_class": "first_class",
    "sandbox": true,
    "text": "n8n integration test.",
    "to":   { "name": "Maria Alvarez", "line1": "1 Main St",
              "city": "Richmond", "state": "VA", "zip": "23220" },
    "from": { "name": "Alex Rivera", "line1": "12 Grove Ave",
              "city": "Richmond", "state": "VA", "zip": "23221" }
  }'

The full REST reference lives on the developer docs, and the confirmation-token contract the node builds on is documented in how AI agents mail letters via MCP — the same contract, whether the caller is a workflow node or an LLM.

Related guides

Common questions

Is this an official n8n integration?

It's a real community node paperplane built and publishes — not one of n8n's built-in core nodes, and not a generic HTTP Request recipe. It's a declarative node (package n8n-nodes-paperplane) whose fields map 1:1 onto the public REST API, so what it sends is exactly what the API docs describe.

Does it work on n8n Cloud, or only self-hosted?

Self-hosted today. n8n Cloud only surfaces community nodes n8n itself has verified (published under the n8n-community-node-package keyword, no runtime dependencies, passing their linter, npm provenance via a signed publish) — that verification submission is filed but not cleared yet. Until it clears, Cloud workflows can reach the same API with a plain HTTP Request node against the curl example below.

What does the confirmation token actually protect against?

Send a Letter spends money and mails a physical object. Wiring the Quote step's confirmation_token into the Send step cryptographically pins the recipient, letter content, mail class, color, and price between the two calls — if a mapping error changes any of them before the send, the API rejects it with confirmation_mismatch instead of silently mailing the wrong thing.

How does an unattended workflow pay for a live send?

Set Additional Options → Credit Code with a prepaid credit code and the order is paid from that balance instantly — no human in the loop. Without a code, a live send comes back action_required with a Stripe payment_url for a person to open. Sandbox sends need neither.

Use paperplane in n8n

First-Class $1.99 · Certified $12.99 · Certified + Return Receipt $14.99

Read the developer docs