Skip to content
Back to all work
Fintech · Payment Automation · CRM IntegrationStripeGoHighLevelREST APIWebhooksZapierUnder NDA

Stripe Lead Billing & Payment Automation

Securely vault cards and charge clients per delivered lead

Built a secure Stripe payment workflow that allows lead-generation clients to save payment methods without an immediate charge, then automatically charge those methods when qualified leads are delivered. Integrated the payment lifecycle with GoHighLevel and designed webhook-driven status synchronization for successful and failed payments.

Client

Che Gibson profile photo

Che Gibson

Founder, Hospital Hill

Role

Full-Stack / Backend Engineer

Year

2026

Category

Fintech · Payment Automation · CRM Integration

Confidential Enterprise Project (Protected Under NDA)

Proprietary source code, database architectures, and internal endpoint credentials are confidential. This case study highlights non-proprietary architectural patterns, technical solutions, and verified outcomes.

Executive Overview & The Problem#

The client operates a lead-generation business where customers receive leads generated through advertising campaigns such as Google Ads and Meta.

The billing model is simple:

A client receives a lead → the lead is delivered → the client is charged for that lead.

The technical challenge was making this workflow secure, automated, and flexible enough to support repeated charges throughout the day.

The client needed a way to collect a customer's card details upfront without charging them immediately, then use the saved payment method later whenever a lead was delivered.

The initial pricing model included:

  • Google Calls + Lead Form: $105 per lead
  • Meta Lead Form: $69 per lead
  • Future support for client-specific pricing and different lead types

The main requirements were:

  • Securely collect and save client payment methods
  • Never store raw card information in the application
  • Charge clients later when leads are delivered
  • Support multiple charges throughout the day
  • Connect billing activity with GoHighLevel
  • Handle successful and failed payments
  • Keep the architecture flexible enough to introduce Zapier automation where required

I designed the payment workflow around Stripe SetupIntents for securely saving payment methods and PaymentIntents for processing future charges.


Architectural Approach & System Design#

The architecture separated payment-method collection from payment execution.

This was important because the initial customer interaction should only save the payment method and should not result in an immediate charge.

Payment Method Collection#

The customer starts from a GoHighLevel landing page where payment information is collected.

The payment flow uses Stripe's SetupIntent architecture:

text
GoHighLevel Landing Page
        │
        ▼
Stripe.js / Secure Card Collection
        │
        ▼
Stripe SetupIntent
        │
        ▼
Payment Method Saved
        │
        ▼
Stripe Customer + Payment Method IDs

The application does not need to store raw card information.

Instead, it works with Stripe references such as:

  • Stripe Customer ID
  • Stripe Payment Method ID

This keeps sensitive payment information within Stripe's payment infrastructure.

Lead Delivery & Charging Flow#

The second part of the architecture handles the actual billing event.

When a lead is delivered to a client, the system can use that event to initiate a Stripe PaymentIntent.

text
Google / Meta Lead
        │
        ▼
GoHighLevel
        │
        ▼
Lead Delivered to Client
        │
        ▼
Webhook / Automation Trigger
        │
        ▼
Identify Client
        │
        ▼
Determine Lead Price
        │
        ▼
Stripe PaymentIntent
        │
        ▼
Charge Saved Payment Method

The architecture was designed around a direct webhook-first approach, rather than making Zapier a mandatory dependency for the core payment process.

Zapier could still be used where it makes sense for additional workflow automation.

Flexible Lead Pricing#

The billing logic was designed to keep pricing separate from payment execution.

The initial pricing rules were:

text
Google Lead → $105
Meta Lead   → $69

This approach also leaves room for future client-specific pricing.

For example, different customers could eventually have different prices for the same lead source or lead type without requiring major changes to the payment infrastructure.

Payment Lifecycle#

Each lead can represent an independent billing event.

text
Lead Delivered
      │
      ▼
Identify Client
      │
      ▼
Retrieve Stripe Payment Method
      │
      ▼
Calculate Lead Price
      │
      ▼
Create PaymentIntent
      │
      ▼
Confirm Payment
      │
      ├───────────────┐
      ▼               ▼
  Succeeded         Failed
      │               │
      └───────┬───────┘
              ▼
        Update CRM

Using individual PaymentIntents keeps each lead charge independently identifiable and easier to reconcile.


Key Technical Challenges & Solutions#

1. Saving Cards Without Charging Customers#

