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

# Ingest Custom Properties from dbt | Custom Metadata Guide

> Ingest dbt custom properties to enrich table metadata with organization-specific attributes and values.

# Ingest Custom Properties from dbt

Collate reads custom property values from your dbt `manifest.json` file and applies them to the matching tables in Collate. Custom properties let you extend the standard metadata model with fields specific to your organization — such as SLA hours, data classification levels, or refresh frequencies.

<Note>
  **Note**: The custom properties must be pre-defined on the Table entity type in Collate before ingestion runs. If a property isn't defined, Collate logs a warning and skips it.
</Note>

## How to Ingest Custom Properties from dbt

Follow these steps to assign custom property values from dbt to your tables in Collate.

### Step 1: Define Custom Properties in Collate

Set up the custom properties in Collate before running ingestion — Collate won't create them automatically.

Go to **Settings** > **Custom Properties** > **Tables**, click **Add Property**, and define the property name and type.

For detailed instructions, see the [Custom Properties documentation](/ai-2-0/how-to-guides/guide-for-data-users/custom).

### Step 2: Add Custom Properties to Your dbt `schema.yml`

Tell dbt which custom property values to assign by adding them under `model → meta → openmetadata → customProperties` in your `schema.yml`.

For more details on the dbt `meta` field, see the [dbt meta configuration reference](https://docs.getdbt.com/reference/resource-configs/meta).

```yaml theme={null}
models:
  - name: customers
    meta:
      openmetadata:
        customProperties:
          sla_hours: 24
          data_steward: "John Doe"
          refresh_frequency: "daily"
    description: This table has basic information about a customer
    columns:
      - name: customer_id
        description: This is a unique identifier for a customer
        tests:
          - unique
          - not_null
```

After you save and run your dbt workflow, the generated `manifest.json` will include the custom properties under `node_name → config → meta → openmetadata → customProperties`:

```json theme={null}
"model.jaffle_shop.customers": {
  "raw_sql": "sample_raw_sql",
  "compiled": true,
  "resource_type": "model",
  "depends_on": {},
  "database": "dev",
  "schema": "dbt_jaffle",
  "config": {
    "enabled": true,
    "alias": null,
    "meta": {
      "openmetadata": {
        "customProperties": {
          "sla_hours": 24,
          "data_steward": "John Doe",
          "refresh_frequency": "daily"
        }
      }
    }
  }
}
```

### Step 3: Verify

Confirm the custom properties appear on the table details page after ingestion completes.

Open the table in Collate and scroll to the **Custom Properties** section — the values from dbt will appear there.

## Supported Property Types

Use these types when defining custom properties in Collate and setting values in your `schema.yml`.

| Type                  | Description                  | Example Value                               |
| --------------------- | ---------------------------- | ------------------------------------------- |
| `string`              | Plain text value             | `"value"`                                   |
| `integer`             | Whole number                 | `42`                                        |
| `number`              | Decimal number               | `3.14`                                      |
| `markdown`            | Markdown formatted text      | `"# Header\nContent"`                       |
| `sqlQuery`            | SQL query string             | `"SELECT * FROM table"`                     |
| `email`               | Valid email address          | `"user@example.com"`                        |
| `date-cp`             | Date string                  | `"2024-01-15"`                              |
| `dateTime-cp`         | DateTime string              | `"2024-01-15T10:30:00"`                     |
| `time-cp`             | Time string                  | `"10:30:00"`                                |
| `timestamp`           | Milliseconds since epoch     | `1705315200000`                             |
| `duration`            | ISO 8601 duration format     | `"P23DT23H"`                                |
| `enum`                | Single or multi-select value | `"High"` or `["High", "Critical"]`          |
| `entityReference`     | Reference to another entity  | See [Advanced Examples](#advanced-examples) |
| `entityReferenceList` | List of entity references    | See [Advanced Examples](#advanced-examples) |
| `timeInterval`        | Time interval with start/end | See [Advanced Examples](#advanced-examples) |
| `table-cp`            | Tabular data with rows       | See [Advanced Examples](#advanced-examples) |

## Advanced Examples

YAML examples for complex custom property types that need structured values.

#### Entity Reference

Reference another entity (user, team, dashboard, etc.) in Collate:

```yaml theme={null}
models:
  - name: customers
    meta:
      openmetadata:
        customProperties:
          data_owner:
            type: "user"
            fqn: "john.doe"
          related_dashboard:
            type: "dashboard"
            fqn: "service.dashboard_name"
```

#### Entity Reference List

Reference multiple entities:

```yaml theme={null}
models:
  - name: customers
    meta:
      openmetadata:
        customProperties:
          stakeholders:
            - type: "user"
              fqn: "john.doe"
            - type: "user"
              fqn: "jane.smith"
```

#### Time Interval

Specify a time range with start and end timestamps:

```yaml theme={null}
models:
  - name: customers
    meta:
      openmetadata:
        customProperties:
          valid_period:
            start: 1705315200000
            end: 1705401600000
```

#### Table Custom Property

For table-type custom properties with rows and columns:

```yaml theme={null}
models:
  - name: customers
    meta:
      openmetadata:
        customProperties:
          data_quality_rules:
            - rule_name: "not_null_check"
              threshold: 99.5
              severity: "high"
            - rule_name: "unique_check"
              threshold: 100
              severity: "critical"
```

## Validation and Error Handling

What Collate does when a custom property value can't be applied.

| Scenario                                    | Behavior                                                       |
| ------------------------------------------- | -------------------------------------------------------------- |
| Custom property not defined on Table entity | Warning logged, property skipped                               |
| Invalid value for property type             | Warning logged with details, property skipped                  |
| Invalid enum value (single-select)          | Warning logged, property skipped                               |
| Invalid enum value (multi-select)           | Invalid values filtered out, valid values applied with warning |
| Missing required fields for complex types   | Warning logged, property skipped                               |

Example warning message:

```
Validation failed for custom property 'sla_hours' (type: integer): Expected integer value. Provided value: "24 hours"
```

## Complete Example

A full `schema.yml` showing multiple custom property types used together.

```yaml theme={null}
version: 2

models:
  - name: customers
    description: "Customer master data table"
    meta:
      openmetadata:
        domain: "Sales"
        tier: "Tier.Tier2"
        customProperties:
          sla_hours: 24
          data_classification: "Confidential"
          refresh_frequency: "hourly"
          last_certified: "2024-01-15"
          data_owner:
            type: "user"
            fqn: "john.doe"
          data_quality_rules:
            - rule_name: "completeness"
              threshold: 99.9
              severity: "high"
        owner:
          - "john_doe"
          - "data_engineering_team"
    columns:
      - name: customer_id
        description: "Unique customer identifier"
```
