Quick overview
Paddle fulfilment pipeline for n8n: signed webhook verification with a replay guard, exactly-once delivery in a Data Table, licence keys and 72-hour signed download links served by a second webhook, with alerts when a buyer email is missing.
How it works
- Paddle posts transaction.completed to the payment webhook, which reads the raw request body, parses the Paddle-Signature header, enforces a five-minute replay window and maps the purchased price ID to the product table inside the node. An unknown price raises a Telegram alert instead of being silently ignored.
- The HMAC is recomputed with your webhook signing secret, held in a Crypto credential rather than a node field. A mismatch is answered with 401 and the forged request never reaches delivery. A rowNotExists gate on the transaction ID then makes delivery idempotent: retries and duplicate events are answered as duplicates instead of being delivered twice.
- A completed transaction carries no buyer email, so the customer entity is fetched from the Paddle API after the signature check. If the lookup fails or no email is present, the order is parked for manual handling and you are alerted.
- The happy path mints a licence key, signs a 72-hour download token, emails the buyer and logs the order in a Data Table. The second webhook recomputes the token HMAC, refuses expired or tampered links with 410 and 403, and only then serves the product file.
- Fetches the customer from the Paddle API to resolve the buyer email, and sends a Telegram alert and manual-review response if the email is missing.
- Generates a license key, signs a 72-hour download token, emails the buyer a formatted delivery message via Gmail, and upserts the delivered order details into the Data Table.
- Receives GET requests on a second webhook for downloads, validates the token expiry and HMAC signature, then reads the requested product file from disk and returns it as a binary download (or returns an error JSON if denied).
Setup
- Create a Data Table for your orders with the columns txn_id, email, plan, amount, currency, license_key and delivered_at, then select it in both Data Table nodes.
- Add two Crypto credentials: your Paddle webhook signing secret for the webhook HMAC node, and a long random string for download links on the signing and verification nodes. Add an HTTP Header Auth credential holding your Paddle API key for the customer lookup node.
- Replace the placeholder price IDs and filenames in the product table, set your instance's public URL in the link builder, place the product files in the delivery folder, and point Paddle's notification destination at the production webhook URL.
- Add a Paddle API credential (HTTP Header Auth with
Authorization: Bearer <API key>) and a Gmail OAuth2 credential for sending the delivery email.
- Replace the placeholder Paddle price IDs and filenames in the product mapping, set your public n8n base URL and support email in the email template, and place your product files in the configured delivery folder path.
- Add a Telegram credential and set your chat ID if you want alerts for unknown prices and blocked fulfilment.
Requirements
- A Paddle account with webhook notifications enabled, an n8n instance reachable over HTTPS (so the download links resolve), a Data Table for the order log, and a Gmail or SMTP credential for delivery mail.
Customization
- Extend the product table with more price IDs, change the link lifetime in the token signing step, swap Gmail for SMTP or another provider, and replace the file reader with an S3 or Drive download if your products are not stored on the n8n host.