Skip to main content

Overview

This integration sends payment data from Whop into a GoHighLevel (GHL) workflow as soon as a purchase is made. A Whop webhook fires on payment success, GHL receives it via an Inbound Webhook trigger, and you can create or update contacts, apply tags, grant course access, send emails or SMS, and route customers into different automations based on what they bought in Whop. Setup has three parts: create the Whop webhook, build the GHL workflow to receive and map the data, and add conditional logic to route contacts by product or plan.

Part 1: Create the webhook in Whop

Step 1 — Access the Developer tab

  1. Log into your Whop dashboard and scroll to Developer in the left sidebar.
  2. If you don’t see Developer, you need Owner-level permissions. Ask your account owner to update your role — you can’t create webhooks without it.
  3. In Developer, click Webhooks.
  4. Click Create a Webhook.
The Developer tab is only visible to users with Owner permissions. If it’s missing, contact your account admin before continuing.

Step 2 — Choose your webhook event

Whop supports several webhook events. Start with Payment Succeeded — it’s the main one for tracking new customers in GHL. Use a separate webhook and separate GHL workflow for each event so automations stay easy to debug.
Event typePriorityWhen to use
Payment SucceededStart hereFires when a customer completes a payment. Use to create/update contacts and run post-purchase automation.
Payment FailedSecondaryFires when a payment attempt fails. Use for follow-up or retry reminders.
Dispute CreatedSecondaryFires when a customer opens a dispute. Use to alert your team or pause access.
RefundSecondaryFires when a refund is issued. Use to update contact status, remove tags, or revoke access.
Create one webhook and one GHL workflow per event type. Mixing multiple events into one workflow makes troubleshooting and maintenance much harder.

Part 2: Set up the GoHighLevel workflow

Step 3 — Create the Inbound Webhook trigger

  1. In GoHighLevel, go to Automation and create a new workflow from scratch.
  2. Add a trigger and select Inbound Webhook.
  3. Copy the unique webhook URL GHL generates for this workflow.
  4. In Whop, paste that URL into the webhook Destination field, choose Payment Succeeded as the event, and click Save.

Step 4 — Send a test payload

  1. Right after saving the webhook in Whop, click Test on the webhook to send a sample payload to GHL.
  2. In your GHL workflow, click Fetch Sample Request.
  3. GHL will show the incoming payload. Select the first sample.
  4. You’ll see all fields Whop sends: email, name, billing info, product details, payment method, membership ID, and more.
  5. Label your trigger clearly (e.g., “Whop — Payment Succeeded”) so you can find and edit it later.
Always test right after creating the webhook. GHL needs at least one sample payload before you can map fields. Without it, the field selector stays empty and you can’t use Whop data in actions or conditions.

Step 5 — Create or update the contact

The first action in your workflow should be Create/Update Contact. GHL looks up a contact by email, then by phone. If it finds a match, it updates that contact; otherwise it creates a new one.
  1. Add a Create/Update Contact action after the Inbound Webhook trigger.
  2. Email: Click the tag icon → Inbound Webhook TriggerUseremail. This maps the customer’s email from the Whop payload.
  3. Full Name: Click the tag icon → Inbound Webhook TriggerDataBilling (name is here because Whop collects it on paid purchases) → select the name field.
  4. Optionally map phone, address, or custom GHL fields. They’re under Inbound Webhook TriggerData.
Name comes from the Billing section of the payload, not the top-level user object. Whop only requires name and address when a payment is processed. Free sign-ups may not include this data.

Whop payload field reference

Use these fields for contact mapping or conditional logic:
FieldGHL pathDescription
emailInbound Webhook → User → emailCustomer email. Primary identifier in GHL.
nameInbound Webhook → Data → Billing → nameFull name from billing.
phoneInbound Webhook → Data → phonePhone (if collected).
product.titleInbound Webhook → Data → product → titleProduct name as set in Whop. Use for conditional routing.
product.idInbound Webhook → Data → product → idUnique product ID. More precise than title.
plan_idInbound Webhook → Data → plan_idCheckout link / plan ID. Most specific for routing.
amountInbound Webhook → Data → amountTotal amount paid.
membership_idInbound Webhook → Data → membership_idWhop membership ID.
payment_methodInbound Webhook → Data → payment_methodMethod used (card, ACH, crypto, etc.).
address.*Inbound Webhook → Data → Billing → addressBilling address (line1, city, state, zip, country).

