Platform Updates9 min read

Workflow Automation Update: Playbook Variables, Draft Runs, Live Migrations

By ButterGrow Team

TL;DR

This release introduces Playbook Variables for clean parameterization, Draft Runs for safe pre deployment testing, and Live Migrations for zero interruption rollouts. Together they reduce risk, cut copy paste playbooks, and make workflow automation easier to manage at scale. You can templatize once, validate changes with real inputs, then promote confidently without disrupting active campaigns. The updates are available today in ButterGrow, which runs on OpenClaw across all paid workspaces. Teams can validate changes, standardize prompts, and migrate live flows with guardrails so shipping stays safe and predictable.

What shipped in 2.8

This update focuses on reliability and reuse so teams move faster without trading away safety. Three capabilities land together:

  • Playbook Variables. A typed parameter system with environment defaults, secret binding, and runtime overrides.
  • Draft Runs. A sandbox that executes logic end to end while suppressing external side effects so you can measure and inspect safely.
  • Live Migrations. A controlled rollout and rollback flow that shifts traffic gradually, supports backfill, and writes a full audit trail.

If you are new to our product, start with the AI marketing automation features to see what ButterGrow does end to end. For common setup topics, browse the FAQ.

For background on safety controls that complement these features, read our earlier post on diff and dry run safety checks.

Playbook Variables: templatize once, scale everywhere

Variables let you keep a single template for many scenarios. Instead of forking a playbook for each brand, region, or channel, you declare typed inputs, provide environment defaults, and bind secrets from the vault. Steps can reference variables in prompts, conditions, URLs, and schedule windows so behavior adapts without code churn.

Step 1Declare inputs in the manifest

Each playbook includes a variables block with names, types, and optional defaults. Types include string, number, boolean, json, and secret.

variables:
  - name: brand_code
    type: string
    description: Short code used for tagging and routing
    default: NA
  - name: region
    type: string
    enum: [NA, EU, APAC]
  - name: promo_toggle
    type: boolean
    default: false
  - name: cta_template
    type: string
    default: "Save {{percent}} on {{product}}"
  - name: third_party_api_key
    type: secret

Step 2Bind environment defaults and secrets

You can set environment scoped defaults in workspace settings. Secrets are never stored in YAML. They are referenced by logical name and pulled from the vault at runtime.

{
  "environments": {
    "staging": {
      "brand_code": "NA",
      "region": "NA",
      "promo_toggle": true
    },
    "production": {
      "brand_code": "EU",
      "region": "EU"
    }
  },
  "secrets": {
    "third_party_api_key": "vault://providers/xyz/key"
  }
}

Step 3Reference variables in steps

Variables are interpolated directly in step configs. You can switch models, change routing, or alter message templates without touching the underlying logic.

steps:
  - id: fetch_customer
    uses: http.get
    with:
      url: https://data.example.com/customer/{{ brand_code }}/{{ region }}/{{ event.customer_id }}
      headers:
        Authorization: Bearer {{ third_party_api_key }}

  - id: choose_channel
    uses: router
    when: "{{ promo_toggle }} == true"
    routes:
      - if: "{{ region }} == 'EU'"
        to: send_email
      - if: "{{ region }} != 'EU'"
        to: send_sms

Step 4Validate types and defaults before publish

The editor validates required variables and type mismatches before a template is published. You get clear errors for missing values and simple hints when a default might be safer than a hard coded string.

Step 5Override per run for experiments

When you want to test a new tone or target, you can override variables for a single execution. This keeps experiments tidy while your main configuration stays stable.

The practical outcome is fewer forks, cleaner reviews, and easier governance. Teams stop copying entire playbooks for small differences and focus instead on outcomes.

Draft Runs: test logic without side effects

Draft Runs execute your updated playbook against real inputs in a sandboxed environment. External calls are stubbed or placed in preview mode, so you can observe data transforms, latency, and branching without sending emails, placing ads, or mutating records.

Step 1Pick inputs from recent traffic

Choose sample events from the last hour or paste a JSON fixture. The runner feeds these through your proposed changes with full tracing so you can check each hop.

Step 2Inspect payloads and schemas

