Confluent Cloud
Deprecated. Confluent Cloud is Kafka: the Kafka integration writes to it with the same writer (SASL_SSL with PLAIN). Use the Kafka integration for new integrations. This integration is hidden from new installs; an integration already installed on it keeps its revision and keeps delivering. Nothing is removed.
Datafly Signal publishes first-party events to Confluent Cloud topics over the standard Kafka wire protocol with SASL/PLAIN authentication.
Why route Confluent Cloud through Datafly Signal
- The data lands in infrastructure you own. Signal writes to your Confluent Cloud directly from your own deployment. Datafly operates no intermediary and never holds a copy of your event data.
- Client IP and user agent are recorded as event context. Both come from the original visitor request rather than from your server, so geography and device analysis done in the warehouse reflects the actual visitor.
- Presets for eight verticals. General (the default: page, identify and the key cross-vertical events), Retail, Insurance, Travel, Media & Streaming, Publishing, B2B / SaaS and Automotive, each writing one named field per documented event property. Email, phone and names are written only as SHA-256 digests unless you deliberately change the installed blueprint.
- One consent decision governs every destination. Confluent Cloud is gated by the same consent state as the rest of your stack, so a withdrawal applies everywhere at once.
Prerequisites
Before configuring Confluent Cloud in Signal, you need a Confluent Cloud account with a Kafka cluster, a topic, and an API key pair.
Create a Confluent Cloud Account
- Sign up at confluent.io/confluent-cloud.
- Complete the onboarding wizard.
Create a Kafka Cluster
- In the Confluent Cloud console, go to Environments and select your environment (or create a new one).
- Click Add cluster.
- Choose a cluster type:
- Basic — multi-tenant, pay-as-you-go (suitable for development and low-volume production).
- Standard — single-tenant, higher throughput limits.
- Dedicated — fully isolated, custom configurations.
- Select a Cloud provider (AWS, GCP, or Azure) and Region.
- Click Launch cluster.
- Note the Bootstrap server address from the cluster settings (e.g.
pkc-abc123.us-east-1.aws.confluent.cloud:9092).
Create a Topic
- In your cluster, go to Topics > Create topic.
- Enter a Topic name (e.g.
datafly-events). - Set the number of Partitions (6 is a good default for moderate throughput).
- Configure Retention settings (default 7 days).
- Click Create with defaults or customise further.
Generate an API Key Pair
- In your cluster, go to API Keys (under Cluster settings or Data integration).
- Click Create key.
- Choose Global access or specify a service account.
- Click Create.
- Copy the API Key and API Secret immediately — the secret is only shown once.
Store the API secret securely. If you lose it, you must create a new key pair.
Configuration
| Field | Type | Required | Description |
|---|---|---|---|
bootstrap_servers | string | Yes | The cluster’s bootstrap server (for example pkc-abc123.eu-west-2.aws.confluent.cloud:9092). |
topic | string | Yes | The topic to produce to. Create it in Confluent Cloud first. |
security_protocol | select | Yes | SASL_SSL (Confluent Cloud requires TLS 1.2 and SASL). |
sasl_mechanism | select | Yes | PLAIN (an API key and secret). Confluent Cloud also offers OAUTHBEARER, which Signal does not support. |
sasl_username | string | Yes | The Confluent Cloud API key. |
sasl_password | secret | Yes | The Confluent Cloud API secret. |
Signal Setup
Quick Setup
- Navigate to Integrations in the sidebar.
- Open the Integration Library tab.
- Find Confluent Cloud or filter by Streaming.
- Click Install, select a variant if available, and fill in the required fields.
- Click Install Integration to create the integration with a ready-to-use default blueprint.
API Setup
curl -X POST http://localhost:8084/v1/admin/integration-catalog/confluent_cloud/install \
-H "Authorization: Bearer YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"name": "Confluent Cloud",
"variant": "default",
"config": {
"bootstrap_servers": "pkc-abc123.us-east-1.aws.confluent.cloud:9092",
"topic": "datafly-events",
"security_protocol": "SASL_SSL",
"sasl_mechanism": "PLAIN",
"sasl_username": "YOUR_API_KEY",
"sasl_password": "YOUR_API_SECRET"
},
"delivery_mode": "server_side"
}'What Signal writes
Confluent Cloud uses the same writer as the Apache Kafka integration. Each event is one message whose value is the Signal event as JSON:
| Field | Contents |
|---|---|
event, type | Event name (purchase, page, …) and type (track, page, identify, …). |
anonymous_id, user_id, device_id | Visitor identifiers (user_id and device_id only when set). |
message_id, event_id | Signal’s message ID (use it to deduplicate) and the client event ID. |
timestamp, sent_at, received_at | RFC 3339 UTC times: event, client send, Signal receipt. |
org_id, pipeline_id, vendor_type | Where the event came from and which destination type wrote it. |
context | The collected context as sent: ip, user_agent, locale, page, campaign, consent, geo, device, library, and any partner attributes. Written in full; the blueprint does not filter it (#1414). |
click_ids, collected_ids | Ad click IDs and ID-provider values, when present. |
properties | Only the fields the blueprint maps (below). |
Each event is one Kafka message:
- Key:
user_id, oranonymous_idwhen there is no user ID. The writer’s hash balancer maps a key to one partition, so one visitor’s events stay in order on one partition (an anonymous visitor’s events move to the user ID’s partition once they log in). - Headers:
datafly_message_id,datafly_event_type,datafly_event_name. - Timestamp: the event time.
- Producer settings:
acks=all, Snappy compression, batches of up to 100 messages or 50 ms per partition. - Delivery: at least once. A retry after a timeout can write a message twice; deduplicate on
message_id.
Only what the blueprint maps is written. The properties object holds the fields your installed blueprint maps and nothing else (the row contract): the global block under @root (copies of the envelope fields, UTM parameters, the analytics and marketing consent flags, and email_sha256, phone_sha256, first_name_sha256, last_name_sha256, name_sha256), and the event section’s fields at the top level (transaction_id, value, currency, items, …). Identify traits and client properties the blueprint does not map are never written. An event with no section in the blueprint still arrives, with the @root block only: add a section for any other event whose properties you need.
A purchase from an identified visitor, as written by the default (General) preset. The raw email, phone and name in the visitor’s identify traits are not in it; only their digests are. Empty context objects are trimmed here for brevity.
{
"anonymous_id": "anon-s1-7f3a",
"user_id": "crm-4711",
"event": "purchase",
"type": "track",
"properties": {
"@root": {
"anonymous_id": "anon-s1-7f3a",
"email_sha256": "86e0b9e56c17cc4d12387e1949b85053fbe73bc3ce5a1188713a9d300cc6133d",
"event_id": "evt-s1-2",
"event_name": "purchase",
"event_timestamp": "2026-09-23T09:30:02.000Z",
"event_type": "track",
"first_name_sha256": "81f8f6dde88365f3928796ec7aa53f72820b06db8664f5fe76a7eb13e24546a2",
"ip_address": "203.0.113.9",
"last_name_sha256": "4f887a0887ca68593c8acd4e83e0b6bc5f42cd5aff7d3a159041c84230ed1cf6",
"locale": "en-GB",
"message_id": "msg-s1-confluent_cloud-2",
"name_sha256": "ed37d99b1445238af3386f81a77a2caf3fffc0cd610be39b4f3ba53943dc66bf",
"page_url": "https://shop.example/checkout",
"phone_sha256": "a8acc3a90a7b4e4dc65e93db9240ed26523050ef754d63b75b5161de76781436",
"user_agent": "Mozilla/5.0 (Macintosh)",
"user_id": "crm-4711",
"utm_medium": "cpc",
"utm_source": "google"
},
"coupon": "AUTUMN10",
"currency": "GBP",
"items": [{ "item_id": "SKU-1", "item_name": "Trail shoe", "price": 80, "quantity": 1 }],
"shipping": 4.5,
"tax": 14.08,
"transaction_id": "SIG-ORDER-1001",
"value": 84.5
},
"context": {
"ip": "203.0.113.9",
"user_agent": "Mozilla/5.0 (Macintosh)",
"locale": "en-GB",
"page": { "url": "https://shop.example/checkout", "title": "Checkout", "path": "/checkout" },
"campaign": { "source": "google", "medium": "cpc" }
},
"timestamp": "2026-09-23T09:30:02Z",
"sent_at": "2026-09-23T09:30:02Z",
"message_id": "msg-s1-confluent_cloud-2",
"org_id": "org-s1",
"pipeline_id": "pl-s1",
"received_at": "2026-09-23T09:30:02Z",
"event_id": "evt-s1-2",
"vendor_type": "confluent_cloud"
}The message layout on this page was produced by Signal’s Kafka (confluent_cloud) writer against an Apache Kafka 3.9 broker (the same protocol; TLS and SASL/PLAIN are what Confluent Cloud adds) on 2026-09-23 (batch S1 review), not written from memory.
Stored event context
Alongside the fields your blueprint maps (where email, phone, names and address are stored as normalised SHA-256 by default), each message carries the event’s collected context exactly as Signal received it. The blueprint does not filter or hash the context: this is deliberate (decision 2026-09-23), so the context is complete for attribution, fraud and debugging queries, and it is listed here so you can decide what to keep.
| Stored | What it contains |
|---|---|
| Visitor request | IP address, user agent, Accept-Language, locale and timezone |
| Page | URL including its query string, path, title and referrer |
| Campaign | UTM source, medium, campaign, term and content |
| Consent | The visitor’s consent state |
| Location | GeoIP country, region and city, and the network (ASN) |
| Device | Screen size; for app events the OS and version, manufacturer, model, advertising ID and IDFV when the app collected them |
| Vendor IDs | Cookie and click identifiers in vendor_ids (for example the _fbp browser ID, gclid, ttclid, the GA client ID) |
| Session and library | Session ID, number and engagement time; the collector’s name and version |
| Partner attributes | Profile attributes from partner enrichment (partner_attrs) |
Each message is the event JSON: context, click_ids and collected_ids, and the anonymous_id, user_id, device_id, message_id and event_id identifiers, sit beside the mapped properties.
The IP address, device and advertising IDs, and cookie and click identifiers are personal data under UK and EU GDPR. To keep any of them out of storage, strip, mask or hash the field for every integration with the organisation data layer, apply URL redaction to page URLs, or remove it in the installed blueprint; and set the storage’s retention to match your privacy notice. See Personal data by integration.
Consent
The integration’s consent category in Signal decides which events reach Confluent Cloud; events that fail it are never written. Every message also carries the visitor’s consent state (context.consent, and consent_analytics / consent_marketing in @root) so downstream consumers can apply their own rules.
Testing
- Enable the integration in Signal and trigger a test event on your website.
- In the Confluent Cloud console, go to your cluster > Topics > your topic.
- Click Messages to view recently produced messages.
- Inspect the message value to verify the event data.
- In Signal, check the Live Events view to confirm delivery status shows as successful.
Troubleshooting
| Problem | Solution |
|---|---|
| Events not appearing in the topic | Verify the bootstrap server address and topic name are correct. |
| Authentication failure | The API key or secret is incorrect. Verify the credentials. Generate a new key pair if needed. |
TopicAuthorizationException | The API key lacks produce permission on the topic. Create a new key with appropriate ACLs or use a global access key. |
UnknownTopicOrPartition | The topic does not exist. Verify the topic name in the Confluent Cloud console. |
| Connection timeout | Ensure Signal can reach the bootstrap server on port 9092. Check any firewall or network policies. |
MessageSizeTooLarge | Individual messages exceed the topic’s max message size (default 1 MB). Check event payload size. |
| API key expired or revoked | Generate a new API key pair in the Confluent Cloud console. |
Visit Confluent Cloud documentation for full API reference, Schema Registry setup, and connector configuration.