Customers

Receive notifications when customers are created, updated, deleted, or perform authentication actions.

Overview

Customer webhooks notify your application when customer accounts change or when authentication-related actions occur. Use these events to keep your systems in sync with customer data, trigger onboarding flows, and monitor account activity.


Use Cases

  • Sync new customer records to your CRM
  • Trigger welcome emails or onboarding workflows on registration
  • Update external systems when customer profiles change
  • Audit account deletions for compliance
  • Build custom email verification flows
  • Monitor password reset and login activity

Events

EventDescription
customer.createdA new customer account was created
customer.updatedA customer's profile was modified
customer.deletedA customer account was deleted
customer.email_verification_requestAn email verification was requested
customer.email_verification_succeededA customer verified their email
customer.password_update.succeededA customer changed their password
customer.PasswordResetRequestSubmittedA password reset was requested
customer.passwordless_login_requestA passwordless login link was requested

customer.created

Triggered When

  • A new customer registers via the SDK (checkout flow or signup form)
  • A customer is created via the Core API
  • A customer is created during a data import via the Platform Import Tool
  • A customer account is provisioned during subscription creation

Note: The customer.created payload does not include nested subscriptions or addresses since the customer was just created and has none yet.

Payload

{
  "type": "customer.created",
  "id": "evt_a1b2C3d4E5f6g7H8i9J0k1L2",
  "created": 1704067200,
  "data": {
    "object": {
      "object": "customer",
      "id": 67890,
      "balance": 0,
      "billing_email": null,
      "created": "2024-01-01T00:00:00.000000Z",
      "currency": null,
      "default_source": null,
      "delinquent": false,
      "display_name": null,
      "email": "[email protected]",
      "email_confirm": null,
      "email_hardbounce": false,
      "first_name": "Jane",
      "has_password": null,
      "language": null,
      "last_active_at": null,
      "last_login_method": null,
      "last_name": "Doe",
      "mail_marketing": null,
      "metadata": null,
      "object_id": "cust_a1b2c3d4e5f6g7h8i9j0k1l2",
      "organization": null,
      "password_last_updated_at": null,
      "phone": null,
      "phone_confirm": null,
      "salutation": null,
      "site_id": 1,
      "site_ids": [1],
      "tele_marketing": null,
      "title": null,
      "username": null
    }
  }
}

customer.updated

Triggered When

  • A customer updates their profile via the SDK (account settings)
  • A customer's profile is updated via the Core API
  • An administrator edits a customer's details from the Platform
  • Customer metadata is modified

Note: Password changes do not trigger customer.updated — they trigger customer.password_update.succeeded instead.

Payload

The payload includes a previous_attributes object containing only the fields that changed. It also includes nested subscriptions, shipping_addresses, and billing_addresses.

{
  "type": "customer.updated",
  "id": "evt_b2C3d4E5f6g7H8i9J0k1L2m3",
  "created": 1704153600,
  "data": {
    "object": {
      "object": "customer",
      "id": 67890,
      "balance": 0,
      "billing_addresses": {
        "object": "list",
        "data": []
      },
      "billing_email": "[email protected]",
      "created": "2024-01-01T00:00:00.000000Z",
      "currency": "usd",
      "default_source": {
        "object": "source",
        "id": 99999,
        "object_id": "card_a1b2c3d4e5f6g7h8i9j0k1l2",
        "object_gateway": "stripe",
        "brand": "visa",
        "country": "US",
        "exp_month": 12,
        "exp_year": 2030,
        "funding": "credit",
        "last4": "4242",
        "site_ids": [1]
      },
      "delinquent": false,
      "display_name": "Jane Doe",
      "email": "[email protected]",
      "email_confirm": true,
      "email_hardbounce": false,
      "first_name": "Jane",
      "has_password": true,
      "language": "en",
      "last_active_at": 1704067200,
      "last_login_method": "email",
      "last_name": "Doe",
      "mail_marketing": true,
      "metadata": {"preferred_plan": "premium"},
      "object_id": "cust_a1b2c3d4e5f6g7h8i9j0k1l2",
      "organization": null,
      "password_last_updated_at": "2024-01-01T00:00:00.000000Z",
      "phone": "+1234567890",
      "phone_confirm": null,
      "salutation": "Ms",
      "shipping_addresses": {
        "object": "list",
        "data": [
          {
            "object": "address",
            "id": 12345,
            "city": "New York",
            "country": "US",
            "line1": "123 Main Street",
            "postal_code": "10001",
            "state": "NY",
            "type": "shipping"
          }
        ]
      },
      "site_ids": [1],
      "subscriptions": {
        "object": "list",
        "data": []
      },
      "tele_marketing": null,
      "title": null,
      "username": "janedoe"
    },
    "previous_attributes": {
      "first_name": "Janet",
      "display_name": "Janet Doe"
    }
  }
}

