Skip to main content

Documentation Index

Fetch the complete documentation index at: https://docs.cativa.digital/llms.txt

Use this file to discover all available pages before exploring further.

This event fires as soon as the payment gateway (Asaas, Stripe, etc.) confirms a paywall payment. It’s the canonical moment to sync access in external systems (legacy member area, course platform, ERP), since internally Cativa also uses this same event to grant the user a badge/group/course.
The internal event name (used when subscribing webhooks in the Console) is paywall_payment_completed.

When it fires

  • Payment gateway (Asaas, Stripe) sends the confirmation callback to Cativa
  • A PIX payment clears
  • A boleto charge clears
  • A credit-card charge is captured successfully
  • A manual payment is marked as confirmed in the admin

When it does NOT fire

  • Payment created but still pending (PIX generated and not paid, boleto not yet due, etc.)
  • Payment failed or cancelled by the gateway
  • Payment refunded after it had been confirmed
  • Payment without a resolved UserId (e.g. PIX where the payer hasn’t been associated with a tenant user yet) — delivery is skipped
  • Paywall or payment not found while enriching the payload (delivery is skipped)

Payload

The payload is serialized in PascalCase and delivered in the body of the POST with Content-Type: application/json. The payload has three nested objects — User, Paywall and Payment:
{
  "CustomerId": "01HQ0ABCDEF1234567890XYZ",
  "User": {
    "Id": "01HQ7Z3X4Y5Z6A7B8C9D0E1F2G",
    "Email": "mary@example.com",
    "FirstName": "Mary",
    "LastName": "Smith",
    "DisplayName": "Mary Smith",
    "Username": "mary.smith",
    "CreatedAt": "2026-04-12T14:32:01Z"
  },
  "Paywall": {
    "Id": "01HQ5PAYWALL1234567890ABC",
    "Name": "Premium Mentorship 2026",
    "Description": "12 months of access to mentorship, exclusive courses and the VIP group.",
    "CustomLink": "premium-mentorship-2026",
    "FullUrl": "https://community.example.com/pagamento/premium-mentorship-2026",
    "Price": 1497.00,
    "DiscountPercentage": 10,
    "MaxInstallments": 12,
    "AccessMonths": 12,
    "RemoveAfterExpiration": true,
    "ActionType": 5,
    "ActionPayload": "01HQ4ABCDEF1234567890XYZ",
    "ImageUrl": "https://cdn.cativalab.digital/paywall/01HQ5.../cover.jpg",
    "OpeningLink": "https://community.example.com/welcome-mentorship"
  },
  "Payment": {
    "PaymentId": "01HQ9PAYMENT1234567890XYZ",
    "ValorPago": 1347.30,
    "ValorOriginal": 1497.00,
    "Desconto": 10,
    "Installments": 12,
    "TipoPagamento": "CREDIT_CARD",
    "Gateway": "Asaas",
    "IdTransacao": "pay_5478392a01b2c3d4e5f6",
    "CompletedAt": "2026-05-08T14:32:01Z"
  }
}

Payload fields

Root

FieldTypeDescription
CustomerIdGUIDID of the tenant that emitted the event.
UserobjectBuyer information.
PaywallobjectConfiguration of the paywall that was paid.
PaymentobjectDetails of the confirmed payment.

User

FieldTypeDescription
User.IdGUIDID of the buyer.
User.EmailstringBuyer email.
User.FirstNamestringFirst name.
User.LastNamestringLast name.
User.DisplayNamestringDisplay name.
User.UsernamestringUsername.
User.CreatedAtISO 8601When the user was created in the tenant.

Paywall

