Confluye
Building Workflows

Versions & Git Review

Version history, collaboration checkpoints, and the GitHub review flow for workflow changes.

Confluye stores each workflow as numbered versions. A workflow has one Production destination and can have several named previews. Each destination chooses its candidate and deployed version independently. A linked GitHub repository adds a review requirement to publication.

Version history

Each save (except collaboration draft saves) appends a version in the workflow's shared version history. You can name a version without changing its fixed number or graph. The version label and preview name are separate: v7 · CRM experiment can be deployed in a preview named Sales test. Every run records which version and destination it executed.

Within the selected destination, the editor distinguishes:

  • Candidate — the saved version you are editing and testing in this destination.
  • Active — the immutable deployment serving this destination's triggers and live execution.
  • Git review — a proposal for the exact candidate, with its own PR and commit evidence.

A candidate dry run simulates effects. Deploying a preview enables real execution with that preview's explicit connections and separate webhook URLs. It requires an AIMS decision for that destination, version and connection configuration. Production continues serving its existing deployment while you test. See Running and debugging for switches, connections and promotion.

With a repository, previews can publish the exact commit of an open PR; Production requires its verified merge. Settings → GitHub repository → Require merged PRs for previews lets a workspace Admin or Owner require merge for previews too. A changed head, changed base branch or different merged artifact blocks publication. An existing deployment keeps running. No repository means Git review is not required; live AIMS approval still is.

The older production review transport below retains a Synchronized identity for imported merges. Its status does not authorize a different preview or replace the destination's AIMS decision.

  • ListGET /api/v1/workflows/{id}/versions{ versions[], links[] } with restore URLs. Auth: bearer; 403 if the workflow is in another workspace.
  • RestorePOST /api/v1/workflows/{id}/versions/{version}/restore. {version} is an integer ≥ 1. It creates a new candidate from that historical graph; it does not repoint the active version or reconcile production triggers.

Collaboration checkpoints create one grouped version for a live session (see Collaboration). Restoring an old version does not reopen that session.

Restoring into a selected destination saves the restored candidate immediately. You can switch destinations without saving it again. If a save is already running, navigation waits for it to finish; discarding local changes cannot cancel a save that has already been sent.

Review states

Review exists only when Settings → repository is configured (GitHub owner/repo, default branch main, path prefix workflows unless changed). Without a repository, derived status is untracked and deploy is not blocked by review.

Artifact hash is computed from the portable workflow files. The derived state.status is one of:

StatusMeaningTypical next action
untrackedNo repositoryConfigure repo (Admin/Owner)
syncedHash matches last synced reviewDeploy allowed
modifiedDraft hash ≠ last syncedCreate review (Member+)
pr_openOpen GitHub PRUpdate review or merge
rejectedPR closed without mergeCreate a new review if the graph still differs
mergedPR merged, not yet importedPOST .../sync-from-repo (Admin/Owner)
driftedOpen PR but branch or draft movedUpdate review, or resolve proposal_branch_changed
conflictProvider write conflictRecreate review with a current expectedHeadSha
failedLast GitHub write failedRetry create review

state also returns drifted, driftReason, canCreateReview, canUpdateReview, canSyncMerged. The TypeScript union still includes approved; deriveWorkflowGitReviewState does not currently emit it (open PRs stay pr_open until merged, closed, drifted, or conflicted).

GET review includes a semantic diff (nodes added/removed/renamed/moved/reconfigured, edges, credentials/schedules/webhooks, severity) and a visual diff (before/after graphs). diffBase is repository_default_branch, last_review_snapshot, or empty. Layout-only moves are marked as moved, not as logic changes.

API

MethodPathAuthNotes
GET/api/v1/workflows/{id}/reviewBearerStatus + diffs
POST/api/v1/workflows/{id}/reviewBearer and workspace Member / Admin / OwnerBody { expectedHeadSha? }. 200 if status: "open", 409 otherwise. Setup errors 400 with code: missing_credential | invalid_credential | unsupported_provider
GET/api/v1/workflows/{id}/sync-from-repo?ref=BearerPreview import of artifact at ref (200 preview or 400 failed)
POST/api/v1/workflows/{id}/sync-from-repoBearer and Admin / OwnerNo caller-selected ref. Imports only the provider-verified merge commit; 200 synced creates a candidate with git provenance, 400 failed
POST/api/v1/workflows/validate-artifactBearerBody { files } object or array. Validates artifact files against the workspace

GitHub is the only provider. Optimistic concurrency: pass expectedHeadSha so a stale branch is not overwritten. Provider probe failures surface as providerError on GET status without throwing.

There is no v1 route to attach the repository; that is session GET|PATCH|DELETE /api/settings/repository (see Workspace settings).

Import without git

You can still import/export JSON without a repository — Importing n8n and POST /api/v1/workflows with importJson / importBundleJson.

Next steps