Paddle
Connect Paddle to PayLexer to accept payments, manage subscriptions, and handle global tax compliance automatically.
Paddle is a merchant of record (MoR) payment platform built for software and SaaS businesses. It handles payment processing, tax collection, and compliance across 200+ countries - removing the burden of VAT, GST, and sales tax from you entirely. Paddle supports one-time purchases and native recurring subscriptions with built-in checkout, trials, plan upgrades, and proration.
-
Supported Regions (Merchant Accounts): Global - 200+ countries including United States, United Kingdom, European Union, Australia, Canada, and more - view full list
-
Supported Currencies: USD, EUR, GBP, AUD, CAD, and 135+ additional currencies - view full list
Supported Features
-
One-time payments via hosted checkout
-
Native recurring subscriptions with billing cycle control
-
Free trial periods and sign-up fees
-
Cancel immediately or at end of billing period
-
Global tax compliance (VAT, GST, sales tax) handled automatically by Paddle
-
Multi-currency support across 140+ currencies
-
Payment methods: cards (Visa, Mastercard, Amex), PayPal, Apple Pay, Google Pay, bank transfers
-
Webhook notifications for payment and subscription lifecycle events
-
Sandbox environment for testing without real charges
Before You Start
Make sure you have:
-
Paddle Account – Don't have one? Sign up for Paddle →. You need both a sandbox account for testing and an approved production account for live payments.
-
PayLexer Account – Required to configure the integration. Create your account →
-
A website where you want to integrate
Looking for a different payment processor? View all supported gateways →
Configuring Paddle
You need an API Key, Client Token, and Webhook Secret from Paddle for this integration.
You need separate credentials for sandbox (test) and production (live) environments.
Getting API Credentials
API Key
Log in to your Paddle dashboard
Open the Paddle Sandbox dashboard for test credentials or the Paddle Production dashboard for live credentials.

Navigate to Developer Tools - Authentication
In the left sidebar, click Developer Tools, then click Authentication.

Generate an API key
Click New API Key. Give it a descriptive name (for example, "PayLexer Production") and set the scope to All permissions. Click Save and continue.


Copy your API key
Copy the key displayed. This is the only time Paddle shows it in full - store it securely before closing the dialog.

Client Token
Go to Developer Tools - Client-side tokens
In the Paddle sidebar, click Developer Tools, then click Client-side tokens.

Generate a client token
Click Generate client token. Name it (for example, "PayLexer") and click Save.

Copy the client token
Copy the token value shown. You need this for the checkout widget to render in the browser.

Repeat both sets of steps for the other environment (sandbox and production).
Adding Credentials to PayLexer
Open PayLexer Dashboard
Log in to your PayLexer dashboard and navigate to Payment Gateways → Paddle.

Enter your credentials
Paste your Live and Test API Keys and Client Tokens into the respective fields.
Understanding Live/Production and Sandbox Settings:
| Environment | Purpose |
|---|---|
| Live / Production (Mandatory) | Used for real transactions. Cannot be empty, even when testing. |
| Test / Sandbox (Optional) | Used for testing only. No real money is processed. |
How PayLexer selects credentials:
-
Debug/Test mode ON → Test credentials are used
-
Debug/Test mode OFF → Live credentials are used


Save your credentials
Click Save Changes. PayLexer encrypts both sets of credentials and stores them in the vault.
Configuring Webhooks (Mandatory)
Webhooks allow Paddle to notify PayLexer in real time when a payment succeeds, a subscription renews, or a subscription is cancelled. Without webhooks, PayLexer relies on polling and may miss or delay subscription lifecycle events.
Benefits of Webhooks:
-
Instant payment status updates
-
Real-time subscription lifecycle sync (activations, renewals, cancellations)
-
Automatic handling of failed payment retries and status changes
-
Adjustment and refund events processed without manual intervention
Step 1 - Get your PayLexer webhook URL
Copy the webhook URL from PayLexer
In your PayLexer dashboard, go to Payment Gateways → Paddle → Webhooks. Copy the Webhook URL shown there.

Step 2 - Create the notification destination in Paddle
Go to Notifications in Paddle
In the Paddle dashboard, click Notifications in the left sidebar.

Create a new notification destination
Click New destination. Set the type to Webhook and paste the PayLexer webhook URL into the URL field.

Subscribe to all events
Under Events, select all available events. At minimum, ensure these are included:
-
transaction.completed -
transaction.payment_failed -
subscription.created -
subscription.activated -
subscription.updated -
subscription.canceled -
subscription.paused -
subscription.resumed -
adjustment.created -
adjustment.updated
Click Save destination.

Copy the webhook secret
After saving, Paddle displays a Signing secret for this destination. Copy it.

Save in PayLexer
Back in PayLexer, paste the signing secret into the Webhook Secret field under Paddle gateway settings. Click Save Changes.
Repeat the Notifications setup in both your Paddle Sandbox and Paddle Production dashboards. Use the same PayLexer webhook URL for both - PayLexer detects the environment from the request context automatically.
Integrate Paddle to Your Website
If you have already added and configured your site, you can enable Paddle in your existing setup.
Go to Websites
Navigate to Websites in your PayLexer dashboard.

Edit your website
Click the Edit Icon of your added website.

Enable Paddle
Click the checkbox to enable Paddle for the website.