customer.deleted

Triggered When

  • A customer account is deleted via the Core API
  • An administrator deletes a customer from the Platform

Note: When a customer is deleted, the system automatically cancels all active subscriptions and removes payment sources before firing this event.

Payload

The payload includes a previous_attributes object containing the fields that changed during the deletion process. It also includes the customer's subscriptions, shipping_addresses, and billing_addresses at the time of deletion.

{
  "type": "customer.deleted",
  "id": "evt_c3D4e5F6g7H8i9J0k1L2m3N4",
  "created": 1704240000,
  "data": {
    "object": {
      "object": "customer",
      "id": 67890,
      "balance": 0,
      "billing_addresses": {
        "object": "list",
        "data": []
      },
      "billing_email": null,
      "created": "2024-01-01T00:00:00.000000Z",
      "currency": "usd",
      "default_source": null,
      "delinquent": false,
      "display_name": "Jane Doe",
      "email": "[email protected]",
      "email_confirm": true,
      "email_hardbounce": false,
      "first_name": "Jane",
      "has_password": true,
      "language": "en",
      "last_active_at": 1704067200,
      "last_login_method": "email",
      "last_name": "Doe",
      "mail_marketing": true,
      "metadata": null,
      "object_id": "cust_a1b2c3d4e5f6g7h8i9j0k1l2",
      "organization": null,
      "password_last_updated_at": "2024-01-01T00:00:00.000000Z",
      "phone": null,
      "phone_confirm": null,
      "salutation": null,
      "shipping_addresses": {
        "object": "list",
        "data": []
      },
      "site_ids": [1],
      "subscriptions": {
        "object": "list",
        "data": []
      },
      "tele_marketing": null,
      "title": null,
      "username": null
    },
    "previous_attributes": {
      "default_source": {
        "object": "source",
        "id": 99999,
        "object_id": "card_a1b2c3d4e5f6g7h8i9j0k1l2",
        "object_gateway": "stripe",
        "brand": "visa",
        "last4": "4242"
      }
    }
  }
}

customer.email_verification_request

Triggered When

  • A customer registers and email verification is required by site settings
  • A customer requests a new verification email

Payload

The payload includes an email_verify_token field that can be used to build custom verification links.

{
  "type": "customer.email_verification_request",
  "id": "evt_d4E5f6G7h8I9j0K1l2M3n4O5",
  "created": 1704067200,
  "data": {
    "object": {
      "object": "customer",
      "id": 67890,
      "balance": 0,
      "billing_email": null,
      "created": "2024-01-01T00:00:00.000000Z",
      "currency": null,
      "default_source": null,
      "delinquent": false,
      "display_name": null,
      "email": "[email protected]",
      "email_confirm": null,
      "email_hardbounce": false,
      "email_verify_token": "abc123def456ghi789jkl012mno345",
      "first_name": "Jane",
      "has_password": null,
      "language": null,
      "last_active_at": null,
      "last_login_method": null,
      "last_name": "Doe",
      "mail_marketing": null,
      "metadata": null,
      "object_id": "cust_a1b2c3d4e5f6g7h8i9j0k1l2",
      "organization": null,
      "password_last_updated_at": null,
      "phone": null,
      "phone_confirm": null,
      "salutation": null,
      "site_id": 1,
      "site_ids": [1],
      "tele_marketing": null,
      "title": null,
      "username": null
    }
  }
}

customer.email_verification_succeeded

Triggered When

  • A customer successfully verifies their email by clicking the verification link

Payload

