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

# contact.created

> A new contact was added at a location.

A `contact.created` event fires when a brand-new contact record appears in FPT for the first time. This happens when:

* A staff member manually adds a contact in the FPT admin
* A lead-source integration (Meta/Facebook ads, ClubReady, MindBody import, etc.) creates a contact
* A self-service signup form (kiosk, public web form) submits

<Note>
  We only fire `contact.created` for genuinely new contacts going forward. Contacts that existed before this event type was rolled out won't retroactively fire `created`. If you need to seed your system with pre-existing contacts, use the FPT admin's CSV export — webhooks are a forward-looking event stream, not a historical snapshot.
</Note>

## Payload

```json theme={null}
{
  "eventId":        "9f1c7e2a8c4d4b1b9e3f5a6d7c8b9a0e",
  "eventType":     "contact.created",
  "eventTimestamp": "2026-06-10T23:45:00.123Z",
  "locationId":    1234,
  "organizationId": 5678,
  "apiVersion":    "2026-05-29",
  "data": {
    "contactId":      9876,
    "firstName":      "Jane",
    "lastName":       "Doe",
    "fullName":       "Jane Doe",
    "email":          "jane@example.com",
    "phone":          "+15551234567",
    "isActive":       true,
    "contactGroupId": 1,
    "subGroupId":     null,
    "subGroupName":   null,
    "inquiryDate":    "2026-06-10T23:45:00.123Z",
    "operation":      "create"
  }
}
```

### Fields in `data`

The default payload carries the **identity baseline** so you can route + sync the contact without a separate API lookup. Additional PII categories (address, demographics, health, financial) flow through only if the subscription has opted into them — see [PII categories](/webhooks/subscriptions#pii-categories).

| Field               | Type                           | Description                                                                                                                                                                         |
| ------------------- | ------------------------------ | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `contactId`         | `number`                       | Unique contact ID at this location. Pair with `locationId` from the envelope for cross-location dedupe.                                                                             |
| `firstName`         | `string`                       | First name.                                                                                                                                                                         |
| `lastName`          | `string`                       | Last name.                                                                                                                                                                          |
| `fullName`          | `string`                       | Concatenated display name.                                                                                                                                                          |
| `email`             | `string`                       | Primary email.                                                                                                                                                                      |
| `phone`             | `string`                       | Primary phone in E.164 format.                                                                                                                                                      |
| `isActive`          | `boolean`                      | `true` for newly created contacts. Flips to `false` on soft-delete.                                                                                                                 |
| `contactGroupId`    | `number`                       | Lifecycle group (1=Leads, 2=Prospects, 3=Members, 4=Past Members, 5=Non-members, 6=Other, 7=Staff). See [`contact.status_changed`](/events/contact-status-changed) for transitions. |
| `subGroupId`        | `number` or `null`             | Business sub-group ID (location-scoped). `null` if no sub-group assigned.                                                                                                           |
| `subGroupName`      | `string` or `null`             | Human-readable sub-group label.                                                                                                                                                     |
| `inquiryDate`       | `ISO 8601 timestamp`           | When this contact first inquired.                                                                                                                                                   |
| `operation`         | `string`                       | Always `"create"` for this event type. Useful for branching when one endpoint handles multiple event types.                                                                         |
| `tagIds`            | `number[]`                     | Tag IDs assigned to this contact, if any.                                                                                                                                           |
| `assignedUserId`    | `number` or `null`             | Staff member assigned to this contact.                                                                                                                                              |
| activity timestamps | `ISO 8601 timestamp` or `null` | `lastContactedDate`, `lastSmsOutDate`, `lastEmailOutDate`, `lastCallDate`, `lastActivityAt`, etc.                                                                                   |
| consent flags       | `boolean`                      | `canEmail`, `canText`, `canCall`, `isBlockEmail`, `isBlockSms` — respect these before reaching out.                                                                                 |

<Note>
  **Opt-in fields** — `city`, `state`, `postalCode`, `countryCode` (address), `birthdate`, `gender`, `company` (demographics), and membership/billing aggregates only appear when the subscription has the matching PII category checked in the FPT admin.
</Note>

## Companion events

Right after a contact is created, you may see follow-up events for the same contactId within a few seconds:

* `contact.status_changed` — if the contact's initial group differs from the location default
* `contact.sub_group_changed` — if the contact was assigned to a sub-group on creation

These all carry the same `contactId`, so dedupe in your handler if you only care about "new contact appeared."

## What you might do with this

* **Sync to your CRM** — create a matching record in your system the moment a contact appears in FPT
* **Welcome workflow** — trigger an onboarding email or SMS via your marketing platform
* **Analytics** — count new leads / new members per location per day
* **Lead routing** — assign the contact to a sales rep in your queueing system
