Integration category · 06

Build what isn't listed.

Everything Flockr exposes through native integrations is also available as primitives: webhooks for real-time events, GraphQL and REST APIs for on-demand queries, partitioned Parquet for bulk export. Build your own integration with anything that speaks HTTP. The capability surface is the same; only the destination changes.

Source
Flockr signal layer
GraphQL · REST On-demand queries
s3://…/parquet Bulk export
Destination
Your integration
What it covers

What "custom & developer" means here.

Custom and developer integrations exist for everything Flockr's native connectors don't cover — tools the customer's team has built themselves, platforms not in the standard list, internal systems that need Flockr data alongside other inputs, or bespoke workflows that combine signal events with custom logic.

The capability is the same as the native integrations; what changes is that the customer's engineering team builds the destination rather than installing it. Three access patterns cover every case.

Webhooks GraphQL REST Parquet on S3
Patterns

Three access patterns. Every custom integration uses one.

The framing is access shape — how your code gets data from Flockr. Three independent patterns that cover every custom integration. Pick the one that matches your use case.

#02 Query

GraphQL and REST APIs.

GraphQL and REST APIs for on-demand data retrieval. Cohort membership, signal state for a product, the full Flockr context for a visitor. The right pattern when your code needs Flockr data at a specific moment — page render, checkout decision, customer-service lookup.

Suits back-end services, on-demand personalisation, custom decisioning logic.
#03 Export

Bulk Parquet export.

Bulk Parquet export to object storage on a configurable schedule. Cohort membership tables, signal snapshots, event-level streams. The right pattern for analytical workloads, custom reverse-ETL pipelines, or feeding Flockr data into systems that prefer batch ingestion.

Suits bespoke data pipelines, custom warehouse architectures, ML training datasets.
The mechanism

The shape of each access pattern.

Each pattern is a standard interface — no proprietary protocols, no custom client libraries required. Implementation detail lives in the developer documentation; the panels below describe what to expect.

Standards-based primitives. CloudEvents 1.0 envelopes for webhooks. OAuth 2.0 client credentials for APIs. Parquet on S3 for bulk export. Nothing your team hasn't seen before.
Webhooks

HTTP POST to your registered endpoint.

CloudEvents 1.0 envelope, JSON body with documented schema per event type. HMAC-SHA256 signature in a header for verification. Automatic retries on 5xx responses with exponential backoff. Idempotency keys for de-duplication.

# Headers X-Flockr-Signature: sha256=… X-Flockr-Event-Id: evt_R3k… Content-Type: application/cloudevents+json
Webhook registration in the Flockr portal. Per-endpoint secrets for signature verification. Documented event types with versioned schemas.
GraphQL · REST

Typed queries with field selection.

GraphQL endpoint for typed queries with field selection. REST endpoints for simpler scripting use cases — both cover the same surface area. Bearer-token authentication, standard OAuth 2.0 client credentials flow for service-to-service auth.

# GraphQL query query { visitor(id: "flockr_vid_…") { cohorts { id, name, enteredAt } signals { family, value } } }
Self-describing schema introspection on GraphQL. OpenAPI specification for REST. Both versioned with explicit deprecation timelines.
Parquet export

Partitioned files to your S3.

Partitioned Parquet files written to S3 on a configurable schedule. Per-client buckets with cross-account access via assume-role. Snappy-compressed, partitioned by date for efficient pruning. Schema versioned and additive — new fields appear without breaking existing readers.

# Partition layout s3://flockr-export/ client_id=acme/ dataset=cohort_membership/ year=2026/month=05/day=11/
Standard format consumable by every modern data tool. Optional cross-region replication for compliance requirements.
Use cases

What customers build.

Custom integrations don't have named platforms — they have use cases. Six examples of what customers have built or could build with the three primitives above.

02

Custom mobile app feeds.

Native iOS and Android apps consuming Flockr's API for product-state context — scarcity, momentum, lifecycle stage — to render demand-aware content in app surfaces. Valuable for retailers whose native app team operates independently.

Uses Query (GraphQL/REST)
03

Bespoke reverse-ETL pipelines.

Custom data-engineering pipelines reading Flockr's Parquet exports and pushing to destinations Hightouch and Census don't cover — legacy systems, regional ad platforms, internal data products. The customer's data team owns the pipeline.