{
  "type": "customer.email_verification_succeeded",
  "id": "evt_e5F6g7H8i9J0k1L2m3N4o5P6",
  "created": 1704067200,
  "data": {
    "object": {
      "object": "customer",
      "id": 67890,
      "balance": 0,
      "billing_email": null,
      "created": "2024-01-01T00:00:00.000000Z",
      "currency": null,
      "default_source": null,
      "delinquent": false,
      "display_name": null,
      "email": "[email protected]",
      "email_confirm": true,
      "email_hardbounce": false,
      "first_name": "Jane",
      "has_password": true,
      "language": null,
      "last_active_at": null,
      "last_login_method": null,
      "last_name": "Doe",
      "mail_marketing": null,
      "metadata": null,
      "object_id": "cust_a1b2c3d4e5f6g7h8i9j0k1l2",
      "organization": null,
      "password_last_updated_at": null,
      "phone": null,
      "phone_confirm": null,
      "salutation": null,
      "site_id": 1,
      "site_ids": [1],
      "tele_marketing": null,
      "title": null,
      "username": null
    }
  }
}

customer.password_update.succeeded

Triggered When

  • A customer changes their password via the SDK (account settings)
  • A customer sets a new password after a password reset

Note: This event fires instead of customer.updated when the password field changes.

Payload

The payload includes a referer field indicating the URL where the password change was initiated. It also includes previous_attributes showing which fields changed.

{
  "type": "customer.password_update.succeeded",
  "id": "evt_f6G7h8I9j0K1l2M3n4O5p6Q7",
  "created": 1704153600,
  "data": {
    "object": {
      "object": "customer",
      "id": 67890,
      "balance": 0,
      "billing_email": null,
      "created": "2024-01-01T00:00:00.000000Z",
      "currency": "usd",
      "default_source": null,
      "delinquent": false,
      "display_name": null,
      "email": "[email protected]",
      "email_confirm": true,
      "email_hardbounce": false,
      "first_name": "Jane",
      "has_password": true,
      "language": null,
      "last_active_at": 1704067200,
      "last_login_method": "email",
      "last_name": "Doe",
      "mail_marketing": null,
      "metadata": null,
      "object_id": "cust_a1b2c3d4e5f6g7h8i9j0k1l2",
      "organization": null,
      "password_last_updated_at": "2024-01-02T12:00:00.000000Z",
      "phone": null,
      "phone_confirm": null,
      "referer": "https://example.com/account/settings",
      "salutation": null,
      "site_ids": [1],
      "tele_marketing": null,
      "title": null,
      "username": null
    },
    "previous_attributes": {
      "password_last_updated_at": "2024-01-01T00:00:00.000000Z"
    }
  }
}

customer.PasswordResetRequestSubmitted

Triggered When

  • A customer requests a password reset via the SDK (forgot password flow)

Payload

The payload includes a password_reset_token that can be used to build custom password reset links, and a referer field indicating the URL where the request was initiated.

{
  "type": "customer.PasswordResetRequestSubmitted",
  "id": "evt_g7H8i9J0k1L2m3N4o5P6q7R8",
  "created": 1704153600,
  "data": {
    "object": {
      "object": "customer",
      "id": 67890,
      "balance": 0,
      "billing_email": null,
      "created": "2024-01-01T00:00:00.000000Z",
      "currency": "usd",
      "default_source": null,
      "delinquent": false,
      "display_name": null,
      "email": "[email protected]",
      "email_confirm": true,
      "email_hardbounce": false,
      "first_name": "Jane",
      "has_password": true,
      "language": null,
      "last_active_at": 1704067200,
      "last_login_method": "email",
      "last_name": "Doe",
      "mail_marketing": null,
      "metadata": null,
      "object_id": "cust_a1b2c3d4e5f6g7h8i9j0k1l2",
      "organization": null,
      "password_last_updated_at": "2024-01-01T00:00:00.000000Z",
      "password_reset_token": "xyz789abc012def345ghi678jkl901",
      "phone": null,
      "phone_confirm": null,
      "referer": "https://example.com/login",
      "salutation": null,
      "site_id": 1,
      "site_ids": [1],
      "tele_marketing": null,
      "title": null,
      "username": null
    }
  }
}

customer.passwordless_login_request

Triggered When

  • A customer requests a passwordless login link (magic link)

Payload

The payload includes a passwordless_token for building custom magic login links and a referer field.

