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

# Create Your First Pipeline

> Build a Zwiron job that moves data from source to destination with schedule, sync mode, and transforms.

A **pipeline** (also called a **job**) connects a source to a destination and defines how data flows between them. This guide walks you through creating one from scratch.

<Info>Make sure you've completed [Create a Connection](/getting-started/create-connection) before this step.</Info>

***

## Creating a pipeline

1. Click **Jobs** in the sidebar
2. Click **New Job** and give the job a name (e.g. `postgres-to-snowflake-orders`)
3. Select your **source connection** — Zwiron discovers all available tables and schemas automatically
4. Select your **destination connection**
5. Select the **tables** you want to sync (select individual tables, entire schemas, or search by name) — the destination schema is auto-generated from the source connection name (e.g. `prod_postgres`). You can override it in the configure step if needed.
6. Choose an **execution mode** — **Hosted** if both ends are cloud-reachable, or **Agent** to run inside your network
7. Choose a **sync mode** (see below)
8. Optionally configure **transforms** to filter or reshape data in transit
9. Set a **schedule** for when the job should run
10. Click **Save & Run** to start immediately, or **Save** to start on the next scheduled run

Zwiron creates destination tables automatically if they don't exist, matching the source column names and types.

***

## Sync modes

<Tabs>
  <Tab title="Full Refresh">
    **Best for:** Small tables, lookup tables, or when you always want a clean copy.

    On every run, Zwiron reads the entire source table and replaces the destination table. This is the simplest mode — no special source configuration required.

    * Works with any source
    * No cursor or primary key required
    * Destination table is truncated and reloaded each run
  </Tab>

  <Tab title="Incremental">
    **Best for:** Large tables where you only want to sync new or updated rows.

    Zwiron tracks a cursor column (e.g. `updated_at` or an auto-increment `id`) and only reads rows that have changed since the last run.

    * Requires a monotonically increasing cursor column on the source
    * Much faster than Full Refresh for large tables
    * New rows are appended; updated rows are upserted if a primary key is set
  </Tab>

  <Tab title="CDC (Change Data Capture)">
    **Best for:** When you need near-real-time sync or want to capture deletes.

    CDC reads from the database's change log (binlog for MySQL, replication slot for Postgres) instead of querying the table. This captures every insert, update, and delete — and applies them to the destination in order.

    * Requires a CDC-capable source live today: Postgres, MySQL, or MongoDB
    * Sub-minute latency
    * Captures deletes (unlike incremental mode)
    * Requires additional database permissions — see the [CDC guide](/concepts/cdc)
  </Tab>
</Tabs>

***

## Transforms

Before saving, you can apply transforms to filter or reshape data in transit:

* **Drop column** — exclude columns from reaching the destination (common for PII)
* **Rename column** — write a column under a different name at the destination
* **Type cast** — change the Arrow type of a column (e.g. `int32` → `utf8`)
* **Hash column** — replace values with SHA-256 hashes to pseudonymize PII
* **Row filter** — only sync rows that match a condition

See [Transforms](/concepts/transforms) for the full reference.

***

## Scheduling

| Preset                | Use case                                       |
| --------------------- | ---------------------------------------------- |
| Every 15 minutes      | Near-real-time for incremental jobs            |
| Every hour            | Standard for most operational tables           |
| Every 6 hours         | Reporting tables with moderate freshness needs |
| Daily                 | Warehouse loads, large full refreshes          |
| Custom cron           | Any cadence — enter a cron expression directly |
| Manual / trigger only | On-demand or API-triggered pipelines           |

<Info>CDC jobs run continuously — they don't use a schedule. Once started, they stream changes until you pause or stop the job.</Info>

***

## Monitoring your pipeline

Click into the job to see:

* **Status** — Running, Completed, Failed, Cancelled
* **Progress** — tables synced, rows transferred, bytes moved
* **Last run** — duration, row count, any errors
* **Next run** — when the job is scheduled to run again
* **Logs** — full run-level event log for debugging

See [Monitoring](/pipelines/monitoring) for the full reference.

***

## What's next?

<CardGroup cols={2}>
  <Card title="CDC deep dive" icon="bolt" href="/concepts/cdc">
    How Change Data Capture works and how to enable it
  </Card>

  <Card title="Transforms" icon="filter" href="/concepts/transforms">
    Filter, rename, and type cast columns
  </Card>

  <Card title="Scheduling" icon="clock" href="/concepts/scheduling">
    Cron schedules and trigger options
  </Card>

  <Card title="All connectors" icon="plug" href="/connectors/overview">
    See every supported source and destination
  </Card>
</CardGroup>
