Events

Complete reference for all DOM events dispatched by the Pelcro JavaScript SDK, including boot sequence, triggers, and payload properties

Overview

This is the complete reference for all custom DOM events dispatched by the Pelcro JavaScript SDK. Use these events to respond to SDK initialization, user actions, and paywall decisions.

Events are dispatched at two distinct times:

  1. Boot-time events - fire during SDK initialization, in a defined sequence
  2. User-action events - fire in response to user interactions and API calls

Listening to Events

All events follow this pattern:

  • Dispatched on the document object
  • Data available in event.detail
  • Events bubble and are not cancelable
document.addEventListener('PelcroUserLoggedIn', (event) => {
  const user = event.detail;
  console.log('User logged in:', user.email);
});

Boot Sequence

Boot-time events fire in this order during SDK initialization:

PelcroFingerprintReady
    |
PelcroAdBlockTestComplete -> PelcroAdBlockDetected (if blocker found)
    |
PelcroSiteLoaded
    |
PelcroUserLoaded (if session exists)
  |  PelcroUserRefresh (if session exists)
    |
PelcroEcommerceProductsLoaded (if e-commerce enabled)
    |
PelcroPaywallMatch (if content matches a paywall rule)
  |  PelcroPaywallDisplayed or PelcroPaywallNotDisplayed
    |
PelcroBootComplete

Boot-Time Events

PelcroFingerprintReady

Device fingerprinting is complete. This is the earliest boot-time event.

TriggerSDK initialization, before site configuration loading
event.detailNo payload

After this event, window.Pelcro.deviceHash is available.

document.addEventListener('PelcroFingerprintReady', () => {
  console.log('Device hash:', window.Pelcro.deviceHash);
});

PelcroSiteLoaded

Site configuration loaded from the API. Most SDK APIs are available after this event, but the user session may not yet be restored.

TriggerAfter fingerprint and bot detection pass; before user session restoration
event.detailSite configuration object

event.detail properties:

PropertyTypeDescription
idnumberSite ID
namestringSite name
default_currencystringDefault currency code
settingsstringSite mode: "subscription", "anti-adblock", or "analytics-only"
ecommerce_enabledbooleanWhether e-commerce is enabled
plansarrayAvailable subscription plans
productsarrayAvailable products
restrictive_paywall_metatags_enabledbooleanWhether tag-based paywall restriction is enabled
document.addEventListener('PelcroSiteLoaded', (event) => {
  const site = event.detail;
  console.log(`Site: ${site.name}, Currency: ${site.default_currency}`);
});

PelcroUserLoaded

User data loaded or updated. Fires both during boot (session restoration) and after any user action that updates user data. This is the most frequently fired user event.

TriggerAny operation that loads or refreshes user data (see list below)
event.detailUser object

Triggered by:

MethodContext
Pelcro.user.register()After registration
Pelcro.user.login()After login
Pelcro.user.idpLogin()After SSO login
Pelcro.user.authenticate()After token authentication
Pelcro.user.refresh()After session refresh (including boot)
Pelcro.user.update()After profile update
Pelcro.user.convert()After legacy account conversion
Pelcro.user.verifyEmailToken()After email verification
Pelcro.user.verifyLoginToken()After passwordless login
Pelcro.user.uploadProfilePicture()After picture upload
Pelcro.user.removeProfilePicture()After picture removal
Pelcro.user.resendEmailVerification()After resending verification

event.detail properties:

PropertyTypeDescription
idnumberUser's unique identifier
emailstringUser's email address
first_namestringUser's first name
last_namestringUser's last name
auth_tokenstringJWT authentication token
email_verifiedbooleanWhether email is verified
subscriptionsarrayUser's active subscriptions
membershipsarrayUser's memberships
addressesarrayUser's saved addresses
ordersarrayUser's order history
metadataobjectCustom metadata fields
document.addEventListener('PelcroUserLoaded', (event) => {
  const user = event.detail;

  updateUserDisplay({
    name: `${user.first_name} ${user.last_name}`,
    email: user.email
  });
});

Tip: To distinguish boot-time firing from user-action firing, check whether PelcroBootComplete has already occurred.


PelcroEcommerceProductsLoaded

E-commerce products loaded during SDK initialization.

