Skip to content

docs(platform): Add cloud data worker capacity enforcement documentation#75955

Open
Ian Alton (ian-at-airbyte) wants to merge 12 commits intomasterfrom
devin/1775004689-docs-capacity-enforcement
Open

docs(platform): Add cloud data worker capacity enforcement documentation#75955
Ian Alton (ian-at-airbyte) wants to merge 12 commits intomasterfrom
devin/1775004689-docs-capacity-enforcement

Conversation

@ian-at-airbyte
Copy link
Copy Markdown
Contributor

@ian-at-airbyte Ian Alton (ian-at-airbyte) commented Apr 1, 2026

What

Adds documentation for the cloud data worker capacity enforcement feature, which queues newly triggered sync jobs when all committed data workers are in use on capacity-based plans (Pro, Enterprise Flex).

Resolves airbytehq/airbyte-internal-issues#16129

How

Adds or updates content across 9 documentation files:

  • manage-data-workers.md (hub page): Expanded intro, added workspace-level usage section (clarifying it replaces credit usage for entitled orgs), added 4th option (on-demand capacity) for hitting limits, added full "On-demand capacity" section with enable steps (including during connection creation), admin-only restriction for the toggle, queued connection identification, dismissable banner description, and inline Burst tag icon
  • review-connection-status.md: Added "Queued" row to connection status table with hourglass icon (connection_queued.png), new "Queued connections (Cloud Pro and Enterprise Flex)" subsection, disambiguation note for stream-level vs connection-level "Queued" (including that streams show Pending when a connection is queued)
  • manage-airbyte-cloud-notifications.md: Added "Queued syncs" notification event row, note about default-off behavior, payload section noting both email and webhook are supported
  • configuring-connections.md: Added "Use on-demand capacity" row to connection settings table, noting the toggle is admin-only, plan-specific (Pro & Enterprise Flex), and also appears during connection creation
  • review-connection-timeline.md: Added "Queued" status row (Pro & Enterprise Flex), note about queued→cancelled timeline entries
  • tagging.md: New "System tags" section documenting the auto-applied Burst tag with icon image (burst-tag.png), scoped to Pro & Enterprise Flex
  • sync-schedules.md: Two new bullet points on capacity queuing and scheduled-run replacement
  • jobs.md: Added queued state to Mermaid state machine diagram with transition labels, new "Queued state (Cloud Pro and Enterprise Flex)" explanatory subsection
  • understand-airbyte-cloud-limits.md: New "Pro and Enterprise Flex plan considerations" section

New image assets added:

  • docs/platform/cloud/managing-airbyte-cloud/assets/connection_queued.png — orange hourglass icon for queued connection status
  • docs/platform/cloud/managing-airbyte-cloud/assets/burst-tag.png — Burst system tag icon (also copied to docs/platform/using-airbyte/images/burst-tag.png for tagging page)

Review guide

  1. manage-data-workers.md — Primary hub page. Verify: on-demand capacity section reads correctly, cross-links are accurate, workspace usage "replaces" (not "in addition to") wording is correct, connection-creation toggle note is accurate, admin-only restriction wording matches the UI, and inline Burst tag image renders at an appropriate size
  2. review-connection-status.md — Verify the new connection-level "Queued" row with connection_queued.png renders consistently with the other status icon rows, and the stream-level disambiguation note is clear
  3. jobs.md — Mermaid state machine diagram now includes queued state with \n transition labels. Verified in Vercel preview that \n renders as line breaks
  4. manage-airbyte-cloud-notifications.md⚠️ Potential inconsistency to verify: The notification table shows a checkmark only in the Email column for "Queued syncs" (Webhook column is blank), but the payload details section states both email and webhook are supported. Code investigation confirmed the UI renders both toggles (no slackNotificationUnsupported prop). The table may need a webhook checkmark added, or the table/payload section need to be reconciled.
  5. sync-schedules.md — Scheduled-run replacement behavior (newer run replaces older queued one) was verified against ConnectionManagerWorkflowImpl.kt in airbyte-platform-internal
  6. tagging.md — Burst tag image added below the description paragraph. Verify sizing and rendering
  7. configuring-connections.md⚠️ The table cell says "charged a premium rate" (matching the UI toggle copy Ian provided) while the manage-data-workers.md intro paragraph no longer mentions credits/charges at all. Verify this is intentionally different — the table quotes the UI toggle; the hub page describes the feature more generically.
  8. Remaining files are smaller additions (1–5 lines each)

Cross-cutting: All new sections link back to manage-data-workers.md as the hub. Verify anchors like #on-demand-capacity resolve correctly.

Not included: The spec calls for additional screenshots from a test workspace beyond the two icons added here. Those still need to be captured and added.

