Workflows
A workflow connects a data source to one or more templates, maps data source fields to template variables, and runs the render — producing a generated image for every active data source item.
What it is
A workflow is the execution layer of Creative Automation. It defines:
- Which data source supplies the item data.
- Which template(s) define the visual design.
- How fields map — which data source column drives which template layer variable.
- When to run — manually, on a schedule, or automatically when the data source updates.
- What to output — image format, quality, file naming, and artboard selection.
When you run a workflow, ConnectWyze creates a Generation Run. The run iterates over every active data source item, renders the template for each one, and stores the image in your workspace storage. Items whose data has not changed since the last run are skipped automatically — so re-runs are fast and cost-free for unchanged items.
When you'd use it
- You have a data source of 2 000 products and a branded template; you want one export-ready image per product.
- Your data source refreshes nightly and you want new or updated products re-rendered automatically.
- You manage multiple markets and want a different template per language, selected automatically based on a
languagefield in the data source. - You need the same image in Square, Story, and Banner formats — configured once on the template, rendered in a single run.
- You want to receive a webhook call when a run finishes so you can push image URLs to an external system.
Quick start (user)
Create a workflow
- Go to
/dashboard/creative/workflowsand click New Workflow. - Enter a name.
- Select the Data Source that will supply the data.
- Select one or more Templates. For multi-template mode, each template gets its own row.
- For each template, open Field Mapping and map each template layer variable to the matching data source field (e.g. template variable
headline→ fieldproduct_name). - Set Trigger:
- On Data Source Update — run automatically whenever the data source finishes a sync (default).
- Scheduled — enter a cron expression and timezone.
- Manual — run only when you click Run.
- Configure Output: format (JPG is recommended for speed), quality, and file naming pattern.
- Click Save.
Run a workflow
Click Run on the workflow card or detail page. A Generation Run is created and queued. Progress appears in /dashboard/creative/runs.
When the run completes, the generated images are available in /dashboard/creative/creatives.
Settings reference
Workflow settings
| Field | Type | Default | Description |
|---|---|---|---|
| Name | string | — | Display name. |
| Description | string | — | Optional notes. |
| Data Source | data source ID | — | The data source for this workflow. |
| Trigger | ON_FEED_UPDATE | SCHEDULED | MANUAL |
ON_FEED_UPDATE |
When the workflow runs. (Enum values retain the legacy FEED naming for backward compatibility.) |
| Schedule | cron string | null |
Cron expression. Required when Trigger is SCHEDULED. |
| Timezone | string | UTC |
Timezone for schedule interpretation. |
| Is Active | boolean | true |
Inactive workflows do not trigger on data source updates or schedules. |
| Output Format | PNG | JPG | WEBP |
PNG |
Image format. JPG is approximately 3× faster than PNG for most templates. |
| Output Quality | 1–100 | 90 |
Compression quality for JPG/WEBP. |
| File Naming | string | `` | Template for output file names. Use , , or ``. |
| Media Rotation | NONE | DAILY | WEEKLY | MONTHLY |
WEEKLY |
For data source items with multiple media files per field, controls how ConnectWyze rotates through them over time. NONE always picks the first. |
Field mapping
Each template in the workflow has a Field Mapping table. Each row maps a template layer variable (left column) to a data source field name (right column). You can also map Focal Points — for image layers, you can bind the focal point X and Y values to numeric data source fields.
Per-template settings (optional overrides):
| Field | Description |
|---|---|
| Label | Identifies this template slot (e.g. English, Instagram Square). |
| File Naming | Override the workflow's default file naming for this template only. |
| Output Format | Override format for this template. |
| Output Quality | Override quality for this template. |
| Artboard IDs | Limit rendering to specific artboard IDs from a multi-size template. Leave empty to render all artboards. |
| Enabled | Toggle this template slot on or off without removing it. |
Conditional template selection
By default, when a workflow has multiple templates, ConnectWyze renders every template for every data source item. Conditional template selection changes this: the workflow evaluates a set of rules against each item and picks exactly one template per item.
Enabling conditional rules
On the workflow form, turn on Use Conditional Rules. The template list changes to a rules editor. Each template slot gets a condition block, and you designate a Default Template that is used when no rule matches.
Rule structure
Each rule is a condition tree evaluated against the data source item's data object. Rules support:
- Single conditions:
field+operator+value - Groups:
ANDorORof nested conditions
Supported operators:
| Operator | Description |
|---|---|
equals / not_equals |
Exact string match |
contains / not_contains |
Substring match |
starts_with / ends_with |
String prefix/suffix |
greater_than / less_than |
Numeric comparison (values coerced to number) |
greater_than_or_equal / less_than_or_equal |
Numeric comparison |
is_empty / is_not_empty |
Null, undefined, or empty-string check |
matches_regex |
ECMAScript-compatible regular expression |
in / not_in |
Value is/is not in a comma-separated list |
Priority
Rules are evaluated in order from top to bottom. The first rule that matches wins. Drag rules to reorder them. If no rule matches, the Default Template is used; if no default is set, the item is skipped.
Testing rules
Use the Test Rules panel in the workflow form to paste a sample data source item JSON and see which template would be selected.
Output — Runs and Creatives
Each run creates a GenerationJob record. The run tracks:
| Field | Description |
|---|---|
| Status | PENDING → PROCESSING → COMPLETED | FAILED | CANCELLED |
| Total Items | Number of data source items in scope for this run. |
| Completed | Images successfully rendered. |
| Failed | Items that errored during render. |
| Skipped | Items skipped because their data was unchanged since the last run. |
Progress formula: (completed + failed + skipped) / totalItems.
PENDING runs show an In Queue badge. Once processing begins, a live progress bar updates as the render worker reports back.
Completed images are available immediately in /dashboard/creative/creatives as the run processes; you do not need to wait for the full run to finish.
Webhooks
Workflows can send outbound HTTP webhook notifications on three run events.
Events
| Event | Fires when |
|---|---|
job.started |
A generation run begins processing. |
job.completed |
A generation run finishes with status COMPLETED. |
job.failed |
A generation run finishes with status FAILED. |
(Event values retain the job.* naming for backward compatibility with existing webhook subscribers.)
Webhook payload
All three events share the same payload shape:
{
"event": "job.completed",
"jobId": "clxxxxxxxxxx",
"automationId": "clxxxxxxxxxx",
"automationName": "Product Cards – EN",
"status": "COMPLETED",
"completed": 1842,
"failed": 3,
"skipped": 155,
"total": 2000,
"hostedUrl": "https://connectwyze.com/api/creative/hosted/your-slug"
}
hostedUrl is only present in job.completed payloads when the workflow has a hosted export configured with a slug.
Configuring webhooks
Webhooks are workspace-level and are configured in Dashboard → Settings → Webhooks. Each webhook:
- Has a target URL that receives
POSTrequests. - Subscribes to one or more events (
job.started,job.completed,job.failed). - Can optionally filter to specific workflow IDs or data source IDs — if no filter is set, it fires for all workflows.
- Is signed using HMAC-SHA256; verify the
X-Signatureheader to authenticate the payload.
Webhooks are delivered fire-and-forget. If a webhook endpoint returns a non-2xx response repeatedly, ConnectWyze disables the webhook automatically and logs the failure.
Developer / API
Workflow endpoints
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/creative/workflows |
List workflows in the workspace. |
| POST | /api/creative/workflows |
Create a workflow. |
| GET | /api/creative/workflows/[id] |
Get workflow detail. |
| PATCH | /api/creative/workflows/[id] |
Update settings, field mapping, or rules. |
| DELETE | /api/creative/workflows/[id] |
Delete the workflow. |
| POST | /api/creative/workflows/[id]/test-rules |
Evaluate conditional rules against a sample item. |
Create a workflow (example)
POST /api/creative/workflows
{
"name": "Product Cards",
"feedId": "clxyz123…",
"trigger": "ON_FEED_UPDATE",
"outputFormat": "JPG",
"outputQuality": 90,
"fileNaming": "_card",
"templates": [
{
"templateId": "cltemplate1…",
"label": "Square",
"fieldMapping": {
"headline": "product_name",
"price_label": "pricing_price",
"product_image": "image_url"
},
"artboardIds": []
}
]
}
Test conditional rules
POST /api/creative/workflows/[id]/test-rules
{
"item": {
"product_id": "SKU-001",
"category": "footwear",
"is_sale": true,
"price": 89.99
}
}
Response includes the matched template ID (or defaultTemplateId if no rule matched).
ASCII diagram
Data source items
│ (active items only)
▼
Workflow
│ field mapping:
│ product_name → "headline"
│ pricing_price → "price_label"
│ image_url → "product_image"
│
├── [conditional rules?]
│ item.category == "footwear" → Template A
│ item.is_sale == true → Template B
│ (default) → Template C
│
▼
GenerationJob (status: PENDING → PROCESSING → COMPLETED)
│ progress: completed / totalItems
│
▼
GeneratedImage[] (one per item × template × artboard)
│ stored in workspace storage (R2 / S3 / GCS)
│
├── Creatives (/dashboard/creative/creatives)
└── Webhooks: job.started · job.completed · job.failed
Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| Workflow does not trigger after data source update | Workflow trigger is not ON_FEED_UPDATE, or isActive is false |
Check Trigger and Is Active on the workflow settings page. |
| All items are skipped | Items have not changed since the last run | To force a full re-render, check Force Regenerate when running the workflow. |
| Field mapping shows no fields to select | Data source has not been synced yet | Trigger a data source sync first, then return to the field mapping panel. |
| Conditional rule never matches | Rule field name does not match the data source field name | Field names are case-sensitive. Use the Test Rules panel to verify the exact field names in a sample item. |
| Wrong template selected | Rule order — an earlier rule matches before the intended one | Drag rules into the correct order; rules are evaluated top to bottom and the first match wins. |
| Run completes with many failures | Template variable missing required data in some items | Check the run logs for the failing items; add a fallback value in the field mapping or filter those items by tag. |
| Webhook not firing | Webhook is disabled or target URL returning errors | Check the webhook delivery log in Settings → Webhooks. Re-enable the webhook if it was auto-disabled. |
job.completed payload missing hostedUrl |
Workflow has no hosted export with a slug configured | Set up a hosted export on the workflow's export settings if you need the hosted URL in the webhook payload. |
| Run stuck in PENDING | Render worker queue is full | Runs dispatch automatically; a short wait clears the queue. Contact support if a run is pending for more than 10 minutes. |
Related
- Data Sources — set up the data source for the workflow.
- Data Source Merging — combine data sources before connecting them to a workflow.
- Templates — build the visual canvas and define variable names.
- Runs and Creatives — monitor run progress and access generated images.
- API Keys and Generate API — single-image on-demand generation without a workflow.
- Overview — the full pipeline at a glance.