> ## Documentation Index
> Fetch the complete documentation index at: https://docs.tryprofound.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Events reference

> Profound Pixel events, their fields, and usage

## Standard events

Profound Pixel recognizes the following standard events. Each event accepts a set of optional fields. See [Field sets](#field-sets) for what each set accepts.

| Event | When to send it | Field set |
| - | - | - |
| `page_viewed` | A visitor views a page | `contents` |
| `contents_viewed` | A visitor views a product, listing, article, or other content unit | `contents` |
| `items_added` | A visitor adds items to a cart or selection | `contents` |
| `checkout_started` | A visitor begins checkout | `contents` |
| `order_created` | A purchase completes | `contents` |
| `subscription_created` | A paid subscription starts | `plan_enrollment` |
| `trial_started` | A free trial starts | `plan_enrollment` |
| `lead_created` | A visitor submits a lead form or requests contact | `customer_action` |
| `registration_completed` | A visitor finishes account or event registration | `customer_action` |
| `appointment_scheduled` | A visitor books a meeting, demo, or consultation | `customer_action` |

### Field sets

| Field set | Recognized fields |
| - | - |
| `contents` | `amount`, `currency`, `contents[]` |
| `plan_enrollment` | `plan_id`, `amount`, `currency`, `contents[]` |
| `customer_action` | `amount`, `currency` |

<Accordion title="contents set properties">
  | Property | Type | Required | Description |
  | - | - | - | - |
  | `amount` | number | no | A whole number in minor units for the given currency (cents for US dollars). For example, \$129.99 = `12999`. Always pair it with `currency` |
  | `currency` | string | yes, if `amount` is present | An [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217) currency code, such as `USD` |
  | `contents[]` | array | no | A list of items involved in the event. Each entry takes `id`, `name`, `content_type`, `quantity` (a whole number), `amount`, and `currency` |

  ```javascript Example event theme={null}
    pfq('track', 'order_created', {
      amount: 12999, currency: 'USD',
      contents: [
        {
          id: 'SKU123',
          name: 'Widget',
          content_type: 'product',
          quantity: 1,
          amount: 12999,
          currency: 'USD'
        }
      ]
    });
  ```
</Accordion>

<Accordion title="plan_enrollment set properties">
  | Property | Type | Required | Description |
  | - | - | - | - |
  | `plan_id` | string | no | Your internal plan identifier |
  | `amount` | number | no | A whole number in minor units for the given currency (cents for US dollars). For example, \$129.99 = `12999`. Always pair it with `currency`. |
  | `currency` | string | yes, if `amount` is present | An [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217) currency code, such as `USD` |
  | `contents[]` | array | no | A list of items involved in the event. Each entry takes `id`, `name`, `content_type`, `quantity` (a whole number), `amount`, and `currency` |

  ```javascript Example event theme={null}
    pfq('track', 'subscription_created', {
      plan_id: 'pro-monthly',
      amount: 4900,
      currency: 'USD',
      contents: [
        {
          id: 'pro-monthly',
          name: 'Pro plan, monthly billing',
          content_type: 'plan',
          quantity: 1,
          amount: 4900,
          currency: 'USD'
        }
      ]
    });
  ```
</Accordion>

<Accordion title="customer_action set properties">
  | Property | Type | Required | Description |
  | - | - | - | - |
  | `amount` | number | no | A whole number in minor units for the given currency (cents for US dollars). For example, \$129.99 = `12999`. Always pair it with `currency`. |
  | `currency` | string | yes, if `amount` is present | An [ISO 4217](https://en.wikipedia.org/wiki/ISO_4217) currency code, such as `USD`. |

  ```javascript Example event theme={null}
    pfq('track', 'lead_created', {
      amount: 50000,
      currency: 'USD',
      form: 'contact-sales'
    });
  ```
</Accordion>

### Custom properties

Add your own custom properties (such as `order_id` or `product_id`) alongside the recognized fields. Two limits apply: up to 128 properties per event, and up to 64 KiB per request body. An event that exceeds either limit is rejected with a `400` error.

## Custom events

For anything outside the standard set, send a custom event: call `pfq('trackCustom', …)` with any event name and any properties you choose.

```javascript theme={null}
  pfq('trackCustom', 'requested_demo', { plan: 'enterprise' });
```

Maximum length for event names is 128 characters. The suggested naming convention is lowercase letters, numbers, underscores or dashes, and a name that doesn't match a [standard event](#standard-events) name, so your custom events are easy to tell apart in reporting.

<Warning>
  **Never send customers' personal data in events.** This includes emails, phone numbers, names, government IDs, payment data, street addresses, and special-category data, such as health, financial account details, or biometrics. As a safety measure, Profound drops personal data keys and redacts values that look like personal data.
</Warning>

## Tie events to your own user IDs

If you need to match conversions to records in your own systems, make an `identify` call with your internal identifiers after the customer logs in and before any events are sent:

```javascript theme={null}
  pfq('identify', {
    external_user_id: 'u_123',
    external_account_id: 'acct_456'
  });
```

The following fields are accepted:

| Field | Type | Required |
| - | - | - |
| `external_user_id` | string | no |
| `external_account_id` | string | no |

Any other fields are silently ignored.

The pixel holds the IDs in memory until your consent signal allows sending, then attaches them to the events that follow.

<Warning>
  Send internal IDs only, never customers' names, emails, phone numbers, or other identifiers. Personal data in the `identify` fields causes the whole event to be rejected with a `400` error.
</Warning>