Every step emits before and after snapshots. If a mapping drops a field or changes a type, the diff is highlighted so you can fix the transform before promotion. This is exactly the problem that long tail bugs often hide behind, which is why preflight inspection matters.

Step 3Suppress external side effects

Outgoing connectors enter preview mode. Email steps render drafts, ad steps simulate API calls, and webhooks sign but do not deliver. If you rely on signature verification, see Stripe guidance on verifying webhook signatures for why the signature step still matters even during tests.

Step 4Measure latency and error budgets

Draft Runs record timings across steps so you can spot slow models, rate limited APIs, or heavy joins. You can set an error budget for promotion so a migration will only proceed if the sandbox run stays under agreed thresholds.

These runs are not a separate staging project. They use your current environment config and secrets, which is how they find real edge cases before anything ships.

Live Migrations: change automations without interruption

Live Migrations promote a new version alongside the existing one, then shift event traffic gradually. If health checks pass, the system completes the cutover. If error rates rise or latency spikes, promotion halts automatically and traffic returns to the previous version.

Here is how it works in practice:

Step 1Propose a migration

You commit a new template version and attach a migration plan. The plan defines a ramp schedule, guardrails, and optional backfill instructions.

migration:
  schedule:
    strategy: ramp
    steps:
      - weight: 10
        duration: 10m
      - weight: 50
        duration: 20m
      - weight: 100
        duration: 30m
  guardrails:
    max_error_rate: 0.5
    max_p95_latency_ms: 2500
  backfill:
    enabled: true
    from: "2026-05-01T00:00:00Z"
    to:   "2026-05-15T23:59:59Z"
    filter: "event.type in ['purchase', 'add_to_cart']"

Step 2Warm up and compare

The new version receives a small portion of live traffic in parallel with the current version. Metrics and traces are compared in near real time. This mirrors blue green concepts described by AWS for safe application rollouts and it keeps your campaign traffic steady while you watch the numbers.

Step 3Automatic rollback when guardrails trip

If error or latency thresholds are crossed, the system pauses promotion and routes events back to the stable version. A compatibility shim can be added, for example to remap a field that a downstream system expects, before the migration resumes.

Step 4Optional backfill after cutover

Once healthy, you can backfill historical events through only the changed steps. This lets you fix past records or replay ad conversions without touching unaffected logic. Long tail phrases that teams search for include how to migrate running workflows safely and how to run zero downtime workflow changes in production, and this feature is built for those scenarios.

Before and after

Concern Before Now
Rollout Big bang publish Gradual ramp with health checks
Safety Manual spot checks Automated guardrails and rollback
Testing Ad hoc staging Isolated Draft Runs with real inputs
Reuse Fork per brand Typed Variables with defaults and overrides
History Hard to repair Targeted backfill with audit entries

Release engineering notes

  • Versioning. Template versions are immutable once published. Migrations reference a version hash to avoid accidental drift.
  • Audit trails. Every Draft Run and Migration writes a record with who, what, when, and the exact configuration used so later debugging is precise.
  • Compatibility. You can keep a temporary compatibility step during a rollout to reshape payloads for older downstreams while clients upgrade.
  • Secrets. Variable binding uses the workspace vault with least privilege. Operators see names, not values, in the interface.
  • Telemetry. The same tracing layer powers Draft Runs and Migrations, which means the metrics you trust in production are the ones you use preflight.

What this means for marketers

These capabilities are not just for engineers. They reduce the waiting and coordination burden that slows growth experiments.

  • Faster templating. Create one reusable playbook for new markets by declaring variables like locale, legal copy, and channel mix. That supports parameterize marketing automation playbooks at scale without extra forks.
  • Safer edits. Try a new subject line or bidding strategy in a Draft Run, check the output, then promote with a ramp schedule instead of flipping a global switch.
  • Cleaner handoffs. Growth, data, and engineering share the same logs and guardrails so it is clear why a promotion paused or why a backfill skipped a record.
  • Easier compliance. Secrets stay out of code and every change has an audit entry, which simplifies reviews.

Webhooks and event shape improvements

