Skip to content
Paddle Billing WebhooksBilling & Merchant of Record

Automated branded email receipts for Paddle billing webhooks

Transform raw Paddle transaction.completed webhooks into pixel-perfect, branded React Email receipts. Handle EU VAT reverse-charges, multiple currencies, and invoice links automatically with 6,000 free monthly emails.

Live Webhook-to-Receipt Simulator

Merchant of Record Ready

Select a Paddle webhook event to inspect the raw JSON payload and see the rendered branded React Email receipt.

Paddle Inbound Webhook PayloadHMAC-SHA256 Verified
{
  "event_type": "transaction.completed",
  "event_id": "evt_01jm94bvc1e888",
  "data": {
    "id": "txn_01jm94bv8d999",
    "status": "completed",
    "customer": {
      "email": "alex@startup.de",
      "name": "Alex Weber"
    },
    "currency_code": "EUR",
    "details": {
      "totals": {
        "subtotal": "32.77",
        "tax": "6.23",
        "total": "39.00"
      },
      "tax_rates_used": [
        {
          "rate": "0.1900",
          "description": "Germany Standard VAT"
        }
      ]
    },
    "items": [
      {
        "price": {
          "description": "Growth Tier Subscription"
        },
        "quantity": 1
      }
    ]
  }
}
Event ID: evt_01jm94bvc1e888
S
SadaSend Cloud
Payment Successful
Receipt Number:INV-2026-0819
Billed To:alex@startup.de
Payment Method:Card ending in •••• 4242
Growth Tier Subscription (Monthly)€32.77
Tax / VAT (19%):€6.23
Total Amount Paid:€39.00
Paddle.com Market Ltd · Merchant of RecordDownload PDF
Core Benefits

Why SaaS teams use SadaSend for Paddle billing webhooks

Design Freedom

Branded React Email Receipts

Ditch plain-text default receipts. Render responsive React Email templates with custom logos, transaction IDs, and clean VAT itemization.

Merchant of Record

EU VAT & Tax Compliance

Automatically reflects Paddle’s Merchant of Record tax IDs, reverse-charge European VAT rates, and country-specific receipt mandates.

Webhook Security

Constant-Time HMAC Verification

Validate Paddle webhook signatures using crypto.timingSafeEqual, neutralizing timing side-channel attacks before processing event data.

Instant Dispatch

Sub-15ms Ingestion Latency

Webhook handlers complete in milliseconds without buffering or queue latency, ensuring customers receive receipts immediately after checkout.

Quickstart Walkthrough

Four simple steps to automated Paddle receipts

01

Register Webhook Endpoint in Paddle

In your Paddle Dashboard (Developer Tools → Notifications), add an HTTPS webhook destination pointing to /api/webhooks/paddle and select transaction.completed.

02

Verify Paddle HMAC Webhook Signature

Extract the paddle-signature header and verify the SHA-256 HMAC digest against your PADDLE_WEBHOOK_SECRET using constant-time comparison.

03

Render Responsive React Email Receipt

Pass event.data (currency, amount, tax breakdown, invoice link) into your <ReceiptEmail /> template for automated HTML composition.

04

Dispatch with SadaSend API

Submit the rendered HTML payload to SadaSend using your API key. Enjoy sub-15ms delivery and full tracking telemetry.

Integration Snippets

Production webhook handlers with HMAC verification

TYPESCRIPT
import { NextRequest, NextResponse } from 'next/server';
import crypto from 'node:crypto';
import { SadaSend } from 'sadasend';
import { render } from '@react-email/render';
import { ReceiptEmail } from '@/emails/ReceiptEmail';

const sadasend = new SadaSend({ apiKey: process.env.SADASEND_API_KEY! });

export async function POST(req: NextRequest) {
  const signature = req.headers.get('paddle-signature') || '';
  const rawBody = await req.text();

  // 1. Verify Paddle webhook HMAC signature
  const hmac = crypto.createHmac('sha256', process.env.PADDLE_WEBHOOK_SECRET!);
  const digest = hmac.update(rawBody).digest('hex');

  // Constant-time comparison prevents timing attacks
  const isValid = crypto.timingSafeEqual(
    Buffer.from(signature),
    Buffer.from(digest)
  );

  if (!isValid) {
    return NextResponse.json({ error: 'Invalid webhook signature' }, { status: 401 });
  }

  const event = JSON.parse(rawBody);

  // 2. Process successful payment receipt
  if (event.event_type === 'transaction.completed') {
    const { customer, details, currency_code } = event.data;

    // 3. Render responsive React Email
    const emailHtml = await render(
      <ReceiptEmail
        customerName={customer.name}
        amount={details.totals.total}
        currency={currency_code}
        items={event.data.items}
      />
    );

    // 4. Dispatch via SadaSend API
    await sadasend.emails.send({
      from: 'billing@yourdomain.com',
      to: customer.email,
      subject: `Your Receipt for Order #${event.data.id}`,
      html: emailHtml,
    });
  }

  return NextResponse.json({ received: true });
}
Billing FAQ

Frequently asked questions about Paddle email delivery

Upgrade your SaaS billing receipts with Paddle and SadaSend

Start free with 6,000 monthly emails. Sub-15ms webhook execution, branded React Email templates, and full EU VAT compliance.