Paddle uses a two-step checkout flow. When a customer completes checkout, Paddle first creates a transaction (txn_xxx). The subscription record with the permanent ID (sub_xxx) is created after the customer pays and Paddle fires the subscription.created webhook. This is normal behavior - you do not need to handle it manually.
If you haven't added a website yet, Continue to Add Your Website →
Troubleshooting
-
Confirm the webhook URL in your Paddle Notifications matches the one shown in PayLexer exactly, with no trailing slash differences
-
Verify the webhook destination is set up in both Paddle Sandbox and Paddle Production dashboards
-
Check that all required event types are subscribed in Paddle
-
Confirm the Webhook Secret in PayLexer matches the signing secret from the Paddle notification destination — a mismatch causes all webhook events to be rejected
-
Paddle signs events with a timestamp and HMAC — ensure your server clock is accurate. Signatures older than 30 seconds are rejected by PayLexer
-
This is expected behavior immediately after checkout. Paddle creates a transaction first (
txn_xxx) and converts it to a subscription (sub_xxx) once payment is confirmed -
The permanent subscription ID arrives via the
subscription.createdwebhook, which PayLexer processes automatically -
If the
sub_xxxID never appears, check that thesubscription.createdevent is subscribed in your Paddle notification destination and that webhooks are being received
-
Confirm you are using a sandbox API key with Test mode enabled in PayLexer, and a production API key with Test mode disabled
-
API keys and client tokens are environment-specific — a sandbox key does not work against the Paddle production API
-
Check that the API key has All permissions scope in the Paddle dashboard
-
If you regenerated a key in Paddle, update the saved value in PayLexer — old keys are revoked immediately upon regeneration
-
This usually means the
transaction.completedorsubscription.createdwebhook was not received -
Check the Paddle Notifications dashboard for failed delivery attempts and re-send them manually if needed
-
Confirm your PayLexer webhook URL is publicly reachable (not localhost) when testing outside of Paddle's sandbox
-
Paddle acts as the merchant of record and calculates tax automatically based on the customer's location
-
You do not control tax rates directly — they are determined by Paddle based on your product's tax category and the buyer's country
-
Verify the
tax_categoryon your products is set to the correct value (for most software,standardis correct) -
Contact Paddle Support if tax calculations appear incorrect for specific countries
Best Practices
-
Test in sandbox before switching to live credentials - use test card numbers provided in the Paddle developer docs
-
Enable webhooks before going live - without them, subscription renewals, cancellations, and payment failures rely on polling and will be slower to sync
-
Store both sandbox and production credentials in PayLexer from the start - having test credentials configured makes it easy to verify behavior without disrupting live traffic
-
Use
planNameconsistently when creating subscriptions - PayLexer uses this as the deduplication key to avoid creating redundant products in your Paddle catalog -
Do not manually create subscriptions or products directly in the Paddle dashboard if they are managed through PayLexer - manual changes can cause ID mismatches
-
Monitor your Paddle Notifications dashboard periodically for failed webhook deliveries and re-send any that failed during downtime
-
Keep your Webhook Secret and API Key secure - rotate them in Paddle and update in PayLexer if you suspect either has been compromised
-
Configure webhooks in both Test and Live environments
FAQs
Live credentials are mandatory to save the configuration. Test credentials are optional but highly recommended so you can safely test payments before going live.
Check the Debug Mode setting in your platform. When Debug Mode is ON, PayLexer uses your Test credentials. When OFF, it uses Live credentials.
Transactions appear in three places: your platform's booking or order pages, PayLexer Dashboard → Orders, and Paddle Dashboard. All three show the same transactions with different IDs.
Payments will still process, but status updates may be delayed. Check webhook event logs in the Paddle Notifications dashboard. Ensure the webhook URL is correct, the signing secret matches, and all required events are subscribed.
Yes. Paddle operates as your merchant of record, which means it is legally responsible for collecting and remitting VAT, GST, and sales tax in all countries where it sells on your behalf. You do not need a separate tax provider or register for tax in each country.
The client token is a public, browser-safe credential that Paddle's checkout JavaScript uses to initialize the payment widget in the customer's browser. It is separate from your API key (which must stay server-side only). Both are required — the API key creates the transaction server-side, and the client token renders the checkout on the frontend.
Paddle's checkout flow creates a transaction first. When a customer completes payment, Paddle converts the transaction into a subscription and fires a subscription.created webhook containing the permanent sub_xxx ID. PayLexer receives this webhook and updates the subscription record automatically. The txn_xxx value is a transient state that lasts only until the webhook arrives.
Yes. PayLexer supports both one-time and recurring (subscription) payments through Paddle. Subscription plans with a recurring interval use Paddle's native subscription billing. One-time payments create a standard Paddle transaction with no billing cycle attached.
Paddle moves the subscription to past_due status and retries the payment according to its retry schedule. PayLexer receives the subscription.updated event and updates your subscription record accordingly. If all retries fail, Paddle cancels the subscription and fires a subscription.canceled event, which PayLexer also processes automatically.
Yes. PayLexer supports pausing a subscription (which takes effect at the next billing period) and resuming it immediately. Paddle sends subscription.updated events for both actions, which PayLexer uses to keep the subscription status in sync.
Still Have Questions?
-
Paddle Support: Paddle Help Center
-
PayLexer Support: Contact Support
For API references and advanced integration details, see the Paddle developer documentation.
Last updated 1 day ago
Built with Documentation.AI