The biggest requirement was collecting payment information without taking an initial payment.

A traditional payment flow was therefore not suitable for this use case.

I used Stripe's SetupIntent architecture to separate payment-method collection from payment execution.

The customer can provide their card details, Stripe securely handles the payment method setup, and the system retains the necessary Stripe identifiers for future billing.

This means the application does not need to store sensitive card details.

The resulting flow is:

text
Customer Card
     │
     ▼
Stripe.js
     │
     ▼
SetupIntent
     │
     ▼
Payment Method
     │
     ▼
Stripe Payment Method ID

2. Charging the Same Client Multiple Times#

Clients can receive several leads throughout a single day.

The billing system therefore cannot be designed around a single payment.

Instead, the saved Stripe Payment Method can be associated with multiple future PaymentIntents.

For example:

text
Client
  │
  ├── Lead #1 → PaymentIntent → $105
  │
  ├── Lead #2 → PaymentIntent → $105
  │
  ├── Lead #3 → PaymentIntent → $69
  │
  └── Lead #4 → PaymentIntent → $105

Each lead becomes its own billing event, giving the business a clear relationship between the delivered lead and its corresponding payment.


3. Connecting Stripe With GoHighLevel#

GoHighLevel manages the lead-generation and client workflow, while Stripe handles payment processing.

Rather than tightly coupling the two systems, I designed the integration around events.

text
GoHighLevel
     │
     │ Lead Delivered
     ▼
Webhook
     │
     ▼
Payment Processing
     │
     ▼
Stripe
     │
     ├── Payment Succeeded
     │
     └── Payment Failed
     │
     ▼
CRM Status / Automation

This approach keeps Stripe responsible for payment processing while GoHighLevel remains responsible for CRM and lead operations.

It also provides flexibility to introduce Zapier for additional automation without making it responsible for the core payment logic.


Results & Business Impact#

The implementation established the foundation for an automated lead-based billing system.

The completed workflow enabled the business to:

  • Collect client payment information without an immediate charge.
  • Securely store payment methods through Stripe.
  • Work with Stripe Customer and Payment Method IDs instead of raw card information.
  • Trigger individual charges when leads are delivered.
  • Support different pricing for Google and Meta leads.
  • Support repeated charges for the same client throughout the day.
  • Connect payment events with the client's GoHighLevel workflow.
  • Handle payment success and failure through webhook-based events.
  • Keep the architecture flexible for future pricing and automation requirements.

The most important architectural decision was keeping payment processing independent from CRM automation.

Stripe remains responsible for payment security and transaction processing, while GoHighLevel manages leads and customer workflows. Webhooks provide the bridge between the two systems, creating a cleaner and more maintainable integration.

Tech stack

Stripe API
Stripe SetupIntents
Stripe PaymentIntents
Stripe.js
GoHighLevel
Webhooks
REST APIs
Zapier

Timeline & Milestones

Discovery & Payment Architecture

(Sep 2025)

Defined the card-vaulting, lead delivery, charging, and CRM synchronization workflow

Stripe Integration

(Sep–Oct 2025)

Implemented SetupIntent-based payment-method collection and Stripe customer/payment-method handling

Lead Billing Flow

(Oct 2025)

Built the PaymentIntent flow for charging stored payment methods based on lead source and configured pricing

Integration & Testing

(Oct 2025)

Connected the workflow with GoHighLevel/Zapier and prepared Google/Meta campaign flows for end-to-end testing

Outcomes & Impact

  • SetupIntent-based

    Card Vaulting

    Enabled secure payment-method collection without an immediate customer charge

  • Per-lead PaymentIntents

    Lead Billing

    Designed the billing flow to charge stored payment methods whenever leads are delivered

  • $105 / $69

    Initial Pricing

    Implemented the initial pricing model for Google and Meta lead sources

  • Webhooks + Zapier fallback

    Automation Architecture

    Prioritized direct webhook integration while keeping Zapier available for workflow automation

Need a web or software development partner?

Tell me what you’re building, what’s getting in the way, and where you need help. Whether you need a custom web application, SaaS platform, API integration, or full-stack development, I’ll give you a clear answer on scope, cost, and timeline usually within one business day.

AqibJavaid

Senior Full-Stack Engineer building backend systems, cloud infrastructure and product platforms for teams that need them to stay up.

Available for new projects

Get in touch

© 2026 Aqib Javaid. All rights reserved.

Built and maintained by Aqib Javaid