Human review checklist

  • Verify Queued icon placeholder in review-connection-status.md — Replaced with actual connection_queued.png hourglass icon
  • Reconcile notification table vs payload section — The table in manage-airbyte-cloud-notifications.md shows email-only (checkmark in Email column, blank Webhook column), but the payload details section says both email and webhook are supported. Code confirms the UI renders both toggles. Decide whether to add a webhook checkmark to the table or adjust the payload section.
  • Verify connection_queued.png renders at a consistent size with other status icons in the connection status table
  • Verify burst-tag.png renders appropriately both inline (in manage-data-workers.md paragraph) and as a standalone image (in tagging.md)
  • Confirm FIFO ordering for the queue — Code investigation of ConnectionManagerWorkflowImpl.kt confirmed there is no FIFO guarantee; each connection polls independently. FIFO claims removed.
  • Confirm toggle description copy in manage-data-workers.md step 3 matches the actual UI string
  • Verify that workspace Usage page truly replaces credit usage for entitled orgs (per airbytehq/airbyte-platform-internal#18782)
  • Verify admin-only restriction wording — Docs say "organization admins and workspace admins can enable it per connection". Code (intents.yaml) maps ManageConnectionOnDemandCapacity to ORGANIZATION_ADMIN, WORKSPACE_ADMIN, and ADMIN. Confirm these role names match what users see in the product.
  • Verify "Cloud Pro and Enterprise Flex" labels render well — The parenthetical label is longer than a simple "Cloud only". Check that table cells in review-connection-status.md and configuring-connections.md don't wrap awkwardly.
  • Verify "premium rate" language consistencyconfiguring-connections.md and the quoted toggle text in manage-data-workers.md mention "charged a premium rate", while the manage-data-workers.md intro paragraph does not mention credits or charges. Confirm this is intentional.

Updates since initial revision

Commit a594d8e — Addressed Devin Review bot comments:

  • Clarified workspace usage replaces credit usage for entitled orgs (was incorrectly described as additive)
  • Added note that on-demand toggle appears during connection creation (not just in Settings)
  • Added stream Pending mapping to disambiguation note in review-connection-status.md
  • Removed webhook payload example for "Queued syncs" (email-only; reconciles table vs payload mismatch)
  • Noted capacity banner requires on-demand capacity in the org's contract
  • Reverted set-up-a-connection.md to keep the bullet list clean (capacity details live in hub page)

Commit 5f33de1 — Addressed reviewer feedback on manage-credits.md:

  • Removed unsupported "billing alerts for on-demand capacity" suggestion (no such feature exists; the system sends an email when syncs are queued)

Commit 9dc0636 — Code-verified queuing behavior in airbyte-platform-internal:

  • Sync replacement confirmed correct: ConnectionManagerWorkflowImpl.kt cancels the old queued job via CapacityWaitExceededException when the next scheduled run arrives, then restarts the workflow for the new run
  • FIFO ordering removed: No centralized queue exists; each connection's workflow polls for capacity every minute independently. Removed "run in the order they were triggered" claims from review-connection-status.md and manage-data-workers.md

Commit 376843f — Added icon image assets:

  • Replaced Queued icon placeholder with actual connection_queued.png hourglass icon in the connection status table
  • Added burst-tag.png to tagging.md (System tags section) and inline in manage-data-workers.md (on-demand capacity section)

Commit ff96308 — Addressed eval review findings (code-verified against airbyte-platform-internal):

  • Notification channels: Updated payload section to reflect that the UI allows both email and webhook configuration for queued syncs (NotificationSettingsForm.tsx renders the toggle without slackNotificationUnsupported). No example payload available yet as the backend trigger is being finalized.
  • Banner gating: Removed "If your organization has on-demand capacity in its contract" qualifier from the capacity-reached banner description. CapacityReachedMessage.tsx shows the banner for any workspace with queuedCount > 0 — no feature flag or entitlement check.
  • Feature flag vs plan gating: No changes needed. Per reviewer guidance, docs should not account for internal rollout mechanisms; capacity enforcement is documented as applying to all capacity-based plans.

Commit adb0d6d — Added admin-only restriction for on-demand capacity toggle (per reviewer feedback referencing airbyte-platform-internal#18857 and #18851):

  • Code investigation confirmed ManageConnectionOnDemandCapacity intent in intents.yaml is restricted to ORGANIZATION_ADMIN, WORKSPACE_ADMIN, and ADMIN roles. RunOnDemandFormField.tsx disables the toggle for other roles with tooltip "Only admins can enable or disable on-demand capacity".
  • Updated manage-data-workers.md: On-demand capacity section now states "organization admins and workspace admins can enable it per connection. Other roles can view the toggle but cannot change it." Enable step also notes the admin role requirement.
  • Updated configuring-connections.md: Connection settings table now notes "Only organization admins and workspace admins can change this toggle."

Commit 369ee3b — Narrowed plan-scope labels from "Cloud only" to "Cloud Pro and Enterprise Flex" (per reviewer feedback):

  • Updated parenthetical labels across all capacity-related features: review-connection-status.md (status table row + subsection heading), configuring-connections.md (settings table), review-connection-timeline.md (status table), tagging.md (Burst tag heading), and jobs.md (queued state heading).
  • Capacity enforcement and on-demand capacity are specific to Pro and Enterprise Flex plans, not all Cloud plans. The more precise label avoids misleading users on other Cloud tiers.

Commit 01f4064 — Updated toggle description text in manage-data-workers.md to match the latest UI copy per reviewer request:

  • "Enable on demand capacity for this connection. Syncs for this connection will never be queued. Syncs that run when committed data worker is exhausted will be charged a premium rate."

Commits 78b49dc & 6d1c298 — Removed credit references from on-demand capacity per reviewer feedback:

  • Removed contract/sales requirement sentence from manage-data-workers.md ("On-demand capacity must be part of your signed contract...")
  • Removed "credits run out → syncs queued" paragraph from manage-data-workers.md — on-demand capacity runs regardless
  • Removed "credits at a premium rate" from manage-data-workers.md intro paragraph
  • Removed entire "On-demand capacity credits" section from manage-credits.md — on-demand capacity does not use the credits model
  • Updated configuring-connections.md table description to avoid credit-based language (now says "charged a premium rate" matching the UI toggle copy)

User Impact

Users on capacity-based Cloud plans (Pro, Enterprise Flex) will have documentation explaining:

  • Why syncs may be queued and how queuing works
  • How to enable on-demand capacity to bypass queuing for critical pipelines (admin-only)
  • How to identify queued connections and understand the Burst tag
  • How queuing appears in job state machines, timelines, and notifications

No negative side effects — this is additive documentation only.

Can this PR be safely reverted and rolled back?

  • YES 💚

Link to Devin session: https://app.devin.ai/sessions/50c6288e98ee4e7b8f090c8485d81059
Requested by: Ian Alton (@ian-at-airbyte)

- Add Queued connection status and queued connections section to connection status page
- Add on-demand capacity section and workspace usage to manage-data-workers hub page
- Add on-demand capacity credits section and billing notification updates to manage-credits
- Add Queued syncs notification event and webhook payload to notifications page
- Add Use on-demand capacity setting to connection configuration table
- Add Queued status to connection timeline and cancellation context
- Add System tags section with Burst tag documentation to tagging page
- Add capacity queuing considerations to sync schedules
- Add QUEUED state to job state machine diagram and explanation to jobs page
- Add Pro and Enterprise Flex plan considerations to cloud limits page
- Add capacity note to set-up-a-connection page

Resolves airbytehq/airbyte-internal-issues#16129

Co-Authored-By: ian.alton@airbyte.io <ian.alton@airbyte.io>
@devin-ai-integration
Copy link
Copy Markdown
Contributor

🤖 Devin AI Engineer

I'll be helping with this pull request! Here's what you should know:

✅ I will automatically:

  • Address comments on this PR. Add '(aside)' to your comment to have me ignore it.
  • Look at CI failures and help fix them

Note: I can only respond to comments from users who have write access to this repository.

⚙️ Control Options:

  • Disable automatic comment and CI monitoring

@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 1, 2026

👋 Greetings, Airbyte Team Member!

Here are some helpful tips and reminders for your convenience.

💡 Show Tips and Tricks

PR Slash Commands

Airbyte Maintainers (that's you!) can execute the following slash commands on your PR:

  • 🛠️ Quick Fixes
    • /format-fix - Fixes most formatting issues.
    • /bump-version - Bumps connector versions, scraping changelog description from the PR title.
      • Bump types: patch (default), minor, major, major_rc, rc, promote.
      • The rc type is a smart default: applies minor_rc if stable, or bumps the RC number if already RC.
      • The promote type strips the RC suffix to finalize a release.
      • Example: /bump-version type=rc or /bump-version type=minor
    • /bump-progressive-rollout-version - Alias for /bump-version type=rc. Bumps with an RC suffix and enables progressive rollout.
  • ❇️ AI Testing and Review (internal link: AI-SDLC Docs):
    • /ai-prove-fix - Runs prerelease readiness checks, including testing against customer connections.
    • /ai-canary-prerelease - Rolls out prerelease to 5-10 connections for canary testing.
    • /ai-review - AI-powered PR review for connector safety and quality gates.
  • 🚀 Connector Releases:
    • /publish-connectors-prerelease - Publishes pre-release connector builds (tagged as {version}-preview.{git-sha}) for all modified connectors in the PR.
  • ☕️ JVM connectors:
    • /update-connector-cdk-version connector=<CONNECTOR_NAME> - Updates the specified connector to the latest CDK version.
      Example: /update-connector-cdk-version connector=destination-bigquery
  • 🐍 Python connectors:
    • /poe connector source-example lock - Run the Poe lock task on the source-example connector, committing the results back to the branch.
    • /poe source example lock - Alias for /poe connector source-example lock.
    • /poe source example use-cdk-branch my/branch - Pin the source-example CDK reference to the branch name specified.
    • /poe source example use-cdk-latest - Update the source-example CDK dependency to the latest available version.
  • ⚙️ Admin commands:
    • /force-merge reason="<REASON>" - Force merges the PR using admin privileges, bypassing CI checks. Requires a reason.
      Example: /force-merge reason="CI is flaky, tests pass locally"
📚 Show Repo Guidance

Helpful Resources

📝 Edit this welcome message.

Remove blank line between Error and Action Required rows that would
break Markdown table rendering.

Co-Authored-By: ian.alton@airbyte.io <ian.alton@airbyte.io>
@github-actions
Copy link
Copy Markdown
Contributor

github-actions bot commented Apr 1, 2026

Deploy preview for airbyte-docs ready!

✅ Preview
https://airbyte-docs-b5xuhcke2-airbyte-growth.vercel.app

Built with commit 6d1c298.
This pull request is being automatically deployed with vercel-action

@devin-ai-integration
Copy link
Copy Markdown
Contributor

Review: Cross-referenced against platform-internal PRs

I reviewed this PR against the merged implementation PRs in airbyte-platform-internal (airbytehq/airbyte-platform-internal#18723, airbytehq/airbyte-platform-internal#18664, airbytehq/airbyte-platform-internal#18678, airbytehq/airbyte-platform-internal#18748, airbytehq/airbyte-platform-internal#18681, airbytehq/airbyte-platform-internal#18743, airbytehq/airbyte-platform-internal#18782, airbytehq/airbyte-platform-internal#18760, airbytehq/airbyte-platform-internal#18749, airbytehq/airbyte-platform-internal#18825, airbytehq/airbyte-platform-internal#18831) and the locale strings in en.json. Here are the concerns:

Show/Hide Detailed Review

1. On-demand toggle exists during connection creation, not just Settings

manage-data-workers.md step 2 says "Click Settings" — this implies the toggle is only available on existing connections. However, airbytehq/airbyte-platform-internal#18678 adds RunOnDemandFormField to ConnectionSettingsCard.tsx, which is used in the connection creation flow too. The docs should mention that users can enable on-demand capacity when first creating a connection, not only after the fact in Settings.

2. Workspace usage graph replaces credit usage, not additive

manage-data-workers.md adds a "Workspace-level data worker usage" section describing the workspace usage graph as an addition. But airbytehq/airbyte-platform-internal#18782 shows that for orgs with the data worker entitlement, the new data worker usage graph replaces the existing credit usage view (graph + filters + per-connection table) on the workspace Usage page. Documenting this as additive could confuse users who no longer see credit usage on their workspace Usage page. Please verify and clarify.

3. Connection QUEUED maps to stream status PENDING — disambiguation note should mention this

The stream-level disambiguation note in review-connection-status.md is good, but it doesn't mention the specific mapping: when a connection is queued for capacity, its individual streams show as Pending (not Queued). This is per airbytehq/airbyte-platform-internal#18723 commit "map job status queued to stream status pending." Users will see "Pending" on streams when the connection shows "Queued" — without this note, the terminology mismatch could be confusing.

4. Webhook payload for "Queued syncs" — verify backend actually sends this

The webhook payload JSON in manage-airbyte-cloud-notifications.md looks reasonable, but airbytehq/airbyte-platform-internal#18681 has a Devin Review finding that sendOnConnectionSyncQueued is unconditionally included in the API payload even when the backend may not support it. Please verify the backend actually fires this webhook before publishing the payload example. If the backend trigger isn't live yet, note that in the docs or remove the payload example until it's confirmed.

5. Capacity banner is feature-flag gated — docs should note the prerequisite

manage-data-workers.md mentions the dismissable yellow banner ("Maximum capacity currently reached…") but doesn't note that this banner only appears for organizations with the OnDemandCapacity feature flag enabled (per airbytehq/airbyte-platform-internal#18743). Orgs on capacity-based plans without on-demand capacity in their contract won't see this banner. The docs should clarify this so users don't report a "missing" banner.

6. "Queued syncs" notification is email-only — table shows webhook support

The notification table adds &#10003; for email and blank for webhook, which is correct. But the webhook payload section does include a "Queued syncs" payload example. These seem contradictory — if webhook isn't supported for this event type, the payload example shouldn't be there. If webhook IS supported, the table should show &#10003; for webhook too. Please verify and reconcile.

7. Missing: configuring-connections.md should note the toggle appears during connection creation too

The new row says "Use on-demand capacity (Cloud only)" but only describes the toggle as a connection setting. Since the toggle also appears during connection creation (airbytehq/airbyte-platform-internal#18678), this should be mentioned or cross-referenced to set-up-a-connection.md.

8. Mermaid diagram: verify \n renders correctly in Docusaurus

The transition labels use \n for line breaks (e.g., capacity enforcement active,\nno capacity available). Mermaid's handling of \n in labels can vary by renderer. Please verify this renders as a line break and not literal \n in the Vercel preview.

9. Minor: set-up-a-connection.md inline note is quite long for a bullet point

The bullet "When Airbyte should initiate a data sync. On capacity-based Cloud plans, syncs may be queued if data worker capacity is fully utilized. See Monitor data worker usage for details." turns a simple bullet into a multi-sentence paragraph. Consider moving the capacity note to a :::note block below the list instead, to maintain the clean list structure.

10. Consider: Queued jobs run FIFO — is this confirmed?

Multiple places state "Queued jobs run in the order they were triggered." Please confirm this FIFO behavior with the backend team. If the queue implementation uses any priority or doesn't guarantee strict ordering, this claim could mislead users.


Ian Alton (@ian-at-airbyte) (or original author): Please review each concern above for accuracy against the actual implementation. The most critical items to verify are concerns 2 (replacement vs additive), 4 (webhook backend readiness), and 6 (notification channel mismatch). The rest are documentation clarity improvements.

@ian-at-airbyte
Copy link
Copy Markdown
Contributor Author

Devin can you take a look at these?

- manage-data-workers.md: Clarify workspace usage replaces credit usage
  for entitled orgs; add note that on-demand toggle appears during
  connection creation; note banner requires on-demand capacity contract
- review-connection-status.md: Add stream Pending mapping to
  disambiguation note (streams show Pending when connection is Queued)
- manage-airbyte-cloud-notifications.md: Remove webhook payload for
  Queued syncs (email-only event; reconciles table vs payload mismatch)
- configuring-connections.md: Note toggle also appears during connection
  creation
- set-up-a-connection.md: Revert inline capacity note to keep bullet
  list clean (capacity details live in manage-data-workers.md hub page)

Co-Authored-By: ian.alton@airbyte.io <ian.alton@airbyte.io>
@devin-ai-integration
Copy link
Copy Markdown
Contributor

I've addressed the review comments in commit a594d8e. Here's what I changed and what still needs your verification:

Fixed:

  1. Connection creation toggle (concerns 1, 7): Added note in manage-data-workers.md and configuring-connections.md that the on-demand capacity toggle also appears during connection creation.
  2. Workspace usage replaces credit usage (concern 2): Updated manage-data-workers.md to clarify that the workspace Usage page shows data worker usage instead of credit usage for entitled orgs.
  3. Stream Pending mapping (concern 3): Updated the disambiguation note in review-connection-status.md to explicitly state: "When a connection is queued for data worker capacity, its individual streams display as Pending (not Queued)."
  4. Webhook payload mismatch (concern 6): Removed the webhook payload example for "Queued syncs" since the notification table shows it's email-only. Replaced with a note that webhook payloads are not supported for this event type.
  5. Capacity banner gating (concern 5): Updated banner sentence to note it requires on-demand capacity in the org's contract.
  6. Inline note too long (concern 9): Reverted set-up-a-connection.md to the original clean bullet point. Capacity details live in the hub page.
  7. Mermaid diagram (concern 8): Verified in the Vercel preview — \n renders correctly as line breaks in the state machine diagram.

Needs your verification (Ian Alton (@ian-at-airbyte)):

  • Concern 4: Does the backend actually fire the sendOnConnectionSyncQueued webhook/email? I removed the webhook payload but kept email support in the table.
  • Concern 10: Is FIFO ordering confirmed for the queue? Multiple places state "Queued jobs run in the order they were triggered."

Devin session

By default, all customers automatically review upcoming invoice notifications 3 and 7 days before the invoice is finalized. All billing notifications are sent to the billing email on file.

You can also enroll in billing notifications for your organization. Airbyte highly recommends enrolling in billing notifications to ensure you stay up-to-date on your upcoming invoices.
You can also enroll in billing notifications for your organization. Airbyte highly recommends enrolling in billing notifications to ensure you stay up-to-date on your upcoming invoices. If you use on-demand capacity, consider setting up billing alerts to monitor premium credit consumption. For more information about managing capacity, see [Monitor data worker usage](./manage-data-workers.md).
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Is that even an option? I thought we just sent an email when syncs were queued.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

You're right — I removed that sentence in 5f33de1. The billing notifications paragraph is now back to its original text without the on-demand capacity suggestion.


Devin session

devin-ai-integration bot and others added 3 commits April 1, 2026 08:02
…city

Per reviewer feedback, there is no specific billing alert feature for
on-demand credit consumption. Reverted the billing notifications
paragraph to its original text.

Co-Authored-By: ian.alton@airbyte.io <ian.alton@airbyte.io>
Code investigation of ConnectionManagerWorkflowImpl.kt shows there is no
explicit FIFO queue ordering. Each connection's workflow independently
polls for capacity every minute, and whichever poll runs first when
capacity frees up gets the reservation. Removed 'run in the order they
were triggered' claims from review-connection-status.md and
manage-data-workers.md.

Co-Authored-By: ian.alton@airbyte.io <ian.alton@airbyte.io>
- Replace 'Queued icon' placeholder in connection status table with
  actual hourglass icon (connection_queued.png)
- Add Burst tag image to tagging.md system tags section
- Add inline Burst tag image to manage-data-workers.md on-demand section

Co-Authored-By: ian.alton@airbyte.io <ian.alton@airbyte.io>
@devin-ai-integration
Copy link
Copy Markdown
Contributor

Code-Verified Eval: Technical Accuracy Review

I cross-referenced every technical claim in this PR against the actual implementation in airbyte-platform-internal. Below are findings organized by severity.

Show/Hide Detailed Findings

Finding 1: "Queued syncs" notification supports BOTH email AND webhook in the UI — docs say email-only

Severity: Medium — docs contradict the UI

The docs say "Queued syncs notifications are email-only. Webhook payloads are not supported for this event type." However, the UI code tells a different story:

In NotificationSettingsForm.tsx (line 173), the sendOnConnectionSyncQueued field is rendered as:

{isOnDemandCapacityEnabled && <NotificationItemField name="sendOnConnectionSyncQueued" />}

Note that it does not pass slackNotificationUnsupported — compare with the breaking change notifications which explicitly disable webhooks:

<NotificationItemField name="sendOnBreakingChangeWarning" slackNotificationUnsupported />

Without slackNotificationUnsupported, the NotificationItemField component renders both the email toggle AND the webhook/Slack toggle (see NotificationItemField.tsx lines 76-88). So the UI actually allows users to configure webhook notifications for queued syncs.

However, the backend trigger type connection_sync_queued is defined only as a frontend mock in types.ts — it extends NotificationTrigger with a TODO comment: "Remove this file when backend API is ready." The backend NotificationTrigger enum in the generated API types does not include connection_sync_queued yet. This means:

  • The UI lets users enable webhooks for this event
  • But the backend may not actually fire the notification (email OR webhook) since the trigger type isn't in the backend enum yet

Recommendation: Investigate whether the backend actually fires notifications for this trigger. The docs should either:

  1. State that webhook support exists (matching the UI), OR
  2. Add slackNotificationUnsupported to the NotificationItemField if webhooks truly aren't supported

Code locations:

  • airbyte-platform-internal:oss/airbyte-webapp/src/area/settings/components/NotificationSettingsForm/NotificationSettingsForm.tsx:173
  • airbyte-platform-internal:oss/airbyte-webapp/src/area/settings/components/NotificationSettingsForm/types.ts:1-31 (see the TODO on line 3)
  • airbyte-platform-internal:oss/airbyte-webapp/src/area/settings/components/NotificationSettingsForm/NotificationItemField.tsx:76-88

Finding 2: Capacity banner is NOT gated on OnDemandCapacity — it's gated on queuedCount > 0

Severity: Medium — docs claim it requires on-demand capacity in contract

The docs state: "If your organization has on-demand capacity in its contract, a dismissable yellow banner also appears..."

The actual CapacityReachedMessage.tsx component shows the banner based purely on whether queuedCount > 0:

const queuedCount = statusCounts?.queued ?? 0;
const showBanner = queuedCount > 0 && !isDismissed;

There is NO feature flag check, no OnDemandCapacity entitlement check, and no EnforceDataWorkerCapacity flag check in this component. The banner appears for ANY workspace that has queued connections, regardless of whether on-demand capacity is in the contract.

The AllConnectionsPage.tsx also renders <CapacityReachedMessage /> unconditionally (line 150) — no feature gating wrapper.

Recommendation: Remove the claim that the banner "requires on-demand capacity in its contract." The banner appears whenever connections are queued, which is the correct behavior for all capacity-based plan users.

Code locations:

  • airbyte-platform-internal:oss/airbyte-webapp/src/area/connection/components/CapacityReachedMessage/CapacityReachedMessage.tsx:18,30
  • airbyte-platform-internal:oss/airbyte-webapp/src/pages/connections/AllConnectionsPage/AllConnectionsPage.tsx:150

Finding 3: Capacity enforcement is feature-flag gated (EnforceDataWorkerCapacity), not plan-gated — docs imply it's automatic for capacity plans

Severity: Low-Medium — potentially misleading

The docs consistently say "On capacity-based Cloud plans..." as if capacity enforcement is automatic for Pro/Enterprise Flex. But the code shows it's controlled by a feature flag:

// ConnectionManagerWorkflowImpl.kt:1087
val enforcementEnabled = featureFlags[EnforceDataWorkerCapacity.key] ?: false
if (!enforcementEnabled) {
  return  // Skip capacity check entirely
}

And the flag definition:

// FlagDefinitions.kt:267
object EnforceDataWorkerCapacity : Temporary<Boolean>(key = "platform.enforce-data-worker-capacity", default = false)

The default is false, meaning enforcement is OFF unless explicitly enabled per organization. This is a Temporary flag, suggesting it's being rolled out gradually. If a Pro/Enterprise Flex org doesn't have this flag enabled, their syncs won't be queued — they'll run normally without capacity checks.

Recommendation: This is likely fine for external docs since the flag is an internal rollout mechanism. But be aware that the feature won't apply to all capacity-based plans simultaneously. If this is still in gradual rollout, consider adding a note like "Capacity enforcement is being rolled out to capacity-based plans" or confirming with the team that it's fully enabled for all target orgs.

Code locations:

  • airbyte-platform-internal:oss/airbyte-workers/src/main/kotlin/io/airbyte/workers/temporal/scheduling/ConnectionManagerWorkflowImpl.kt:1087-1090
  • airbyte-platform-internal:oss/airbyte-featureflag/src/main/kotlin/FlagDefinitions.kt:267

Finding 4: Toggle description text is accurate — verified against locale strings

Severity: None — docs are correct

The docs quote the toggle description as: "Enable connection to use credits to always run syncs on demand. Syncs for this connection will never be queued, and only consume credits if no capacity is available."

This matches exactly with en.json:

"connectionForm.runOnDemand.description": "Enable connection to use credits to always run syncs on demand. Syncs for this connection will never be queued, and only consume credits if no capacity is available."

Code location: airbyte-platform-internal:oss/airbyte-webapp/src/locales/en.json:471


Finding 5: Banner text is accurate — verified against locale strings

Severity: None — docs are correct

The docs quote: "Maximum capacity currently reached, additional jobs will be queued until capacity is available."

This matches en.json:

"connection.capacityReached.banner": "Maximum capacity currently reached, additional jobs will be queued until capacity is available"

Code location: airbyte-platform-internal:oss/airbyte-webapp/src/locales/en.json:668


Finding 6: 8-hour timeout for manual syncs — verified correct

Severity: None — docs are correct

The docs claim "Eight hours have elapsed for manually triggered syncs." This is confirmed:

// ConnectionManagerWorkflowImpl.kt:1654
private val MANUAL_CAPACITY_WAIT_TIMEOUT: Duration = Duration.ofHours(8)

And it only applies to MANUAL schedule type:

// ConnectionManagerWorkflowImpl.kt:1185-1190
private fun getManualCapacityWaitMs(scheduleType: ConnectionScheduleType?): Long =
    if (scheduleType == ConnectionScheduleType.MANUAL) {
      MANUAL_CAPACITY_WAIT_TIMEOUT.toMillis()
    } else {
      Long.MAX_VALUE  // No manual timeout for scheduled connections
    }

Finding 7: Scheduled run replacement behavior — verified correct

Severity: None — docs are correct

The docs claim "the newer scheduled run replaces the queued one." This is confirmed in ConnectionManagerWorkflowImpl.kt:

  1. The waitForCapacityIfNeeded method (lines 1131-1150) polls for capacity and checks elapsedMs >= nextScheduledRunMs
  2. When the next scheduled run time arrives, it throws CapacityWaitExceededException (line 1146)
  3. The caller catches this (line 354-370), cancels the queued job via cancelJobBeforeAttempt, resets the input via resetNewConnectionInput, and continues as new via prepareForNextRunAndContinueAsNew

The cancellation reason is: "Job cancelled: next scheduled sync time reached while waiting for Data Worker capacity" (line 1656)


Finding 8: Poll interval is 1 minute — not documented but worth noting

Severity: Info only

The docs don't mention the poll interval, which is probably fine for user-facing docs. But for reference:

private val CAPACITY_CHECK_POLL_INTERVAL: Duration = Duration.ofMinutes(1)

This means a queued job checks for capacity every 1 minute. After capacity frees up, there's up to a 1-minute delay before the queued job starts running.


Finding 9: On-demand capacity check uses DB-level row lock — docs claim about no FIFO is correct

Severity: None — docs are correct

The docs correctly removed FIFO claims. The DataWorkerCapacityService.kt confirms:

// line 92: lockOrganization(organizationId)

This locks the org row for the duration of the transaction, so concurrent capacity checks serialize. Whichever connection's poll hits the lock first when capacity is free gets the reservation. This is effectively "whoever polls first wins" — no FIFO queue.


Finding 10: The sendOnConnectionSyncQueued notification field defaults to off — docs are correct

Severity: None — the note about "off by default" is accurate

The notification settings form defaults come from notificationSettingsToFormValues, which maps from workspace notification settings. For a new field that isn't in the existing workspace settings, it would default to { slack: false, customerio: false }. The docs correctly note: "Queued syncs notifications default to off because capacity enforcement queuing is expected behavior."

Summary of actionable items for the original Devin:

  1. [Medium] Notification channel mismatch: The UI allows webhook configuration for "Queued syncs" but the docs say email-only. And the backend trigger may not exist yet (types.ts has a TODO about this). Investigate and align docs with actual behavior. See Finding 1.

  2. [Medium] Banner gating claim is wrong: The banner is NOT gated on on-demand capacity in the org's contract. It appears for any workspace with queuedCount > 0. Remove the "If your organization has on-demand capacity in its contract" qualifier from manage-data-workers.md. See Finding 2.

  3. [Low-Medium] Feature flag vs plan gating: Consider whether the docs should note that capacity enforcement is being rolled out gradually, or confirm with the team that the EnforceDataWorkerCapacity flag is fully enabled for all target orgs. See Finding 3.


Devin session

…review

- Remove 'If your organization has on-demand capacity in its contract'
  qualifier from banner description. Code shows CapacityReachedMessage
  renders for any workspace with queuedCount > 0 (no feature flag check).
- Update queued syncs notification payload section: the UI allows both
  email and webhook configuration (no slackNotificationUnsupported prop).
  Note that no example payload is available yet.

Co-Authored-By: ian.alton@airbyte.io <ian.alton@airbyte.io>
@devin-ai-integration
Copy link
Copy Markdown
Contributor

Addressed the three actionable findings from the eval review in ff96308:

Finding 1 (Notification channel mismatch) — Fixed: Verified that NotificationSettingsForm.tsx:173 renders sendOnConnectionSyncQueued without slackNotificationUnsupported, so the UI shows both email AND webhook toggles. Updated the payload section to say both are supported (no example payload available yet). Note: the backend trigger connection_sync_queued is still a frontend mock in types.ts with a TODO to remove when the backend API is ready — so neither notification type may actually fire yet. Ian Alton (@ian-at-airbyte) — can you confirm whether the backend trigger is live?

Finding 2 (Banner gating) — Fixed: Removed "If your organization has on-demand capacity in its contract" from the banner description. CapacityReachedMessage.tsx checks queuedCount > 0 && !isDismissed with no feature flag or entitlement check. The banner appears for any workspace with queued connections.

Finding 3 (Feature flag vs plan gating) — Needs decision: The docs say "On capacity-based Cloud plans..." but the code shows enforcement is gated behind EnforceDataWorkerCapacity (a Temporary flag, default false). For external docs, I think "On capacity-based Cloud plans" is the right framing since the flag is an internal rollout mechanism. Ian Alton (@ian-at-airbyte) — should we add a note that capacity enforcement is being rolled out gradually, or is it fully enabled for all target orgs?


Devin session

@ian-at-airbyte
Copy link
Copy Markdown
Contributor Author

You can assume the back end will be completed.

Don't account for rollout in the docs. Operate as if everyone will be getting this immediately.

@devin-ai-integration
Copy link
Copy Markdown
Contributor

Got it — leaving the docs as "On capacity-based Cloud plans..." with no rollout caveat. Finding 3 is resolved, no changes needed.

For Finding 1: the notification payload section now says both email and webhook are supported. Since we're assuming the backend will be completed, no further caveats needed there either.

All three eval findings are addressed in ff96308.


Devin session

Copy link
Copy Markdown
Contributor

@dizel852 Vladimir (dizel852) left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM 👍

@dizel852
Copy link
Copy Markdown
Contributor

Vladimir (dizel852) commented Apr 7, 2026

Devin Ian Alton (@ian-at-airbyte) IMO we should also mention that enabling “Run on demand” is only available to admins.

A couple of related PRs were recently merged:
https://github.com/airbytehq/airbyte-platform-internal/pull/18857
https://github.com/airbytehq/airbyte-platform-internal/pull/18851

Per intents.yaml, ManageConnectionOnDemandCapacity is restricted to
ORGANIZATION_ADMIN, WORKSPACE_ADMIN, and ADMIN roles. The UI shows a
disabled toggle with tooltip 'Only admins can enable or disable
on-demand capacity' for other roles.

Updated manage-data-workers.md and configuring-connections.md to
document this restriction.

Co-Authored-By: ian.alton@airbyte.io <ian.alton@airbyte.io>
@devin-ai-integration
Copy link
Copy Markdown
Contributor

Good catch! I verified this against the code in airbyte-platform-internal:

  • intents.yaml lines 192-198: ManageConnectionOnDemandCapacity is restricted to ORGANIZATION_ADMIN, WORKSPACE_ADMIN, and ADMIN roles only
  • RunOnDemandFormField.tsx line 22: Uses useGeneratedIntent(Intent.ManageConnectionOnDemandCapacity) to check permission
  • Lines 82-85: If the user doesn't have the intent, the toggle is disabled with tooltip "Only admins can enable or disable on-demand capacity"

Updated in adb0d6d:

  • manage-data-workers.md: Updated the on-demand capacity section to say "organization admins and workspace admins can enable it per connection. Other roles can view the toggle but cannot change it." Also added a note on the enable step that you need the admin role.
  • configuring-connections.md: Updated the connection settings table to note "Only organization admins and workspace admins can change this toggle."

Devin session

| [Destination Namespace](../../using-airbyte/core-concepts/namespaces) | Determines where the replicated data is written to in the destination |
| [Destination Stream Prefix](../../using-airbyte/configuring-schema) | (Optional) Adds a prefix to each table name in the destination |
| [Detect and propagate schema changes](../../using-airbyte/schema-change-management) | Set how Airbyte handles schema changes in the source |
| Use on-demand capacity (Cloud only) | When enabled, syncs always run even if committed capacity is exhausted, by consuming credits at a premium rate. Only organization admins and workspace admins can change this toggle. It also appears during connection creation. See [Monitor data worker usage](./manage-data-workers.md). |
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should we say "Pro & Flex Only"?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch — updated in 369ee3b. Changed to "Cloud Pro and Enterprise Flex only" here and across all other capacity-related labels (review-connection-status.md, review-connection-timeline.md, tagging.md, jobs.md).


Devin session


4. On the **Status** tab for a connection, there is a list of associated Streams. To the left of the name for each Stream, there is an icon that displays its status.

### Queued connections (Cloud only)
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pro/Flex only?

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good call — updated in 369ee3b. Changed from "Cloud only" to "Cloud Pro and Enterprise Flex only" to be more precise about which plans have capacity enforcement. Updated the table row description and the subsection heading.


Devin session

…or capacity features

Per reviewer feedback, capacity enforcement and on-demand capacity are
specific to Pro and Enterprise Flex plans, not all Cloud plans. Updated
parenthetical labels across all affected files.

Co-Authored-By: ian.alton@airbyte.io <ian.alton@airbyte.io>
@ian-at-airbyte
Copy link
Copy Markdown
Contributor Author

In Connection / Settings/ the text under Use-on-demand-capacity. Let's change it to: Enable on demand capacity for this connection. Syncs for this connection will never be queued. Syncs that run when committed data worker is exhausted will be charged a premium rate.

Updated the quoted toggle description text to match the new UI copy:
'Enable on demand capacity for this connection. Syncs for this
connection will never be queued. Syncs that run when committed data
worker is exhausted will be charged a premium rate.'

Co-Authored-By: ian.alton@airbyte.io <ian.alton@airbyte.io>
@devin-ai-integration
Copy link
Copy Markdown
Contributor

Updated in 01f4064 — the toggle description now reads: "Enable on demand capacity for this connection. Syncs for this connection will never be queued. Syncs that run when committed data worker is exhausted will be charged a premium rate."


Devin session


## On-demand capacity credits

If your organization uses [on-demand capacity](./manage-data-workers.md#on-demand-capacity), syncs that run when committed data worker capacity is exhausted consume organization credits at a premium rate. The premium rate is determined by your contract. Contact your Airbyte representative or [talk to sales](https://airbyte.com/company/talk-to-sales) for details.
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
If your organization uses [on-demand capacity](./manage-data-workers.md#on-demand-capacity), syncs that run when committed data worker capacity is exhausted consume organization credits at a premium rate. The premium rate is determined by your contract. Contact your Airbyte representative or [talk to sales](https://airbyte.com/company/talk-to-sales) for details.
If your organization uses [on-demand capacity](./manage-data-workers.md#on-demand-capacity), syncs that run when committed data worker capacity is exhausted consume organization credits at a premium rate.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Applied in 78b49dc — removed the contract/sales sentence, keeping just the one-liner about premium rate.


Devin session


If your organization uses [on-demand capacity](./manage-data-workers.md#on-demand-capacity), syncs that run when committed data worker capacity is exhausted consume organization credits at a premium rate. The premium rate is determined by your contract. Contact your Airbyte representative or [talk to sales](https://airbyte.com/company/talk-to-sales) for details.

On-demand credit consumption appears in your billing alongside other credit usage. If your organization runs out of credits, on-demand syncs are queued like standard syncs. Queuing does not incur any charges. Credits are only consumed when a sync runs using on-demand capacity.
Copy link
Copy Markdown
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
On-demand credit consumption appears in your billing alongside other credit usage. If your organization runs out of credits, on-demand syncs are queued like standard syncs. Queuing does not incur any charges. Credits are only consumed when a sync runs using on-demand capacity.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Deleted this paragraph in 78b49dc.


Devin session

Removed contract/sales details and second paragraph about billing
visibility and queuing behavior, keeping the section concise.

Co-Authored-By: ian.alton@airbyte.io <ian.alton@airbyte.io>

For critical data pipelines that must always run on time, you can enable on-demand capacity on individual connections. When committed capacity is available, the sync uses it at no extra cost. When committed capacity is exhausted, the sync consumes organization credits at a premium rate so it runs immediately instead of being queued.

On-demand capacity must be part of your signed contract. Contact your Airbyte representative or [talk to sales](https://www.airbyte.com/talk-to-sales) if you're interested. Once your organization administrator enables on-demand capacity at the organization level, organization admins and workspace admins can enable it per connection. Other roles can view the toggle but cannot change it.
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

lets remove
On-demand capacity must be part of your signed contract. Contact your Airbyte representative or talk to sales if you're interested

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Removed in 6d1c298 — deleted the contract/sales requirement sentence. The paragraph now starts with "Once your organization administrator enables on-demand capacity..."


Devin session


On-demand capacity must be part of your signed contract. Contact your Airbyte representative or [talk to sales](https://www.airbyte.com/talk-to-sales) if you're interested. Once your organization administrator enables on-demand capacity at the organization level, organization admins and workspace admins can enable it per connection. Other roles can view the toggle but cannot change it.

If your organization runs out of credits, syncs are queued even if on-demand capacity is enabled. For more information about credit consumption, see [Manage billing and credits](./manage-credits.md).
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Remove - no concept of credits. It will run no matter what.

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Removed in 6d1c298 — deleted the entire "credits run out" paragraph. On-demand capacity runs no matter what.


Devin session


You can view more details about an individual invoice by clicking **View Invoice**.

## On-demand capacity credits
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Let's remove this section we're not using credits for that

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Removed in 6d1c298 — deleted the entire "On-demand capacity credits" section from manage-credits.md.


Devin session

…eedback

- Removed contract/sales requirement sentence from manage-data-workers.md
- Removed 'credits run out' paragraph from manage-data-workers.md (on-demand runs no matter what)
- Removed 'credits at a premium rate' phrasing from intro paragraph
- Removed entire on-demand capacity credits section from manage-credits.md
- Updated configuring-connections.md table to remove credit-based language

Co-Authored-By: ian.alton@airbyte.io <ian.alton@airbyte.io>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants