Skip to main content

Getting Started with Pipelines in wxrks

How Account Admins set up wxrks Pipelines to automate workflow, task, and project-status changes triggered by account events, including Pipeline Secrets and auto-refreshing OAuth tokens.

Overview

Pipelines let you automate what happens in your account when specific events occur — for example, automatically skipping a review step when no manual edits were made, or notifying a Slack channel when a project is delivered. Instead of relying on someone to remember a manual step, a Pipeline reacts to the event itself and runs the action for you.

This guide covers everything from your first Pipeline through to Pipeline Secrets, including secrets that renew their own credentials automatically.

Audience and Prerequisites

  • Plans: Available wherever Pipelines and Pipeline Secrets are enabled.

  • Role & Permission: Requires Account Admin access. Settings > Automation Settings > Pipelines is restricted to Account Admins and applies to your whole account, not just one Org Unit (Organizational Unit — a division of your account that groups users, projects, and settings) or project.

  • Dependencies: To use an auto-refreshing secret, the external service must expose an authentication endpoint (for example, an OAuth — Open Authorization — token endpoint) that returns a fresh token given a client ID and/or client secret.

Table of Contents

What Are Pipelines?

A Pipeline connects a trigger (something that happens in wxrks, like a work unit — an individual file or content chunk inside a project — changing status) to one or more actions (things wxrks should do in response, like updating a workflow or sending an HTTP request). You define both the trigger and the actions in a small YAML (YAML Ain't Markup Language — a plain-text, indentation-based configuration format) block, and wxrks runs it automatically every time the trigger occurs.

With Pipelines you can, for example:

  • Automatically skip or advance a workflow step based on a condition, such as whether a segment was manually edited.

  • Change a project's status automatically when certain conditions are met.

  • Send a notification to Slack or call an external system over HTTP whenever something happens in a project.

  • Sync data — like a QuickBooks record ID — onto a User or Org Unit after an external system responds.

ℹ️ Note: Pipelines are a separate feature from Sous Chef Agents. Sous Chef Agents control how AI shapes the tone and style of a translation, while Pipelines automate workflow and process events — status changes, task routing, notifications. They don't depend on each other, but nothing stops a Pipeline from triggering on an event related to an AI-assisted project if you need that. See Sous Chef Agents if you're looking for that feature instead.

Where to Find Pipelines

Go to Settings > Automation Settings > Pipelines. This area has two tabs:

  • The Pipelines tab, where you create, edit, activate/deactivate, and monitor your Pipelines.

  • The Secrets tab, where you store sensitive values (like API tokens) your Pipelines can reference without exposing them — see Pipeline Secrets below.

Pipelines page under Settings > Automation Settings, showing the Pipelines and Secrets tabs above the table of configured Pipelines.

Creating Your First Pipeline

Click Create Pipeline on the Pipelines tab. You'll be asked for:

  • Name — a unique, space-free identifier for the Pipeline (e.g. skip-review-if-no-edits).

  • Description — a short summary of what it does, so your team can tell Pipelines apart later.

  • Configuration (YAML) — the trigger and the actions, written in YAML (see the next section).

Create Pipeline modal with the Name, Description and Configuration YAML fields ready to be filled in.

Save it, and it's immediately Active — wxrks starts listening for the trigger event and will run the Pipeline the next time it happens in your account. You can toggle a Pipeline Active/Inactive at any time from the Pipelines table without deleting it.

Anatomy of a Pipeline: Triggers, Actions, and Conditions

Every Pipeline's YAML has the same three parts.

1. The trigger (on)

This is the event that starts the Pipeline. Common triggers include a work unit's status changing, a task's status changing, a new project being created, a project's status changing, or a new user or Org Unit being added to your account. A Pipeline can also list more than one trigger — it runs whenever any of them occurs.

2. The actions (run)

Each item under run is one step, identified by an action type. wxrks currently supports:

Action type

What it does

bw_update_workflow

Updates the status of one or more workflows and, optionally, their tasks.

bw_create_workflow

Adds a workflow to project files that match specific file extensions.

bw_check_manual_edits

Checks whether a work unit has manual edits in specific workflows, so a later step can act on the result.

bw_check_comments

Checks whether comments exist on a project or on specific segments.

bw_check_project_work_units

Checks whether every work unit in a project has reached the Closed status.

bw_change_project_status

Changes a project's status (Draft, Pending, Approved, Delivered, or Cancelled).

bw_update_entity

Writes specific fields to a User or Org Unit record, such as a QuickBooks ID after an integration call.

http

Calls an external URL (for example, a webhook or a third-party API).

slack

Sends a message to a Slack channel.

bw_debug_action

Logs the Pipeline's current values, useful while you're building and testing a configuration.

Actions run in the order they're listed, and each one can read the results of an earlier action in the same run — for example, a bw_update_workflow step deciding what to do based on whether an earlier bw_check_manual_edits step found manual edits.

3. Conditions

Any step can include a condition — a simple true/false check that decides whether that step actually runs. For example, a condition can check the event's details (event.details.new_status == 'DELIVERED') or an earlier step's result (!job1.has_manual_edits).

ℹ️ Note: If a condition refers to a value that isn't available yet, wxrks treats it as false and simply skips that step — it doesn't stop the rest of the Pipeline.

Workflow steps referenced in a Pipeline (both as triggers and inside actions) use the same workflow UUIDs (Universally Unique Identifiers — the long code that identifies each workflow) shown in Translation Settings > Workflows — see Managing Your Custom Workflows if you need to find or set those up first.

Example: Skip a Review Step When There Are No Manual Edits

This is a common use case: if a segment (a single translatable sentence or unit of text) in your Review step was never manually edited, there's nothing new for a linguist to check in Review 2 — so skip it automatically.

name: skip-review-2-if-no-edits
on: [WORK_UNIT_STATUS_CHANGE]
run:
  - name: check-manual-edits
    action: bw_check_manual_edits
    id: job1
    condition: event.details.new_status == 'DELIVERED'
    with:
      workflows:
        - reviewWorkflowUUID # Review
  - name: skip-review-2
    action: bw_update_workflow
    id: job2
    condition: event.details.new_status == 'DELIVERED' && !job1.has_manual_edits
    with:
      workflows: []
      update_workflows:
        - review2WorkflowUUID # Review 2
      update_task_status: SKIPPED
      update_work_unit_status: SKIPPED
      update_tasks: true
      same_language_workflows: true
      same_file_workflows: true

Swap reviewWorkflowUUID and review2WorkflowUUID for the real workflow UUIDs from Translation Settings > Workflows.

💡 Tip: Add a bw_debug_action step while you're testing to confirm the values you expect (like job1.has_manual_edits) are actually there.

Monitoring Pipeline Runs

Click the history icon next to any Pipeline to open its Executions view. Each run of the Pipeline is listed with a status (Running, Success, or Failed) and a timestamp — click View Details on any run to see the step-by-step log messages, including the exact error if a step failed.

ℹ️ Note: If a Pipeline's YAML has a syntax error at the moment it tries to run, wxrks automatically switches it to Inactive and records the parser error in its Executions log, rather than repeatedly failing on every matching event. If a Pipeline you expected to run has quietly gone inactive, check its Executions log first — it usually explains why.

Pipeline Secrets

Secrets store sensitive values — API keys, tokens, passwords — that a Pipeline's http or slack action needs, without putting that value in plain text inside the YAML. Create one from the Secrets tab, then reference it in your Pipeline as ${{ secrets.YOUR_SECRET_NAME }}.

Secrets tab of the Pipelines page in its empty state, with a red bounding box around the Create Secret button and the message "No secrets found".

Secrets are encrypted and account-scoped — only Pipelines in the same account can use them.

⚠️ Warning: Once saved, a secret's value can't be viewed again, only replaced or deleted. Keep a record of what you stored somewhere safe if you'll need it again outside wxrks.

Static vs. auto-refreshing secrets

A secret can work in one of two ways, shown in the Type column of the secrets table:

Term

Description

Static secret

The original secret behavior: a fixed value you paste in once and update manually whenever it changes or expires.

Auto-Refresh (Refreshable) secret

A secret backed by an authentication endpoint. Before each Pipeline run that uses it, wxrks checks whether the stored token is expired (or close to it) and, if so, calls the endpoint to fetch a new one automatically.

Expiry Buffer

The number of seconds before the token's real expiration that wxrks proactively refreshes it, avoiding a request that fails because the token expired mid-flight.

Failing status

The state a refreshable secret enters when a refresh attempt errors out (bad credentials, unreachable endpoint, unexpected response shape, and so on).

Secrets table listing REFRESHABLE_API_TOKEN with a Refreshable badge and STATIC_API_TOKEN with a Static badge in the Type column, both highlighted.

ℹ️ Note: Existing Static secrets are unaffected by auto-refresh and continue to work exactly as before. Auto-refresh is opt-in per secret.

Setting Up an Auto-Refreshing Secret

Use this when a Pipeline calls an external service with a short-lived token, so it never fails because the stored credential went stale.

Step 1: Open Pipeline Secrets

  1. Log in to wxrks as an Account Admin.

  2. From the main navigation, go to Settings > Automation Settings > Pipelines.

  3. Click the Secrets tab.

The secrets table lists every existing secret with a Type column showing either a Static or Refreshable badge, so you can tell at a glance which secrets are self-renewing.

Step 2: Create or Edit a Secret

  1. Click Create Secret (or the Edit icon on an existing secret) to open the secret modal.

  2. Enter the Secret Name (uppercase letters, numbers, and underscores only) and the Secret Value.

  3. Enable Auto-refresh this token to reveal the refresh configuration panel.

Create Pipeline Secret modal with the Secret Name filled in and a red bounding box around the enabled "Auto-refresh this token" switch, which has revealed the Auth Endpoint URL, HTTP Method, Client ID, Client Secret and Request Body Template fields.

ℹ️ Note: For a new refreshable secret, the Secret Value field can hold a placeholder or an initial token — the first refresh overwrites it automatically. wxrks never displays a saved secret value again, whether static or refreshable: reopening any secret to edit it always shows the Secret Value field empty, and you must re-enter a value to save changes. The Secret Name itself can't be changed once created, since Pipelines reference it by name.

Step 3: Configure the Refresh Request

Fill in how wxrks should call the external authentication endpoint:

  • Auth Endpoint URL — the full URL wxrks calls to request a new token.

  • HTTP MethodPOST, GET, or PUT, depending on what the provider expects.

  • Client ID — optional identifier sent to the provider, if it requires one.

  • Client Secret — the credential used to authenticate the refresh request itself.

  • Request Body Template — optional JSON (JavaScript Object Notation) body sent with the request. Reference ${{ refresh.clientId }} and ${{ refresh.clientSecret }} as placeholders for the values above.

For example, a provider expecting a JSON body with the client credentials would use:

{"client_id": "${{ refresh.clientId }}", "client_secret": "${{ refresh.clientSecret }}"}

⚠️ Warning: The Client Secret field is write-only: once saved, it is never returned by the API or shown in the form again. When editing a refreshable secret, leave it blank to keep the previously saved value — it is only overwritten if you type a new one.

Step 4: Tell wxrks Where to Find the New Token

The provider's response can return the token in the response body or in a response header.

  1. Under New Token Location, choose Response Body (JSON) or Response Header, then enter the corresponding path:

    • For Response Body (JSON), enter the JSON path to the token (for example, access_token or data.token).

    • For Response Header, enter the exact header name (for example, X-Auth-Token).

  2. Optionally repeat the same choice under Token Expiry Location so wxrks knows exactly when the token expires (in seconds). Leave it blank if the provider doesn't return an expiry — wxrks then relies on a 401/403 response from the external service to trigger a refresh instead of proactive expiry tracking.

  3. Set the Expiry Buffer (seconds) — how many seconds before actual expiration wxrks refreshes the token. Defaults to 60.

Refresh configuration panel with the New Token Location set to Response Body (JSON) and path json.access_token marked 1, and Token Expiry Location set to Response Body (JSON) and path json.expires_in marked 2, above the Expiry Buffer field showing 60.

💡 Tip: If the provider's token lifetime is short or unpredictable, raise the Expiry Buffer so Pipelines never pick up a token that expires seconds after being fetched.

Step 5: Save and Verify the Status

  1. Click Create Secret (or Update Secret). The button stays disabled until the Auth Endpoint URL, the New Token Location path, and a Client Secret are all present.

  2. Reopen the secret to confirm the refresh configuration saved correctly. It shows an Active badge by default as soon as the configuration is saved — this is the starting state, not proof that a refresh has actually happened yet. Once a Pipeline uses the secret for the first time and wxrks performs a real refresh, this section also shows a Last refreshed timestamp.

Saved refreshable secret reopened for editing, showing a green Active badge at the top of the refresh configuration panel.

⚠️ Warning: If a refresh attempt fails, the status switches to Failing and Account Admins are notified by email the first time it happens. Repeated failures on an already-Failing secret do not send another email, so don't assume silence means it recovered — reopen the secret to check its current status and the recorded error message.

Using the secret in a Pipeline

Reference the secret exactly as you would a static one, with no changes needed to the Pipeline definition itself:

${{ secrets.YOUR_SECRET_NAME }}

Every action type that reads secrets (http calls, slack messages, and others) resolves refreshable secrets automatically — there's nothing extra to configure on the Pipeline side.

Troubleshooting Auto-Refreshing Secrets

Issue / Error

Cause

Solution

Create Secret / Update Secret button stays disabled

Auto-refresh is enabled but Auth Endpoint URL, the token path, or the Client Secret is missing.

Fill in all three fields. When editing, the Client Secret only needs to stay blank if one was already saved previously.

Secret shows a Failing badge

The last refresh attempt errored — commonly an unreachable Auth Endpoint URL, an expired or incorrect Client Secret, or a New Token Location path that doesn't match the provider's actual response.

Open the secret to read the recorded error message and correct the relevant field. The fix takes effect the next time a Pipeline uses that secret, when wxrks attempts the refresh again.

Pipeline fails with token refresh is already in progress on another node

Multiple Pipelines tried to refresh the same secret at once; one is refreshing while others waited past a short timeout.

This is expected under concurrent load and self-resolves. Re-run the Pipeline; it picks up the freshly refreshed token.

New secret works once, then Pipelines start failing

The Token Expiry Location path or Expiry Buffer doesn't match how quickly the token actually expires.

Verify the expiry path against a real response from the provider, or increase the Expiry Buffer to refresh earlier.

Quick Reference

Parameter

Specification

Supported HTTP Methods for refresh

POST, GET, PUT

New Token Location options

Response Body (JSON path) or Response Header (header name)

Token Expiry Location options

Response Body (JSON path), Response Header (header name), or left blank

Default Expiry Buffer

60 seconds

Secret name format

Uppercase letters, numbers, and underscores only

Client Secret visibility

Write-only — never returned or displayed after saving

Secret reference syntax

${{ secrets.SECRET_NAME }}

Did this answer your question?