Part 3: Conditional logic — route by product or plan

After the contact is created or updated, add Conditional Logic (If/Else) to split the workflow by what the customer purchased. You can apply different tags, grant different access, send different emails, and run different automations per product or plan.

Step 6 — Add a conditional split

  1. After Create/Update Contact, add a Conditional Logic (If/Else) step.
  2. For the condition field, click the tag icon → Inbound Webhook TriggerData → choose the field you want to route on.
  3. Set the condition value to exactly match the product or plan name in Whop.
  4. Add more branches for each product or plan you want to handle separately.
  5. Label each branch clearly (e.g., “Free Product”, “VIP Member”, “Monthly Plan”) so the workflow is easy to read and maintain.

Choosing what to route on

Route bySpecificityBest when
product.titleMediumYou have distinct product names and want a readable workflow. Value must match exactly as in Whop.
product.idHighYou want to avoid breaks if product names change. More reliable long-term.
plan_idHighestYou have multiple plans per product (e.g., monthly vs annual) and need different actions per plan.
amountVariableYou want to branch by price instead of product name.
When routing by product.title, the value in your condition must be an exact match to the product name in Whop — including capitalization and spacing. A single character difference will fail the condition and contacts will go to the default branch.

Step 7 — Example: Free vs VIP routing

Example of a two-branch workflow by product title:
  • Branch 1: Condition — product.title equals Free (exactly as named in Whop). Actions: Add tag free; optionally grant access to a free GHL offer or course.
  • Branch 2: Condition — product.title equals VIP (exactly as named in Whop). Actions: Add tag vip; optionally grant paid GHL offer/course access, send VIP welcome email.
You can add as many branches as you have products. Each branch can have different tags, courses, emails, or sub-workflows.

Part 4: Actions you can take per branch

Once a contact is in a branch, you can use any GHL action. Common ones:
ActionUse case
Add Contact TagTag by product (e.g., free, vip, monthly) for segmentation and reporting.
Grant Offer/Course AccessGive access to a course, membership, or digital product in GHL.
Send EmailSend a welcome email, onboarding sequence, or receipt for what they bought.
Send SMSSend a welcome text or next-step message after purchase.
Add to PipelineMove the contact to a pipeline stage (e.g., Paid Customer, Active Member).
Remove TagRemove a prospect tag if they were already in your CRM as a lead.
Start Drip CampaignEnroll in a post-purchase nurture or onboarding sequence.
Internal NotificationAlert your team by email or SMS when a new purchase comes in.

Frequently asked questions

I don’t see the Developer tab in Whop. What do I do?
  • The Developer tab is only visible to account Owners.
  • If you’re an admin or team member, ask your account owner to update your role.
  • You can’t create webhooks without Owner access.
Should I use one webhook for all payment events or separate ones?
  • Use separate webhooks and separate GHL workflows for each event — one for Payment Succeeded, one for Payment Failed, one for Refund, etc.
  • Mixing them in one workflow makes troubleshooting hard and the logic harder to maintain.
Why do I need to test the webhook before mapping fields?
  • GHL needs at least one sample payload before it can show the fields for mapping.
  • Without a test, the field selector is empty and you can’t reference Whop data in actions or conditions.
My conditional logic isn’t routing contacts correctly. What’s wrong?
  • Most often it’s a case or spacing mismatch between your condition value and the product name in Whop.
  • The value in GHL must exactly match the product title in Whop.
  • Check for extra spaces, different capitalization, or special characters.
What’s the difference between routing by product title vs plan ID?
  • Product title is easier to read but can break if you rename the product in Whop.
  • Plan ID is stable and better long-term.
  • Use plan ID when you have multiple plans per product (e.g., monthly vs annual) and need different handling in GHL.
Can I capture the amount paid and store it in GHL?
  • Yes. The amount field is in the payload under Inbound Webhook TriggerDataamount.
  • You can map it to a custom contact field or use it in workflow conditions.
What happens if the same customer buys again?
  • GHL looks up by email first.
  • If the contact exists, it updates that record instead of creating a duplicate.
  • The workflow still runs, so a repeat purchase will run the workflow again and apply the tags and actions you configured.

Questions?

Contact your Whop account team or visit whop.com.