TriggerAfter site config loaded and user session restored; before paywall init
event.detailArray of product objects
ConditionOnly fires when Pelcro.site.read().ecommerce_enabled === true
document.addEventListener('PelcroEcommerceProductsLoaded', (event) => {
  const products = event.detail;
  console.log(`${products.length} products loaded`);
});

PelcroBootComplete

SDK has completed its full initialization sequence. This is the safest event to wait for before interacting with any SDK feature.

TriggerOnce per page load, after all boot steps complete
event.detailNo payload
document.addEventListener('PelcroBootComplete', () => {
  if (Pelcro.user.isAuthenticated()) {
    console.log('User:', Pelcro.user.read().email);
  }

  Pelcro.paywall.displayNewsletterModal();
});

AdBlock Detection Events

These events fire during boot when the SDK tests for ad blocker presence.

PelcroAdBlockTestComplete

Ad blocker detection test finished. Always fires first, before PelcroAdBlockDetected.

TriggerAfter ad blocker detection test completes
event.detail0 (no blocker) or 1 (blocker present)
document.addEventListener('PelcroAdBlockTestComplete', (event) => {
  const hasAdBlocker = event.detail === 1;
  console.log('Ad blocker:', hasAdBlocker ? 'detected' : 'not detected');
});

PelcroAdBlockDetected

An ad blocker is active. Only fires when an ad blocker is found.

TriggerAd blocker detection test returns positive
event.detail1
document.addEventListener('PelcroAdBlockDetected', () => {
  showAdBlockMessage('Please disable your ad blocker to support our content');
});

User Events

PelcroUserRegister

New user account created.

TriggerPelcro.user.register(), Pelcro.user.convert()
event.detailUser object
Also firesPelcroUserLoaded

event.detail properties:

PropertyTypeDescription
idnumberUser's unique identifier
emailstringUser's email address
first_namestringUser's first name
last_namestringUser's last name
auth_tokenstringJWT authentication token
email_verifiedbooleanWhether email is verified
metadataobjectCustom metadata fields
document.addEventListener('PelcroUserRegister', (event) => {
  const user = event.detail;
  console.log(`New user registered: ${user.email}`);
});

PelcroUserLoggedIn

User successfully authenticated.

TriggerPelcro.user.login(), Pelcro.user.idpLogin(), Pelcro.user.authenticate()
event.detailUser object with loginType field
Also firesPelcroUserLoaded, PelcroUserLogin (deprecated)

event.detail properties:

PropertyTypeDescription
loginTypestring"email" or "IDP". Not present when triggered by authenticate()
idnumberUser's unique identifier
emailstringUser's email address
first_namestringUser's first name
last_namestringUser's last name
auth_tokenstringJWT authentication token
subscriptionsarrayUser's active subscriptions
membershipsarrayUser's memberships
addressesarrayUser's saved addresses
ordersarrayUser's order history
document.addEventListener('PelcroUserLoggedIn', (event) => {
  const user = event.detail;
  console.log(`Welcome back, ${user.first_name}!`);

  if (user.loginType) {
    console.log(`Login method: ${user.loginType}`);
  }
});

PelcroUserLogout

User logged out or session invalidated.

TriggerPelcro.user.logout(), or session invalidation (401/403 on refresh)
event.detailAuth object

event.detail properties:

PropertyTypeDescription
tokenstring or nullThe invalidated authentication token
document.addEventListener('PelcroUserLogout', () => {
  clearUserDisplay();
  hidePremiumContent();
});

PelcroUserUpdated

User profile data changed.

TriggerPelcro.user.update(), Pelcro.user.uploadProfilePicture(), Pelcro.user.removeProfilePicture(), Pelcro.user.verifyEmailToken(), Pelcro.user.verifyLoginToken(), Pelcro.user.resendEmailVerification()
event.detailUser object
Also firesPelcroUserLoaded

event.detail properties:

PropertyTypeDescription
idnumberUser's unique identifier
emailstringUser's email address
first_namestringUser's first name
last_namestringUser's last name
phonestringUser's phone number
profile_photostringURL to profile photo
email_verifiedbooleanWhether email is verified
document.addEventListener('PelcroUserUpdated', (event) => {
  const user = event.detail;
  updateProfileDisplay({
    name: `${user.first_name} ${user.last_name}`,
    avatar: user.profile_photo
  });
});

