Existing clients: v3.useburrow.com

Custom event tracking via API and SDK for any application

Send events from Laravel apps, serverless functions, CI/CD pipelines, headless CMS platforms, or any system that can make an HTTP POST. Custom events appear in the same client timeline as WordPress, Shopify, and GitHub signals — with PHP and TypeScript SDKs.

[ Signal examples ]

your_app.user_registered
pipeline.deploy_completed
cron.nightly_sync
cms.content_published
api.rate_limit_exceeded
migration.completed
health.check_passed
webhook.received

Nine channels cover 90% of agency signals. The API covers everything else.

Burrow’s built-in channels — Code, Analytics, Ecommerce, Forms, Monitoring, Invoicing, Backups, System, and Automations — handle the signals most agencies need out of the box. Connect a CMS plugin or a platform integration and events start flowing.

But agencies build custom things. Client X has a Laravel API powering a membership portal. Client Y has a headless CMS with a custom publishing workflow. Client Z runs a proprietary checkout that doesn’t use Shopify or WooCommerce. Those systems generate operational signals too — and those signals belong in the same client timeline as everything else.

Custom channels let you send events from any system, using any naming convention, into the same Burrow project that holds the client’s WordPress events, GitHub deploys, and Stripe billing. No special configuration. No channel creation step. Send an event with your chosen source and type, and it appears in the timeline.

How it works

Every Burrow event follows the same envelope:

{
  "source": "membership-api",
  "type": "user.registered",
  "projectId": "client_acme",
  "payload": {
    "userId": "usr_4821",
    "plan": "premium",
    "referralSource": "landing-page-v2"
  }
}

The source identifies the system. The type identifies the event. The projectId scopes it to the client. The payload carries whatever metadata matters for your use case.

Send that payload via the REST API or the PHP/TypeScript SDKs, and it lands in Client Acme’s timeline alongside their WordPress form submissions, GitHub deploys, and Shopify orders. No channel configuration step. No schema registration. The event appears, categorized by its source, searchable by its type.

What agencies send through custom channels

Application health checks

source: "health-monitor"  |  type: "check.passed"  |  projectId: "client_acme"
source: "health-monitor"  |  type: "check.failed"  |  projectId: "client_acme"

Custom health checks that go beyond HTTP uptime — API response times, database connection health, third-party service availability, queue depth, memory usage. When the client’s API starts timing out, the event appears in the same timeline as the deploy that preceded it.

CI/CD pipeline events

source: "github-actions"  |  type: "pipeline.completed"  |  projectId: "client_acme"
source: "github-actions"  |  type: "pipeline.failed"  |  projectId: "client_acme"

For agencies using CI/CD beyond what GitHub’s native integration captures — custom test suites, staging deployments, database migration runs, build artifact generation. Each pipeline step becomes a visible event in the client timeline.

Custom CMS content events

source: "contentful"  |  type: "entry.published"  |  projectId: "client_acme"
source: "sanity"      |  type: "document.updated"  |  projectId: "client_acme"

Headless CMS platforms without native Burrow plugins — Contentful, Sanity, Strapi, Directus. Send content lifecycle events through the API so content publishes appear in the same timeline as deploys and form submissions.

Scheduled task outcomes

source: "scheduler"  |  type: "nightly_sync.completed"  |  projectId: "client_acme"
source: "scheduler"  |  type: "nightly_sync.failed"     |  projectId: "client_acme"

Cron jobs, scheduled data syncs, nightly report generation, database maintenance tasks. When the nightly sync that feeds the client’s dashboard fails silently, the event (or absence of it) is visible in Burrow. Scout monitors expected patterns and flags when scheduled events don’t fire on time.

Internal tool activity

source: "admin-panel"  |  type: "config.updated"   |  projectId: "client_acme"
source: "admin-panel"  |  type: "feature.toggled"   |  projectId: "client_acme"

Configuration changes, feature flag toggles, admin panel actions — anything that could affect the client’s production environment. When a feature toggle coincides with a conversion drop, the correlation is visible.

SDKs and API

PHP SDK — For WordPress plugins, Laravel applications, and any PHP backend:

$burrow->event([
    'source' => 'membership-api',
    'type'   => 'user.registered',
    'projectId' => 'client_acme',
    'payload' => ['plan' => 'premium'],
]);

TypeScript SDK — For Node.js applications, serverless functions, and Next.js API routes:

await burrow.event({
  source: 'membership-api',
  type: 'user.registered',
  projectId: 'client_acme',
  payload: { plan: 'premium' },
});

REST API — For any language or system that can make an HTTP POST. cURL, Python, Ruby, Go, Rust — if it speaks HTTP, it can send events to Burrow.

Custom events are first-class events

Custom events aren’t second-class citizens in Burrow. They participate in everything built-in events do:

  • Timeline: Custom events appear chronologically alongside WordPress, Shopify, GitHub, and Stripe events
  • Digests: Include custom event summaries in automated monthly reports
  • Portals: Custom events are visible in read-only client portals
  • Scout: Anomaly detection monitors custom event volume and patterns
  • Correlation: A custom API health check failure next to a GitHub deploy tells the same story as a built-in monitoring alert

The event model is the same. The timeline is the same. The reporting is the same. The only difference is who sent the event — a built-in plugin or your code.

Agency operations | All channels | See all integrations

Frequently asked questions

What is a custom channel in Burrow?
A custom channel is any event category you define yourself. While Burrow's 9 built-in channels cover common agency signals (code, forms, ecommerce, etc.), custom channels let you send events from any system — proprietary applications, internal tools, custom CMS platforms, CI/CD pipelines — using your own naming conventions.
How do I send events to a custom channel?
Use the Burrow REST API (any HTTP POST) or the PHP/TypeScript SDKs. Every event uses the standard envelope: source, type, projectId, and payload. The source and type determine the channel. If the event doesn't match a built-in channel, it creates or routes to a custom channel automatically.
What can I send through the API?
Any JSON payload that follows the Burrow event envelope. Common examples: custom CMS content publishes, application health checks, CI/CD pipeline results, data sync completions, user registration events, scheduled task outcomes, and internal tool activity.
Do custom events appear in the same timeline as built-in channels?
Yes. Custom events land in the same client project timeline as WordPress form submissions, GitHub deploys, Shopify orders, and Stripe billing. They participate in automated digests, portal views, and Scout anomaly detection identically to built-in events.
Is there a limit to how many custom channels I can create?
Custom channels are created by the events you send — there's no predefined limit on channel names or event types. Send events with any source and type combination that makes sense for your workflow.
Can Scout monitor custom events?
Yes. Scout monitors volume patterns, anomalies, and temporal patterns across all events — including custom ones. If your nightly data sync usually completes by 3am and hasn't fired by 6am, Scout can flag it.
What SDKs are available?
Burrow provides PHP and TypeScript SDKs for sending events. Both support the full event envelope with typed helpers. For other languages, the REST API accepts standard JSON payloads from any HTTP client.

Your agency's work deserves to be seen.

We're onboarding agencies in small cohorts to keep the quality high. Request early access and we'll be in touch.

Self-funded · Independent · Built for the long term