Two quality of life changes land alongside the headliners so integrations are smoother:

  • Signed previews. Draft Runs generate signed webhook previews so you can test verifier code paths without delivery. For background, see the industry approach to verifying webhook signatures.
  • Optional CloudEvents fields. Outgoing events can add standard attributes like id, source, type, and specversion so downstreams that expect this format parse more easily. The CloudEvents specification explains the shape and semantics if you want to align consumers.

Example: migrate a cart recovery flow safely

Let us make it concrete with a common ecommerce scenario. You want to adjust an abandoned cart playbook so SMS is used in Europe only when the cart value is above a threshold, while email remains the default elsewhere. At the same time, you want to add a coupon code in the CTA and fix a mapping for the analytics event.

Step 1Add Variables

Declare region, sms_threshold, and cta_template. Provide environment defaults so production behaves as expected but staging can tweak the threshold more aggressively.

Step 2Create a Draft Run

Pick recent events for a few European countries and the United States. Inspect the router decision and the final message renders. Confirm that SMS only triggers in the expected cases and that the coupon code is injected correctly into the template.

Step 3Plan a Migration

Set a ramp from 10 percent to 50 percent to 100 percent with an error budget. Keep a compatibility step that continues to emit the old analytics field name while the data team updates dashboards.

Step 4Backfill

After the cutover is healthy, replay the last two weeks of abandoned cart events through the mapping update only. This cleans up historical inconsistencies without doubling emails or SMS sends.

Getting value quickly

You do not need a weeks long project to see benefits. Start by declaring two or three Variables in your most forked playbook, then run a Draft on a real traffic sample. If the results look good, attach a simple 10 percent to 100 percent Migration and watch the health checks do the work. The feedback loop is fast and it builds confidence for larger changes.

If you want inspiration beyond product docs, browse more from the ButterGrow blog for real world patterns we are seeing across teams.

ButterGrow customers already using these features report shorter review cycles and fewer incidents because risky changes are isolated and reversible. The teams that win are the ones who ship small, safe changes every day rather than big, brittle launches once a quarter.

Your next step can be simple. Open your most important playbook, declare two Variables, run a Draft, and stage a Migration with a short ramp. The combination delivers steady progress without surprises.

With these updates live, our hosted assistant remains the fastest path from idea to impact for modern growth teams.

Our team would love to show this in action. You can follow the onboarding flow to try it on your own data.

References

Frequently Asked Questions

How do Playbook Variables keep sensitive values like API keys out of version control?+

Variables are declared in a manifest with types and optional defaults, then bound to environment scopes such as staging or production. Secrets are referenced by name and fetched from the workspace vault at runtime, so the values never appear in code or logs. This reduces accidental exposure while keeping deployments repeatable.

What is a Draft Run and when should I use it instead of a normal execution?+

A Draft Run executes a proposed change in an isolated sandbox that mirrors production inputs without sending external side effects. Use it to validate logic, inspect payload transforms, and measure latency before promotion. It is ideal for testing risky edits, new connectors, or schema changes.

How do Live Migrations avoid downtime for active automations?+

Live Migrations introduce a blue green style rollout where new versions warm up alongside the old version. Traffic shifts gradually with automatic health checks and a timed cutover. If an error threshold is crossed, the system pauses promotion and routes events back to the stable version for a quick rollback.

Can I backfill historical events after changing a transformation step?+

Yes. After a migration is marked healthy, you can queue a backfill job that replays selected historical events through only the updated steps. Backfill respects rate limits and de duplication keys, and it writes audit entries so you can trace which records were touched.

How do I parameterize a playbook for multiple brands or regions without forking logic?+

Declare Variables for brand code, locale, and channel toggles, then set environment defaults and per run overrides. Steps can reference these values for prompts, routing, and schedule windows. This lets one template serve many variants while keeping version control clean.

What happens if a migration introduces a schema mismatch with a downstream webhook?+

Draft Runs catch most mismatches by validating example payloads against the configured schema. If something slips through in production, health checks and error budgets halt promotion and roll traffic back. You can then adjust the mapping or add a compatibility shim before retrying the migration.

Ready to try ButterGrow?

See how ButterGrow can supercharge your growth with a quick demo.

Book a Demo