PelcroUserRefresh

User session refreshed.

TriggerPelcro.user.refresh(), automatic session restoration during boot
event.detailUser object
Also firesPelcroUserLoaded

event.detail properties:

PropertyTypeDescription
idnumberUser's unique identifier
emailstringUser's email address
auth_tokenstringRefreshed authentication token
subscriptionsarrayCurrent subscriptions
document.addEventListener('PelcroUserRefresh', (event) => {
  const user = event.detail;
  console.log(`Session refreshed for: ${user.email}`);
});

PelcroEmailVerified

Email verification completed.

TriggerPelcro.user.verifyEmailToken()
event.detailUser object
Also firesPelcroUserLoaded, PelcroUserUpdated

event.detail properties:

PropertyTypeDescription
idnumberUser's unique identifier
emailstringVerified email address
email_verifiedbooleantrue after successful verification
document.addEventListener('PelcroEmailVerified', (event) => {
  const user = event.detail;
  showMessage(`Email verified: ${user.email}`);
});

PelcroMetadataUpdated

User metadata saved.

TriggerPelcro.user.saveToMetaData()
event.detailUser object

event.detail properties:

PropertyTypeDescription
idnumberUser's unique identifier
metadataobjectAll user metadata including the newly saved value
document.addEventListener('PelcroMetadataUpdated', (event) => {
  const user = event.detail;
  console.log('Metadata saved:', user.metadata);
});

Subscription Events

PelcroSubscriptionCreate

New subscription created.

TriggerPelcro.subscription.create()
event.detailUser object (updated with new subscription)

Key properties available on the subscription within the user object:

PropertyTypeDescription
idnumberSubscription identifier
statusstringSubscription status
planobjectThe subscribed plan details
plan.idnumberPlan identifier
plan.namestringPlan name
plan.intervalstringBilling interval
current_period_startstringCurrent period start date
current_period_endstringCurrent period end date
cancel_at_period_endbooleanWhether subscription will cancel at period end
document.addEventListener('PelcroSubscriptionCreate', (event) => {
  const data = event.detail;
  console.log('Subscription created');
});

PelcroSubscriptionCancel

Subscription canceled. Canceled subscriptions typically remain active until the end of the current billing period.

TriggerPelcro.subscription.cancel()
event.detailUser object with additional canceledSubscriptionId field

Additional event.detail properties:

PropertyTypeDescription
canceledSubscriptionIdnumberThe ID of the subscription that was canceled
document.addEventListener('PelcroSubscriptionCancel', (event) => {
  const data = event.detail;
  console.log(`Subscription ${data.canceledSubscriptionId} canceled`);
});

PelcroSubscriptionRenewed

Subscription renewed.

TriggerPelcro.subscription.renew()
event.detailUser object (updated with renewed subscription)

Note: Pelcro.subscription.renewGift() does not fire this event.

document.addEventListener('PelcroSubscriptionRenewed', (event) => {
  console.log('Subscription renewed');
});

PelcroSubscriptionReactivated

Previously canceled subscription reactivated.

TriggerPelcro.subscription.reactivate()
event.detailUser object (updated with reactivated subscription)
document.addEventListener('PelcroSubscriptionReactivated', (event) => {
  console.log('Subscription reactivated');
});

PelcroSubscriptionUpdated

Subscription modified (e.g., suspended, domains/IPs changed).

TriggerPelcro.subscription.update()
event.detailUser object (updated with modified subscription)
document.addEventListener('PelcroSubscriptionUpdated', (event) => {
  console.log('Subscription updated');
});

PelcroGiftRedeemed

Gift subscription redeemed.

TriggerPelcro.subscription.redeemGift()
event.detailUser object (updated with redeemed subscription)
document.addEventListener('PelcroGiftRedeemed', (event) => {
  console.log('Gift subscription redeemed');
});

Payment Events

PelcroSourceCreated

Payment source added (legacy payment method system).

TriggerPelcro.source.create()
event.detailUser object (updated with new source)

PelcroSourceUpdated

Payment source updated.

TriggerPelcro.source.update()
event.detailUser object (updated source data)

