Whop
Attribute Whop payments, membership renewals and refunds to the visits that led to them.
Use this connector when you sell memberships or digital products through Whop checkout. Seean verifies each delivery with the webhook signing secret, records payment.succeeded events as orders and matches refund.created events to them. Attribution is derived on Seean’s server from the buyer’s tracked visits when the payment metadata carries the visitor ID.
Setup
- In Seean open Settings → Integrations → Payment providers on your own website, choose Whop, select Enable and copy the webhook URL (
https://events.seean.io/api/connect/whop/<site ID>; use the exact value shown). - In the Whop dashboard open your company’s Developer → Webhooks and add a webhook with that URL.
- Subscribe it to
payment.succeededandrefund.created. - Copy the webhook’s signing secret (
ws_…, keep the prefix) and paste it into Seean, then choose Save secret. - Pass the attribution metadata described below when you create checkout configurations.
Only the website owner can connect, replace or disconnect a provider; one connection per provider; demo websites cannot connect providers.
Attribution handoff
Read window.seean.attribution() in the browser, send it to your server and attach it as metadata on the checkout configuration. Whop copies it to the payment, which is where Seean reads it:
// Browser
await window.seean?.ready;
const a = window.seean?.attribution?.() ?? {};
const seean = { seean_visitor_id: a.visitorId, seean_landing_path: a.landingPath, seean_converting_path: a.convertingPath, seean_campaign: a.campaign };
// send `seean` to your server with the checkout request
// Server (Whop SDK)
const checkout = await whop.checkoutConfigurations.create({
company_id: "biz_123",
plan: { initial_price: 10, plan_type: "one_time" },
metadata: Object.fromEntries(Object.entries(seean).filter(([, v]) => v)),
});
| Key | Meaning |
|---|---|
seean_visitor_id |
Links the order to the buyer’s tracked visits; touches, first and last source, landing page and time to buy are derived from that history. |
seean_landing_path |
Used only when Seean has no tracked visit for the visitor in the 90 days before the order. |
seean_converting_path |
The page where checkout started. |
seean_campaign |
Overrides the campaign derived from the tracked history. |
Fixed checkout links carry no per-visitor metadata, so orders from them are recorded as Unattributed.
What is recorded
| Event | Result in Seean |
|---|---|
payment.succeeded |
Order with total in currency. billing_reason: one_time becomes a one-time order; subscription reasons become subscription orders, so renewals are recorded as separate orders. |
refund.created |
Refund of payment.id by amount. |
The order ID is the Whop payment ID, the product name is product.title and the order time is paid_at. Other events are acknowledged and ignored.
Refunds
refund.created reduces the payment by the refund amount, once per refund ID; partial refunds are supported. Refunds lower net revenue in the period of the original order. If the original order has not arrived, Seean returns HTTP 503 and shows Last event failed: Order not found. The provider can retry after the order arrives; the refund ID prevents double counting. A refund whose order is still missing one day after the refund was created is acknowledged and ignored, so refunds of payments Seean never recorded do not keep the endpoint failing; record those with the Order API. See delivery recovery if retries expire.
Currency
Orders are stored in the website’s reporting currency (Settings → Integrations → Revenue integration). Whop’s decimal amounts are converted with the ISO 4217 exponent (29.99 USD is 2999 minor units). A payment in another currency is acknowledged but not stored, and the reason appears under the provider.
Verify
Use Send test event in Whop’s webhook settings or complete a test purchase. The status line under Whop shows the last event time and, if the last event could not be stored, the error. Then open Revenue for a range containing the order and check the amount, product and derived attribution. Duplicate deliveries return duplicate and change nothing.
Limits
- Seean verifies the Standard Webhooks headers
webhook-id,webhook-timestampandwebhook-signatureand rejects deliveries whose timestamp is more than five minutes old. - Request bodies above 64 KiB are rejected with 413. Events Seean does not handle are acknowledged with 200; rate limits return 429 and temporary ingestion failures return 503 so the provider can retry. See delivery recovery.
- Disable stops accepting events (the URL answers 404); delete the webhook in Whop so it stops retrying. Existing orders are kept.
Related: Revenue attribution, Order API and refunds.
Something unclear? Contact support.