{
  "type": "customer.passwordless_login_request",
  "id": "evt_h8I9j0K1l2M3n4O5p6Q7r8S9",
  "created": 1704153600,
  "data": {
    "object": {
      "object": "customer",
      "id": 67890,
      "balance": 0,
      "billing_email": null,
      "created": "2024-01-01T00:00:00.000000Z",
      "currency": "usd",
      "default_source": null,
      "delinquent": false,
      "display_name": null,
      "email": "[email protected]",
      "email_confirm": true,
      "email_hardbounce": false,
      "first_name": "Jane",
      "has_password": true,
      "language": null,
      "last_active_at": 1704067200,
      "last_login_method": "email",
      "last_name": "Doe",
      "mail_marketing": null,
      "metadata": null,
      "object_id": "cust_a1b2c3d4e5f6g7h8i9j0k1l2",
      "organization": null,
      "password_last_updated_at": "2024-01-01T00:00:00.000000Z",
      "passwordless_token": "mno345pqr678stu901vwx234yz567",
      "phone": null,
      "phone_confirm": null,
      "referer": "https://example.com/login",
      "salutation": null,
      "site_ids": [1],
      "tele_marketing": null,
      "title": null,
      "username": null
    }
  }
}

Payload Fields

Customer Object

FieldTypeDescription
objectstringObject type identifier, always customer
idintegerUnique identifier for the customer
balanceintegerCustomer's account balance in cents
billing_emailstringBilling-specific email address, if different from the main email
createdstringISO 8601 timestamp when the customer was created
currencystringThree-letter ISO currency code (lowercase)
default_sourceobjectCustomer's default payment source (see Default Source Object), or null
delinquentbooleanWhether the customer has an overdue payment
display_namestringCustomer's display name
emailstringCustomer's primary email address
email_confirmbooleanWhether the customer's email is confirmed
email_hardbouncebooleanWhether the email address has a hard bounce recorded
first_namestringCustomer's first name
has_passwordbooleanWhether the customer has set a password
languagestringCustomer's preferred language code
last_active_atintegerUnix timestamp of the customer's last activity, or null
last_login_methodstringLast login method used: email, auth0, google, or facebook
last_namestringCustomer's last name
mail_marketingbooleanWhether the customer opted into email marketing
metadataobjectCustom key-value data attached to the customer
object_idstringExternal payment gateway customer identifier (e.g., Stripe cust_...)
organizationobjectCustomer's organization, if any
password_last_updated_atstringISO 8601 timestamp when the password was last changed
phonestringCustomer's phone number
phone_confirmbooleanWhether the phone number is confirmed
salutationstringCustomer's salutation (Mr, Mrs, Ms, etc.)
site_idintegerThe site where the action occurred (only present on some events)
site_idsarrayList of all site IDs the customer belongs to
tele_marketingbooleanWhether the customer opted into telemarketing
titlestringCustomer's professional title
usernamestringCustomer's username

Event-Specific Fields

These fields are added by specific events and are not part of the base customer object.

FieldTypePresent InDescription
email_verify_tokenstringemail_verification_requestToken for building custom email verification links
password_reset_tokenstringPasswordResetRequestSubmittedToken for building custom password reset links
passwordless_tokenstringpasswordless_login_requestToken for building custom magic login links
refererstringpassword_update.succeeded, PasswordResetRequestSubmitted, passwordless_login_requestURL where the action was initiated

Default Source Object (Nested)

Present when the customer has a default payment method on file.

FieldTypeDescription
objectstringAlways source
idintegerPayment source ID
object_idstringExternal payment gateway source identifier
object_gatewaystringPayment gateway name (e.g., stripe)
brandstringCard brand (e.g., visa, mastercard)
countrystringTwo-letter country code of the card issuer
exp_monthintegerCard expiration month
exp_yearintegerCard expiration year
fundingstringCard funding type: credit, debit, or prepaid
last4stringLast four digits of the card number
site_idsarraySite IDs associated with the source

Nested Relations (customer.updated and customer.deleted only)

The customer.updated and customer.deleted events include nested lists:

FieldTypeDescription
subscriptionslistCustomer's subscriptions at the time of the event
shipping_addresseslistCustomer's shipping addresses
billing_addresseslistCustomer's billing addresses

Each nested list follows the standard list format:

{
  "object": "list",
  "data": [...]
}

Previous Attributes

Events that include previous_attributes (customer.updated, customer.deleted, customer.password_update.succeeded) provide a previous_attributes object at the same level as the object key in data. This object contains only the fields that changed, with their values before the update.

If the customer's default_source changed, the previous source is represented as a full source object rather than just the ID.


Login Method Values

ValueDescription
emailLogged in with email and password
auth0Logged in via Auth0
googleLogged in via Google
facebookLogged in via Facebook

Related