# Segment Commands
Manage CDP segments for audiences and activations.
Alias
`tdx sg` is an alias for `tdx segment`
## Commands
### Navigation & Discovery
| Command | Description |
| --- | --- |
| [`use`](#use) | Set parent segment context |
| [`list`](#list) | List folders and segments |
| [`view`](#view) | Show segment details |
| [`desc`](#desc) | Show segment schema (column types) |
| [`show`](#show) | Execute segment SQL and show results |
| [`sql`](#sql) | Get SQL query for segment |
| [`fields`](#fields) | List available fields for segmentation |
### YAML Sync
| Command | Description |
| --- | --- |
| [`pull`](#pull) | Pull child segments to YAML files |
| [`push`](#push) | Push YAML files to TD as child segments |
| [`validate`](#validate) | Validate segment and journey YAML files locally |
## Typical Usage
```bash
# 0. List available parent segments
tdx ps list
# 1. Pull all child segments from a parent to YAML files
# (this also sets parent_segment context)
tdx sg pull "My Audience"
# Creates: segments/my-audience/
# 2. Edit YAML files locally (add/modify segments and activations)
# Edit segments/my-audience/high-value-customers.yml with your text editor
# 3. Push changes back to TD (syncs segments and activations)
tdx sg push
# 4. Review segments in TD (context already set by pull)
tdx sg list -r
```
The pull/push workflow enables version control and code review for segment definitions:
```bash
# Work from any subdirectory - push finds tdx.json automatically
cd segments/my-audience/marketing
# Edit newsletter-subs.yml
tdx sg push # Push all changes from root
```
## How It Works
**Child segments** define filtered audiences within a parent segment. They use rules (conditions) to filter customers from the parent segment's enriched data. Each child segment can have one or more **activations** that export the filtered audience to external systems.
The `tdx sg` commands help you manage child segments as local YAML files. You can `pull` existing segments from Treasure Data, edit them locally, and `push` changes back. The YAML files include both segment rules and activation configurations.
```mermaid
flowchart TB
subgraph LOCAL["Local"]
YAML["segments/<parent>/*.yml"]
CLI["tdx sg desc/show/sql"]
end
subgraph TD["Treasure Data"]
API["CDP API"]
subgraph PS["Parent Segment"]
PARENT[("Enriched
Customer Data")]
end
CHILD["Child Segments"]
ACT["Activations"]
EXT["External Systems
(S3, Salesforce, etc.)"]
end
YAML <-->|"pull / push"| API
CLI -.->|"query"| CHILD
API --> CHILD
PARENT -->|"filtered by rules"| CHILD
CHILD -->|"activations"| ACT
ACT -->|"export"| EXT
```
### Folder Structure
Pull creates individual YAML files for each segment, organized by folder:
```
segments/
└── my-audience/ # Normalized from "My Audience"
├── tdx.json # { "parent_segment": "My Audience" }
├── active-users.yml # Root-level segment
├── high-value-customers.yml # Another root-level segment
├── marketing/
│ ├── email-subscribers.yml # Segment in Marketing folder
│ └── newsletter-subs.yml # Another segment in folder
└── sales/
├── enterprise-leads.yml # Segment in Sales folder
└── q1/
└── q1-targets.yml # Segment in Sales/Q1 folder
```
Each segment file includes its activations (syndications), enabling file-based management of your CDP configuration.
## Context-Based Workflow
Child segment commands require a parent segment context. Set it using one of these methods:
```bash
# Option 1: Use the segment use command
tdx sg use "My Audience"
# Option 2: Pull sets context automatically
tdx sg pull "My Audience"
# Now run segment commands without specifying parent
tdx sg list # List folders and segments in "My Audience"
tdx sg view "Premium Users" # View child segment details
tdx sg desc "Premium Users" # Show segment schema
```
Names are case-sensitive. Pattern matching (`*`, `?`) is supported for filtering.
## Commands
### use
Set or show the parent segment context for subsequent commands.
```bash
tdx sg use [name]
```
```bash
# Set parent segment context
tdx sg use "My Audience"
# Show current context (no argument)
tdx sg use
```
### list
List folders and segments within the current parent segment context.
```bash
tdx sg list [folder] [options]
```
| Option | Description |
| --- | --- |
| `-r, --recursive` | List recursively (tree view) |
| `--max-depth ` | Maximum recursion depth (default: 10) |
| `-w, --web` | Show web console URLs for segments |
```bash
# First, set parent segment context
tdx use parent_segment "My Audience"
# List folders and segments in context
tdx sg list
# List contents of a specific folder
tdx sg list "Marketing"
# Filter by pattern (glob)
tdx sg list "*Premium*"
# List recursively (tree view)
tdx sg list -r
# Show web console URLs for each segment
tdx sg list -w
```
JSON Output
When using `--json` or `--jsonl` output, URLs are always included in the response.
Listing Parent Segments
Use `tdx ps list` to list available parent segments.
### view
Show details of a folder or child segment within the current context.
```bash
tdx sg view [name] [options]
```
| Option | Description |
| --- | --- |
| `-w, --web` | Open segment in web browser |
```bash
# Show folder details
tdx sg view "Marketing"
# Show child segment details (includes web console URL)
tdx sg view "Premium Users"
# Open segment in web browser
tdx sg view "Premium Users" -w
# JSON output
tdx sg view "Premium Users" --json
```
Web Console URL
The output always includes a `url` field with a link to the segment in the Treasure Data web console.
### desc
Show schema (column names and types) for a child segment.
```bash
tdx sg desc [name]
```
```bash
# Show schema for child segment
tdx sg desc "Premium Users"
# JSON output
tdx sg desc "Premium Users" --json
```
### show
Execute segment SQL query and show results.
```bash
tdx sg show [name]
```
```bash
# Execute segment SQL query and show results
tdx sg show "Premium Users"
# With output format
tdx sg show "Premium Users" --json
```
### sql
Get SQL query for a child segment.
```bash
tdx sg sql [name]
```
```bash
# Get SQL query for segment
tdx sg sql "Premium Users"
# JSON output
tdx sg sql "Premium Users" --json
```
### fields
List available fields for segmentation in the current parent segment context.
```bash
tdx sg fields
```
```bash
# List available fields (uses parent_segment context)
tdx sg fields
# JSON output
tdx sg fields --json
```
### pull
Pull all child segments from a parent segment to individual YAML files. This also sets the `parent_segment` context for subsequent commands.
```bash
tdx sg pull [parent_name]
```
The `parent_name` argument is optional if you have set a parent segment context with `tdx sg use`.
| Option | Description |
| --- | --- |
| `-y, --yes` | Skip confirmation prompt |
| `--dry-run` | Preview changes without writing files |
```bash
# Pull all segments from parent (sets context)
tdx sg pull "My Audience"
# Preview changes without writing files
tdx sg pull "My Audience" --dry-run
# Skip confirmation prompt
tdx sg pull "My Audience" -y
# With context set (tdx sg use "My Audience")
tdx sg pull
```
**Output includes:**
- Number of segments and activations found
- New, changed, and unchanged files
- Diff preview for changed files
### push
Push individual segment YAML files to Treasure Data. Uses `parent_segment` context or detects parent from `tdx.json` in the segments directory.
```bash
tdx sg push [directory]
```
| Option | Description |
| --- | --- |
| `-y, --yes` | Skip confirmation prompt |
| `--dry-run` | Preview changes without applying |
| `--delete` | Delete segments not in local YAML files |
```bash
# Push all segments (uses context or tdx.json)
tdx sg push
# Push from specific directory
tdx sg push segments/my-audience
# Preview changes without applying
tdx sg push --dry-run
# Skip confirmation prompt
tdx sg push -y
```
**Features:**
- Automatically creates missing TD folders
- Shows diff before applying changes (segments and activations)
- Shows segments/activations that will be deleted (exist on server but not in YAML)
- Syncs activations by name (create/update/delete)
- Creates new segments or updates existing ones based on segment name
- Asks for confirmation before applying changes
### validate
Validate segment and journey YAML files locally without pushing to Treasure Data. This is useful to catch syntax errors, missing references, and invalid configurations before pushing.
```bash
tdx sg validate [target]
```
| Argument | Description |
| --- | --- |
| `target` | File or directory to validate (optional, defaults to context directory) |
```bash
# Validate all segments and journeys in context directory
tdx sg validate
# Validate a specific file
tdx sg validate high-value-customers.yml
# Validate a specific directory
tdx sg validate segments/my-audience
```
**Validations performed:**
For segments:
- Missing or empty `name` field
- Empty attribute values in conditions
- Invalid operator types
- Missing required operator fields (e.g., `value` for Equal, `min`/`max` for Between)
- Invalid `arrayMatching` configuration
For journeys:
- Missing `name` or empty `stages`
- Duplicate step names
- Invalid `next` step references
- Wait step condition references to undefined embedded segments
- Decision branch references to undefined segments
- A/B test variant percentages not summing to 100%
- Invalid jump step targets
**Example output:**
```
✔ high-value-customers.yml (segment)
✖ bad-journey.yml (journey): 2 error(s)
bad-journey.yml:15:7: error [MISSING_SEGMENT_REFERENCE]
Wait condition references undefined segment 'missing_segment'
14 | condition:
15 | segment: missing_segment
| ^
16 | next: to_end
bad-journey.yml:22:5: error [INVALID_NEXT_REFERENCE]
Step references non-existent step 'nonexistent'
21 | name: activation_step
22 | next: nonexistent
| ^
23 | with:
Validation failed: 1 file(s) with errors, 1 valid
```
Validation also runs automatically before `tdx sg push`, so you can catch errors early in your workflow.
## Segment YAML Schema
Each segment has its own YAML file with optional activations:
```yaml
# segments/my-audience/us-customers.yml
name: US Customers
description: All customers in the United States
rule:
type: Value
attribute: country
operator:
type: Equal
value: US
```
```yaml
# segments/my-audience/marketing/high-value-customers.yml
name: High Value Customers
description: Customers with LTV > $1000
kind: batch # batch, realtime, or funnel_stage
visible: true # Show in UI (default: true)
rule:
type: And
conditions:
- type: Value
attribute: ltv
operator:
type: Greater
value: 1000
activations:
- name: Daily Salesforce Sync
description: Sync high-value customers to SFDC daily
connection: my-salesforce-connection
all_columns: false
columns:
- email
- first_name
- last_name
- ltv
schedule:
type: daily
timezone: America/Los_Angeles
connector_config:
object: Contact
mode: upsert
- name: Weekly Marketing Cloud Export
connection: marketing-cloud-export
all_columns: true
schedule:
type: weekly
repeat_sub_frequency: [1] # Monday
timezone: UTC
notification:
notify_on:
- onSuccess
- onFailure
email_recipients:
- user@example.com # Must be TD account email
```
### Activation Schema
Activations (syndications) define how segment data is exported to external systems:
| Field | Description | Required |
| --- | --- | --- |
| `name` | Activation name (used for matching) | Yes |
| `description` | Description | No |
| `connection` | TD Connection name (use `tdx connections` to list) | Yes |
| `all_columns` | Export all columns | No (default: false) |
| `columns` | Columns to export (if not all_columns) | No |
| `schedule` | Schedule configuration | No |
| `connector_config` | Connector-specific settings (see below) | No |
| `notification` | Notification settings (see below) | No |
Finding Connection Names
Use `tdx connections` to list available connections and their names:
```bash
tdx connections
```
**Schedule Types:**
| Type | Description | Additional Fields |
| --- | --- | --- |
| `none` | Manual trigger only | - |
| `minutes_interval` | Run every N minutes | `repeat_frequency` (interval in minutes) |
| `hourly` | Run every hour | - |
| `daily` | Run daily | `timezone` |
| `weekly` | Run weekly | `repeat_sub_frequency` (day numbers 0-6), `timezone` |
| `monthly` | Run monthly | `repeat_sub_frequency` (day numbers 1-31), `timezone` |
| `cron` | Cron expression | `cron`, `timezone` |
**Column Format:**
Columns can be simple strings or objects with additional properties:
```yaml
columns:
# Simple column name
- email
- first_name
# Column with visibility setting
- name: ssn
visibility: masked # clear or masked
```
**Notification Settings:**
Configure email notifications for activation runs:
```yaml
notification:
notify_on:
- onSuccess # Notify on successful completion
- onFailure # Notify on failure
email_recipients:
- user@example.com # Must be TD account email addresses
```
| Field | Description |
| --- | --- |
| `notify_on` | Events to notify on: `onSuccess`, `onFailure` |
| `email_recipients` | List of email addresses (must be registered TD account emails) |
**Connector Config Settings:**
The `connector_config` field contains connector-specific settings that vary by connection type. Use `tdx connection schema ` to see available fields for a specific connection.
```yaml
# Example: Treasure Data connector
connector_config:
database_name: my_database
table_name: my_table
mode: append # append or replace
# Example: Salesforce Marketing Cloud connector
connector_config:
de_name: CustomerSegment
shared_data_extension: false
```
Schema Validation
When pushing segments, tdx automatically validates `connector_config` against the connector's schema. Invalid values or unknown fields will show helpful error messages:
```
Error: Invalid connector_config for activation "My Activation":
× mode: Invalid value for "Mode"
Expected: one of: append, replace
Received: invalid_mode
```
Use `tdx connection schema ` to see valid field names and values.
### Important Behaviors
**Filename Collisions:**
When pulling segments, filenames are sanitized (lowercase, spaces to hyphens). If two segments would result in the same filename (e.g., "My Segment" and "my-segment"), numeric suffixes are added:
- `my-segment.yml` (first segment)
- `my-segment-1.yml` (second segment)
**Activation Matching:**
Activations are matched by `name` only. This has important implications:
- **Renaming an activation** in YAML will delete the old activation and create a new one (losing execution history and statistics)
- To preserve an activation's history, update its properties without changing the name
**Segment Matching:**
Segments are matched by `folder + name`. This means:
- You can have segments with the same name in different folders
- Moving a segment YAML file to a different folder creates a new segment (does not move the existing one)
### Supported Operators
All operators use the unified `value` field. When multiple values are needed (e.g., `In`, `Contain`), provide an array.
#### Comparison Operators
| Operator Type | Required Fields | Value Type | Description |
| --- | --- | --- | --- |
| `Equal` | `value` | string, number, boolean | Exact match |
| `NotEqual` | `value` | string, number, boolean | Not equal (use `not: true` with `Equal`) |
| `Greater` | `value` | number | Greater than |
| `GreaterEqual` | `value` | number | Greater than or equal |
| `Less` | `value` | number | Less than |
| `LessEqual` | `value` | number | Less than or equal |
| `Between` | `minValue`, `maxValue` | number | Value in range (exclusive) |
#### List Operators
| Operator Type | Required Fields | Value Type | Description |
| --- | --- | --- | --- |
| `In` | `value` | array of strings/numbers | Value in set |
| `NotIn` | `value` | array of strings/numbers | Value not in set (use `not: true` with `In`) |
#### String Operators
| Operator Type | Required Fields | Value Type | Description |
| --- | --- | --- | --- |
| `Contain` | `value` | array of strings | Contains any substring |
| `StartWith` | `value` | array of strings | Starts with any prefix |
| `EndWith` | `value` | array of strings | Ends with any suffix |
| `Regexp` | `value` | regex pattern string | Matches regular expression |
#### Null Operators
| Operator Type | Required Fields | Description |
| --- | --- | --- |
| `IsNull` | (none) | Checks if value is null |
#### Time Operators
| Operator Type | Required Fields | Description |
| --- | --- | --- |
| `TimeWithinPast` | `value`, `unit` | Within past N time units |
| `TimeWithinNext` | `value`, `unit` | Within next N time units |
| `TimeToday` | (none) | Matches today |
| `TimeThis` | `from.unit` | Current period (this week, this month, etc.) |
| `TimeNext` | `from.unit` | Next period (next week, next month, etc.) |
| `TimeRange` | `from`, `to` or `from`, `duration` | Complex time range |
| `TimeInBetweenNext` | `from`, `to` | Between two future dates |
### Time Units
For time-based operators (`TimeWithinPast`, `TimeWithinNext`, etc.), the `unit` field must be one of:
| Unit | Description |
| --- | --- |
| `year` | Years |
| `quarter` | Quarters |
| `month` | Months |
| `week` | Weeks |
| `day` | Days |
| `hour` | Hours |
| `minute` | Minutes |
| `second` | Seconds |
Both singular (`day`, `week`) and plural (`days`, `weeks`) forms are accepted. Plural forms are automatically normalized.
### Negation with `not`
Most operators support a `not` field to invert the condition:
```yaml
# Emails NOT containing "@test.com"
operator:
type: Contain
value: ["@test.com"]
not: true
# Value NOT equal to "inactive"
operator:
type: Equal
value: inactive
not: true
```
### Operator Examples
**In (multiple values):**
```yaml
# Match customers in US, Canada, or Mexico
operator:
type: In
value: ["US", "CA", "MX"]
```
**NotIn (exclude multiple values):**
```yaml
# Exclude test and spam accounts
operator:
type: In
value: ["test", "spam", "internal"]
not: true
```
**Contain (multiple substrings):**
```yaml
# Match emails from specific domains
operator:
type: Contain
value: ["@gmail.com", "@yahoo.com", "@outlook.com"]
```
**StartWith (multiple prefixes):**
```yaml
# Match product SKUs starting with specific prefixes
operator:
type: StartWith
value: ["PRO-", "ENT-", "PREM-"]
```
**EndWith (multiple suffixes):**
```yaml
# Match files with specific extensions
operator:
type: EndWith
value: [".pdf", ".doc", ".xlsx"]
```
**Between (numeric range):**
```yaml
# Age between 18 and 65
operator:
type: Between
minValue: 18
maxValue: 65
```
**TimeWithinPast:**
```yaml
operator:
type: TimeWithinPast
value: 30
unit: day # Must be singular
```
**TimeWithinNext:**
```yaml
operator:
type: TimeWithinNext
value: 7
unit: day
```
**TimeThis (current period):**
```yaml
operator:
type: TimeThis
from:
unit: month # This month
```
**TimeNext (next period):**
```yaml
operator:
type: TimeNext
from:
unit: week # Next week
```
**TimeRange (complex range):**
```yaml
# Last 3 months
operator:
type: TimeRange
from:
last: 3
unit: month
duration:
month: 3
```
### Segment Reference Conditions
You can include or exclude members of other segments using `type: include` or `type: exclude`:
```yaml
rule:
type: And
conditions:
# Include members of another segment
- type: include
segment: california_customers
# Exclude members of another segment
- type: exclude
segment: churned_users
# Combined with value conditions
- type: Value
attribute: tier
operator:
type: Equal
value: premium
```
| Type | Description |
| --- | --- |
| `type: include` | Include profiles that are members of the referenced segment |
| `type: exclude` | Exclude profiles that are members of the referenced segment |
The `segment` field references another child segment by name within the same parent segment.
### Complex Rule Example
```yaml
rule:
type: And
conditions:
# High value OR premium member
- type: Or
conditions:
- type: Value
attribute: ltv
operator:
type: Greater
value: 1000
- type: Value
attribute: membership
operator:
type: Equal
value: premium
# Active within last 30 days
- type: Value
attribute: last_activity
operator:
type: TimeWithinPast
unit: day
value: 30
# Not from test accounts
- type: Value
attribute: email
operator:
type: Contain
value:
- "@test.com"
not: true
# Exclude users already in another segment
- type: exclude
segment: already_contacted
```
## Related Commands
For managing **parent segments** (audiences), use the dedicated `tdx parent-segment` command (alias: `tdx ps`).
See [Parent Segment Commands](/treasure-code/commands/parent-segment) for full documentation including:
- `list` - List parent segments
- `pull` - Pull configuration to YAML
- `push` - Push YAML configuration
- `validate` - Validate configuration
- `preview` - Preview sample data
- `run` - Run the workflow