PelcroPaymentMethodCreated

Payment method added.

TriggerPelcro.paymentMethods.create()
event.detailPayment method API response

event.detail properties:

PropertyTypeDescription
idnumberPayment method ID
typestringPayment method type
cardobjectCard details (if card payment)
card.brandstringCard brand (visa, mastercard, etc.)
card.last4stringLast 4 digits of card
card.exp_monthnumberExpiration month
card.exp_yearnumberExpiration year

PelcroPaymentMethodUpdated

Payment method updated.

TriggerPelcro.paymentMethods.update(), Pelcro.paymentMethods.verifyACH()
event.detailPayment method API response

PelcroPaymentMethodDeleted

Payment method removed.

TriggerPelcro.paymentMethods.delete()
event.detailPayment method API response

PelcroInvoicePay

Invoice paid.

TriggerPelcro.invoice.pay()
event.detailUser object (updated after payment)
document.addEventListener('PelcroInvoicePay', (event) => {
  console.log('Invoice paid');
});

Address Events

PelcroAddressCreated

New address added.

TriggerPelcro.address.create()
event.detailUser object (updated with new address)

Address properties available within the user's addresses array:

PropertyTypeDescription
idnumberAddress ID
line1stringStreet address
citystringCity
statestringState/province
postal_codestringPostal/ZIP code
countrystringCountry code

PelcroAddressUpdated

Address modified.

TriggerPelcro.address.update()
event.detailUser object (updated with modified address)

Password Events

PelcroPasswordForgot

Password reset requested.

TriggerPelcro.password.forgot()
event.detailAPI response

PelcroPasswordReset

Password reset completed.

TriggerPelcro.password.reset()
event.detailAPI response

PelcroPasswordUpdate

Password changed.

TriggerPelcro.password.update()
event.detailAPI response

Side effect: This event also triggers Pelcro.user.logout(), logging the user out after the password change.


Newsletter Events

PelcroNewsletterCreated

Newsletter subscription created.

TriggerPelcro.newsletter.create()
event.detailNewsletter API response

event.detail properties:

PropertyTypeDescription
idnumberNewsletter subscription ID
newsletter_idnumberThe newsletter ID
emailstringSubscribed email address

E-commerce Events

PelcroOrderCreated

Order placed.

TriggerPelcro.ecommerce.order.create()
event.detailOrder object

event.detail properties:

PropertyTypeDescription
idnumberOrder ID
statusstringOrder status
totalnumberOrder total
currencystringCurrency code
itemsarrayOrder line items

Also fires: PelcroOrderCreate (deprecated)


Paywall Events

These events can fire during boot (automatic paywall evaluation) or at runtime (manual trigger).

PelcroPaywallMatch

Content matches a paywall rule. Fires before the paywall display decision is made.

TriggerPaywall initialization evaluating page content against rules
event.detailVisit tracking record

event.detail properties:

PropertyTypeDescription
count_of_articles_readnumberNumber of paywalled articles the user has visited
count_of_articles_leftnumberFree visits remaining
count_of_articles_limitnumberConfigured visit limit
document.addEventListener('PelcroPaywallMatch', (event) => {
  const visits = event.detail;
  console.log(`Articles read: ${visits.count_of_articles_read}/${visits.count_of_articles_limit}`);
});

PelcroPaywallDisplayed

Paywall shown to user because they do not have access to the content.

TriggerPelcro.paywall.displayPaywall(), or automatic paywall evaluation during boot
event.detailPaywall configuration object
document.addEventListener('PelcroPaywallDisplayed', (event) => {
  const paywall = event.detail;
  console.log('Paywall displayed');
});

PelcroPaywallNotDisplayed

Paywall skipped because the user has access (valid subscription, matching entitlement, or blocked path).

TriggerPaywall evaluation when user has valid access
event.detailPaywall configuration object
document.addEventListener('PelcroPaywallNotDisplayed', () => {
  showFullContent();
});

Deprecated Events

These events still fire but should not be used in new integrations.

Deprecated EventUse InsteadNotes
PelcroUserLoginPelcroUserLoggedInFires alongside PelcroUserLoggedIn with the same detail
PelcroOrderCreatePelcroOrderCreatedFires alongside PelcroOrderCreated with the same detail