Integration BlueprintUse case: subscription billingUpdated 2026-10-19

Integrating Paddle Subscriptions with HubSpot CRM

Integrating Paddle with HubSpot automates the synchronization between payment processing and customer relationship management. By capturing Paddle billing lifecycle webhooks and mapping them to HubSpot contacts and deals via the v3 REST API, B2B SaaS teams maintain real-time visibility into customer ARR, subscription statuses, and churn risks without manual data entry.

Explore: Payments ยท CRM

Comparison matrix

FeaturePaddleHubSpotEdge
Primary RoleMerchant of Record & PaymentsCRM & Marketing/Sales AutomationTie
Base Pricing Model5% + $0.50 per transactionFreemium; paid tiers start at $20/monthHubSpot
API Base URLhttps://api.paddle.comhttps://api.hubapi.com/crm/v3Tie
Authentication MethodBearer API KeyPrivate App Access Token / OAuth 2.0HubSpot
API Rate Limits240 requests/minute100โ€“190 requests/10s per appHubSpot
Tax Compliance & MoRNative global sales tax & VAT remittanceNot supported nativelyPaddle
Pre-built App Ecosystem~100 integrations1,600+ integrationsHubSpot
Webhook Payload SigningHMAC-SHA256 signature via paddle-signature headerv3 Request Signature validationTie
Start freeTry Paddle โ†’Try HubSpot โ†’

ROI metrics

Hours saved / mo

38

Paddle / mo

$250

HubSpot / mo

$100

Break-even

3.2 wks

Annual savings

$20,520

Automating Paddle subscription events directly into HubSpot eliminates approximately 38 hours of manual billing reconciliation and CRM data entry per month, producing net annual savings of $20,520 for a 10-person SaaS operations team.

Step-by-step setup guide

  1. 1.Create Custom Properties in HubSpot

    Create custom deal and contact properties in HubSpot to store Paddle customer and subscription identifiers: paddle_customer_id, paddle_subscription_id, and mrr_amount.

    curl -X POST https://api.hubapi.com/crm/v3/properties/contacts \
      -H "Authorization: Bearer YOUR_HUBSPOT_TOKEN" \
      -H "Content-Type: application/json" \
      -d '{"name":"paddle_customer_id","label":"Paddle Customer ID","type":"string","fieldType":"text","groupName":"contactinformation"}'
  2. 2.Generate HubSpot Private App Token

    Navigate to Settings > Integrations > Private Apps in HubSpot. Create an app with scopes: crm.objects.contacts.read, crm.objects.contacts.write, crm.objects.deals.read, and crm.objects.deals.write. Save the generated access token securely.

  3. 3.Configure Paddle Notification Destination

    In the Paddle Dashboard under Developer Tools > Notifications, add a new webhook destination targeting your ingestion endpoint (e.g., https://api.yourdomain.com/webhooks/paddle). Select the 'transaction.completed' and 'subscription.updated' events.

  4. 4.Implement Signature Verification

    Verify incoming requests using Paddle's webhook secret key to prevent spoofing. Extract the 'paddle-signature' header, parse 'ts' and 'h1', construct the payload string, and generate an HMAC-SHA256 hash to validate authenticity.

  5. 5.Upsert Contact and Deal Records

    Parse the customer email and transaction value from the webhook payload. Call HubSpot's contact search or batch API to find the contact, update custom properties, and associate a closed-won deal representing the subscription payment.

    curl -X POST https://api.hubapi.com/crm/v3/objects/contacts \
      -H "Authorization: Bearer YOUR_HUBSPOT_TOKEN" \
      -H "Content-Type: application/json" \
      -d '{"properties":{"email":"alex@example.com","paddle_customer_id":"ctm_01h8abc123","lifecyclestage":"customer"}}'

Webhook payload example

POST https://api.yourdomain.com/webhooks/paddle ยท event: transaction.completed

{
  "event_id": "evt_01h8abc12345def67890",
  "event_type": "transaction.completed",
  "occurred_at": "2023-10-24T10:15:30.123456Z",
  "data": {
    "id": "txn_01h8abc98765fed43210",
    "status": "completed",
    "customer_id": "ctm_01h8abc123",
    "address_id": "add_01h8abc456",
    "business_id": null,
    "custom_data": {
      "hubspot_contact_id": "5123489"
    },
    "currency_code": "USD",
    "details": {
      "totals": {
        "subtotal": "9900",
        "tax": "0",
        "total": "9900",
        "grand_total": "9900",
        "currency_code": "USD"
      }
    },
    "subscription_id": "sub_01h8xyz9876"
  }
}

Paddle: pros & cons

  • โœ… Eliminates worldwide sales tax and VAT filing overhead by acting as Merchant of Record.
  • โœ… Built-in localized checkout flows with localized currencies and payment methods.
  • โœ… Single clean billing engine covering recurring billing, proration, and dunning.
  • โš ๏ธ Flat 5% + $0.50 transaction fee is significantly higher than raw processor rates.
  • โš ๏ธ Custom billing logic and multi-entity architectures are harder to configure than on Stripe.

HubSpot: pros & cons

  • โœ… Unified timeline tracks marketing emails, sales calls, and subscription revenue simultaneously.
  • โœ… Granular REST v3 API enables complex association and batch updates.
  • โœ… Extensive ecosystem with pre-built reporting dashboards and automations.
  • โš ๏ธ Custom object definitions are locked behind expensive Enterprise subscription tiers.
  • โš ๏ธ Strict 10-second burst rate limits necessitate queuing systems for large webhook volumes.

FAQ

How do you map a recurring Paddle subscription to HubSpot recurring revenue (ARR/MRR)?

Extract the recurring amount and interval from the Paddle 'subscription.created' or 'transaction.completed' payload, normalize the value into monthly amounts, and update HubSpot custom deal properties configured with HubSpot Revenue Analytics fields.

What happens if HubSpot hits rate limits during a burst of Paddle subscription renewals?

Queue incoming Paddle webhooks in an Amazon SQS queue or Redis buffer first. Process messages asynchronously with a worker configured to back off when HubSpot returns HTTP 429 Too Many Requests.

Can we track failed subscription payments inside HubSpot?

Yes. Listen for Paddle 'transaction.payment_failed' or 'subscription.past_due' webhooks, locate the contact or company by customer_id in HubSpot, and trigger an automated sequence or update the lifecycle stage to 'At Risk'.

Does Paddle's 5% + $0.50 fee get deducted automatically from HubSpot deal amounts?

Paddle's webhook payload includes fee totals under 'details.payout_totals'. You can record the gross revenue in HubSpot Deal Amount and store the processing fee in a separate custom property to calculate net revenue.

Related integrations & comparisons