Uses Export (Parquet)
05

Bespoke personalisation logic.

Custom decisioning code calling Flockr's GraphQL API at page render time to fetch the visitor's current cohort context, then choosing content, recommendations, or offers based on logic the customer's team owns. The right pattern when off-the-shelf tools fall short.

Uses Query (GraphQL)
06

Custom platform integrations.

One-off integrations with platforms not in Flockr's native list — bespoke POS systems, legacy email tools, regional commerce platforms, proprietary loyalty engines. Same webhook-and-API pattern as Flockr's native integrations, implemented by the customer's team.

Uses Subscribe + Query

Building something not listed here? The capability surface is documented; what customers build with it is up to them.Get in touch if you want to discuss the integration shape before starting →

Worked example

High-value cart abandonment alerts in Slack.

A retailer wants their CX team to see real-time alerts in Slack whenever a high-value cart abandonment happens, so they can reach out personally to recover the order. They build a small webhook handler that subscribes to Flockr's high_value_cart_abandoner cohort and posts to a Slack channel.

About 50 lines of code

The webhook contract, signing semantics, and event schema are documented; the customer's team owns the handler, the identity resolution, and the destination logic. Flockr's responsibility ends at the webhook delivery.

Stage 01
1

Register the webhook.

In the Flockr portal, register a webhook destination pointing to the customer's handler URL. Subscribe to the cohort.entered event type, filtered to the high_value_cart_abandoner cohort. Copy the per-endpoint signing secret to the handler's environment.

Portal · webhook registration
endpoint: https://your-handler.example.com/flockr events: ["cohort.entered"] filter: cohort_id = "high_value_cart_abandoner" secret: whsec_***************** # copy to env
Stage 02
2

Receive and verify.

The handler receives Flockr's POST. Verify the HMAC signature against the configured secret. Reject if it doesn't match. Parse the JSON body — CloudEvents envelope, with cohort entry details in data.

handler.ts · signature verification
const sig = req.headers["x-flockr-signature"]; const expected = hmacSha256(req.rawBody, secret); if (sig !== `sha256=${expected}`) { return res.status(401).end(); } const event = JSON.parse(req.rawBody);
Stage 03
3

Build the message.

The handler reads the event properties: cart_total_value, cart_product_ids, flockr_vid. It looks up the visitor's customer record (via the customer's own identity table; see the note below) to get a name and email if available, then builds a Slack message with cart details and a link to the customer admin page.

handler.ts · message construction
const { cart_total_value, flockr_vid } = event.data; const customer = await lookupCustomer(flockr_vid); const message = { text: `High-value abandonment: £${cart_total_value}`, attachments: [{ title: customer?.name ?? "Anonymous", title_link: `${ADMIN_URL}/customers/${flockr_vid}` }] };
Stage 04
4

Post to Slack.

The handler posts to the configured Slack incoming webhook URL. The CX team sees the alert within seconds of cohort entry. They click through to the admin, review the cart, and reach out to the customer directly.

handler.ts · post to Slack
await fetch(SLACK_WEBHOOK_URL, { method: "POST", headers: { "content-type": "application/json" }, body: JSON.stringify(message) }); res.status(200).end(); # ack back to Flockr

The webhook contract, signing semantics, and event schema are documented. The customer's team owns the handler, the identity resolution, and the destination logic. Flockr's responsibility ends at the webhook delivery — what happens next is custom code in the customer's environment.

A note · Identity

On identity resolution in custom integrations.

Flockr's primitives identify visitors by flockr_vidan anonymous browser-scope identifier. For custom integrations that need to map Flockr signals to identified customers (email, phone, account ID), the resolution happens on the customer side. Most teams maintain a small identity table populated when their tag captures the resolution event — login, signup, checkout, email click — and joined at the moment the custom integration needs it.

The same applies in reverse. Custom integrations that need to push customer-identified data back into Flockr should pass identifiers the customer holds (external_id is a standard field on Flockr's APIs for this), keeping Flockr's analytics pipeline free of PII. The two-tier privacy posture from the integrations hub page applies — Flockr's pipeline stays PII-free, the custom integration handles identity resolution in the customer's environment under a DPA scoped to the integration shape.

Build what isn't listed.

The developer documentation covers schemas, endpoint references, example payloads, and SDK availability. If you want to discuss the integration shape before starting, get in touch.