Superwall

Attribute Superwall paywall purchases and renewals to the visits that led to them.

Use this connector when your app’s purchases run through Superwall paywalls (App Store, Play Store or Stripe). Seean verifies each delivery with the webhook signing secret and records purchase events as orders. Attribution is derived on Seean’s server from the buyer’s tracked visits when the event’s user attributes carry the visitor ID.

Setup

  1. In Seean open Settings → Integrations → Payment providers on your own website, choose Superwall, select Enable and copy the webhook URL (https://events.seean.io/api/connect/superwall/<site ID>; use the exact value shown).
  2. In Superwall open Integrations → Webhooks and add a webhook with that URL.
  3. Subscribe it to initial_purchase, renewal and non_renewing_purchase.
  4. Choose Copy Secret (whsec_…) and paste it into Seean, then choose Save secret.
  5. Set the user attributes described below before the paywall is shown.

Only the website owner can connect, replace or disconnect a provider; one connection per provider; demo websites cannot connect providers.

Attribution handoff

Set the Seean keys as Superwall user attributes before the purchase flow. Superwall includes userAttributes on webhook events, which is where Seean reads them. The visitor ID comes from the website visit that led to the app (for example passed in the link that opened the app); the mobile SDK has no Seean tracker of its own. In a web page that hands off to the app, read it with:

await window.seean?.ready;
const a = window.seean?.attribution?.() ?? {};
// pass a.visitorId (and optionally a.campaign) into the app, then:
await Superwall.shared.setUserAttributes({ seean_visitor_id: visitorIdFromTheWebsite, seean_campaign: "launch" });
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.

Orders without seean_visitor_id are recorded as Unattributed.

What is recorded

Event Result in Seean
initial_purchase, renewal Subscription order with priceInPurchasedCurrency in currencyCode. Renewals are recorded as separate orders.
non_renewing_purchase One-time order.

The order ID is transactionId, the product name is productId and the order time is purchasedAt. Events with a zero or missing price and every other event type (cancellation, expiration, billing issues) are acknowledged and ignored.

Refunds

Superwall documents no refund event, so refunds are not received through this connector. Record them with the Order API using the Superwall transactionId as externalId; they then reduce net revenue in the period of the original order.

Currency

Orders are stored in the website’s reporting currency (Settings → Integrations → Revenue integration). Decimal prices are converted with the ISO 4217 exponent (9.99 USD is 999 minor units). A purchase in another currency is acknowledged but not stored, and the reason appears under the provider; store purchases in a buyer’s local currency cannot be converted by Seean.

Verify

Trigger a sandbox purchase or resend an event from Superwall’s webhook log. The status line under Superwall 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 svix-id, svix-timestamp and svix-signature headers (Standard Webhooks) and 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 Superwall so it stops retrying. Existing orders are kept.

Related: Revenue attribution, Order API and refunds.

Something unclear? Contact support.