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

# record.created

> A record was created on any object in the workspace.

Fires once when a record is created, on **any** object. There is no per-object
subscription: filter on `objectId` in your handler if you only care about deals.

## Payload

```json theme={null}
{
  "id": "whd_3JAx8Qm2rL9pKd",
  "event": "record.created",
  "createdAt": "2026-09-11T14:18:54.201Z",
  "data": {
    "recordId": "rec_3Ab9xK2mQ7",
    "objectId": "obj_2Zc7pL",
    "record": {
      "name": "Ravenna Foods",
      "annual_value": 48000,
      "stage": ["opt_3Kd8sM"],
      "owner": ["user_5Nc1rT"]
    }
  }
}
```

<ResponseField name="recordId" type="string" required>
  The new record's id. Always present: a payload without one is not sent at all.
</ResponseField>

<ResponseField name="objectId" type="string">
  The object the record belongs to. Omitted if the emitter did not carry it.
</ResponseField>

<ResponseField name="record" type="object">
  The record's fields, keyed by **property key**. Omitted entirely when the
  emitter carried no field list, which is not the same as a record with no
  fields.
</ResponseField>

## Reading the fields

Keys are property keys (`annual_value`), stable across renames. Values are the
**stored** shape, so a select is `["opt_…"]` and a relation is `["rec_…"]`. See
[Payload format](/dev/webhooks/payload#field-values-are-stored-values-not-display-values).

A field whose property key cannot be resolved is dropped rather than included
under an empty key, so `record` may be narrower than the record itself.

<Note>
  Unlike [`record.updated`](/dev/webhooks/events/record-updated), the `record`
  object here does **not** carry an `id` key. The record's id is `recordId` on
  the payload.
</Note>

## Worth knowing

* **Bulk creation does not fire this.** Imports, job runs and other automated
  bulk writes are suppressed. See
  [the catalog](/dev/webhooks/events/overview#bulk-writes-do-not-fire-webhooks).
* **A form submission creates a record**, and fires both this and
  [`form.submitted`](/dev/webhooks/events/form-submitted). If you act on both,
  deduplicate on `recordId`.
* The payload is a snapshot at creation. Anything set afterwards arrives as
  [`record.updated`](/dev/webhooks/events/record-updated).

## Example

```ts theme={null}
custral.on("record.created", async (event) => {
  const {recordId, objectId, record} = event.data;

  if (objectId !== process.env.DEALS_OBJECT_ID) return;

  await crm.upsertDeal({
    externalId: recordId,
    name: String(record?.name ?? "Untitled"),
    value: Number(record?.annual_value ?? 0),
  });
});
```


## Related topics

- [Records](/dev/webhooks/events/records.md)
- [Event catalog](/dev/webhooks/events/overview.md)
- [record.deleted](/dev/webhooks/events/record-deleted.md)
- [record.updated](/dev/webhooks/events/record-updated.md)
- [form.submitted](/dev/webhooks/events/form-submitted.md)