FieldTypeDescription
Paywall.IdGUIDPaywall ID.
Paywall.NamestringConfigured name of the paywall.
Paywall.Descriptionstring | nullFree-text description, when provided.
Paywall.CustomLinkstringSlug used in the public paywall URL.
Paywall.FullUrlstring | nullFull public checkout URL ({tenant-origin}/pagamento/{CustomLink}). null when the tenant has no origin configured.
Paywall.PricedecimalConfigured full price (in the tenant’s currency — usually BRL).
Paywall.DiscountPercentageintDiscount percentage active on the paywall (0-100).
Paywall.MaxInstallmentsintMaximum number of installments allowed by the paywall.
Paywall.AccessMonthsint | nullNumber of months of access granted by the purchase. null for lifetime access.
Paywall.RemoveAfterExpirationboolIf true, access is automatically removed when AccessMonths expires.
Paywall.ActionTypeintAction executed after payment (see table below).
Paywall.ActionPayloadstring | nullPayload tied to ActionType — typically an ID (badge, course or group) or JSON, depending on the type.
Paywall.ImageUrlstring | nullCover image of the paywall, when configured.
Paywall.OpeningLinkstring | nullLink the user is redirected to after purchase, when configured.
Paywall.ActionType follows the enum:
ValueMeaningActionPayload
0CreateUserOnly — only registers the user, no access grantedempty
1AddToCourse — enrolls in a courseCourseId (GUID)
2GrantBadge — assigns a badgeBadgeId (GUID)
3AddToGroup — adds to a groupGroupId (GUID)
4AddToCourseAndGrantBadgeJSON with CourseId + BadgeId
5AddToGroupAndGrantBadgeJSON with GroupId + BadgeId
6None — no automatic actionempty

Payment

FieldTypeDescription
Payment.PaymentIdGUIDID of the confirmed payment.
Payment.ValorPagodecimalAmount actually paid after discounts.
Payment.ValorOriginaldecimalFull paywall price before discounts.
Payment.DescontointDiscount percentage applied to this payment (0-100).
Payment.InstallmentsintNumber of installments chosen by the buyer.
Payment.TipoPagamentostringPayment method — typical values: PIX, CREDIT_CARD, BOLETO. Normalized to uppercase.
Payment.GatewaystringGateway that processed the payment (e.g. Asaas, Stripe). Empty string if not provided.
Payment.IdTransacaostringExternal transaction ID at the gateway (use it for reconciliation). Empty string if not provided.
Payment.CompletedAtISO 8601Moment when the payment was confirmed.
The Portuguese-named fields (ValorPago, ValorOriginal, Desconto, TipoPagamento, IdTransacao) are inherited from v1 of the platform and kept for compatibility with existing Make/Zapier integrations. They will not be renamed.

Request headers

HeaderDescription
X-Cativa-SignatureHMAC-SHA256 signature of the delivery, in the format t=<unixTs>,v1=<hex>. Verify it before processing the event.
X-Cativa-Execution-IdUnique ID of this event. Stable across retries — use it as your idempotency key.
X-Cativa-Automation-IdID of the listener configured in the Console (same value across all deliveries from the same subscription).
The full explanation of how to verify X-Cativa-Signature, handle retries and ensure idempotency (with examples in Node, Python, Go and C#) lives in Subscribing and verifying webhooks.

Use cases

  • Grant access in an external platform — if you still host part of the content outside Cativa (legacy member area, Hotmart, Memberkit), use Payment.PaymentId + User.Id to provision access there as soon as the payment is confirmed.
  • Financial reconciliation — record Payment.IdTransacao + Payment.Gateway + Payment.ValorPago in your ERP/accounting to close the books per gateway.
  • Send a transactional email — fire a receipt, invoice or “purchase confirmed” welcome message using User.Email, Paywall.Name, Payment.ValorPago and Payment.Installments.
This event fires once per confirmed payment — it does not fire on automatic subscription renewal (recurring billing is not yet in production). Don’t treat this event as a renewal trigger.

user_received_badge

Fired when the paywall grants a badge — useful to pair the granted permission with the payment.

user_joined_group

Fired when the paywall adds the buyer to a group (ActionType 3 or 5).

Subscribing to webhooks

How to register listeners, verify HMAC and handle retries.

Webhooks (overview)

Why webhooks, delivery guarantees and payload format.