Skip to content

1.0.0

Choose a tag to compare

@goldnead goldnead released this 05 Aug 06:03
· 97 commits to main since this release

First stable release. Completes the post-MVP feature set that positions the
addon for the Statamic marketplace, and makes it installable and verifiable
on a current Statamic 6 install (Laravel 13).

Added

Integrations & Insights

  • [new] Integration presets — a guided "pick a destination → fill a URL → done"
    flow that builds a fully-configured outbound webhook from a recipe, so users
    never hand-write a payload template. Ships Slack, Discord, Microsoft Teams,
    Zapier, Make, n8n and Generic JSON
    , with a native gallery and setup form.
  • [new] "Send webhook" entry action — a native CP action that fires a chosen
    enabled outbound webhook for the selected entries through the same delivery
    pipeline as automatic triggers.
  • [new] Failure alerting & circuit breaker — throttled email + Slack alerts when
    a delivery fails after all retries, and automatic disabling of a hook after
    N consecutive terminal failures (consecutive_failures, configurable
    threshold). Surfaced as native "Circuit breaker" / "Failure alerts" sections
    on the Settings screen.
  • [new] Insights dashboard — delivery volume, success-rate trend, latency
    percentiles (p50/p95/p99), error breakdown and top-failing endpoints, with
    day-range and per-webhook filters. Self-contained charts (no charting
    dependency) using the CP's own Tailwind tokens.

Storage

  • [new] Flat-file (YAML) storage driver — webhook configuration (outbound,
    inbound, rules, templates) can live as human-readable, git-versionable YAML
    under content/webhooks/ instead of database tables. Delivery records and
    logs always stay in the database. Records keep a stable integer id so the
    delivery/log history resolves under either driver.
  • [new] webhook-manager:storage:migrate — copies config between the eloquent
    and flat drivers id-for-id (with --dry-run).
  • [new] Control-Panel storage switch (Settings → Storage) — shows the active
    driver and record counts, and switches drivers (migrate + activate) without
    any .env/shell access.

Tooling

  • [new] Persistent local playground (scripts/setup-playground.sh): a fresh
    Statamic 6 site with the addon wired in as a Composer path repo, SQLite, a
    CP super-user and seeded sample records (outbound webhook, inbound endpoint,
    payload template) plus a pages collection so entry.* triggers fire.
  • [new] End-to-end smoke test (scripts/smoke-test.sh): installs a throwaway
    Statamic project, renders a payload template and delivers it to a local
    receiver through the real DeliveryEngine, asserting the Delivery is
    recorded as a success.
  • [new] CI workflow (.github/workflows/tests.yml): PHP 8.2/8.3/8.4 × Statamic 6.
  • [new] composer test script; support block and author email in composer.json.
  • [new] MARKETPLACE.md listing copy.
  • [new] Brand logo asset (art/logo.svg) for the marketplace listing.

Fixed

  • [fix] Install failed on a fresh Statamic 6 project (Laravel 13). The Statamic 6
    skeleton now ships Laravel 13, but orchestra/testbench was capped at
    ^9|^10 (Laravel 12), so composer require --dev/composer update could not
    resolve against a Laravel 13 host. Widened to ^9|^10|^11 (testbench 11 =
    Laravel 13) and phpunit/phpunit to ^10.5|^11|^12.

Changed

  • Feature toggles are now enforced in the CP navigation. Disabling
    inbound, rules, templates, debug_tools (or outbound) in
    config/webhook-manager.php hides that module's sidebar entry; previously
    the toggles were only surfaced on the Settings screen.
  • Documentation accuracy: README status line, config comments and several
    model/request docblocks described inbound, rules and templates as "stubs"
    / "no-op" / "returns 501" — these modules are in fact fully implemented and
    test-covered. Updated the copy to match the shipping behaviour.
  • .devcontainer/post-create.sh now delegates to scripts/setup-playground.sh.

Removed

  • Dead Jobs/DispatchRuleActionsJob placeholder (empty handle(), never
    dispatched — the rule engine runs synchronously via RuleEngine).