IntegrationsCDPRudderStack

RudderStack

If you already have a CDP, Signal can be its first-party collector. This integration forwards events from Signal into your existing RudderStack data plane so RudderStack’s destination fan-out continues unchanged, while Signal replaces the browser SDK with a first-party server-side collector on your own domain.

Signal is not a replacement for RudderStack. RudderStack remains your downstream activation and routing layer; Signal sits in front of it as the upstream first-party collector. Use this integration if you already run RudderStack and want first-party collection without disturbing existing destinations.

Prerequisites

  • A RudderStack workspace.
  • An HTTP source configured in that workspace.
  • The data plane URL for your workspace.
  • A source write key.

Get your credentials

Find your data plane URL

In the RudderStack dashboard, open Sources and select your HTTP source. The setup instructions panel lists the data plane URL — for example https://yourcompany.dataplane.rudderstack.com. Copy it.

Copy your write key

On the same source page, copy the Write Key. This is a secret — treat it like a password.

Confirm the source is enabled

Make sure the source is enabled in the RudderStack dashboard. If the source is paused, RudderStack will accept events at the HTTP API but they will not flow to downstream destinations.

Configure in Signal

Configuration fields

FieldRequiredDescription
data_plane_urlYesYour RudderStack data plane URL (e.g. https://yourcompany.dataplane.rudderstack.com).
write_keyYesThe HTTP source write key. Stored as a secret.

Management UI setup

  1. Go to Integrations > Add Integration > RudderStack.
  2. Enter your data_plane_url and write_key.
  3. Select the General preset.
  4. Choose consent categories (default: analytics).
  5. Save and enable.

Management API setup

curl -X POST https://api.example.com/v1/admin/integrations \
  -H "Authorization: Bearer YOUR_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "source_id": "src_abc123",
    "vendor": "rudderstack",
    "name": "RudderStack Production",
    "enabled": true,
    "config": {
      "data_plane_url": "https://yourcompany.dataplane.rudderstack.com",
      "write_key": "your_write_key"
    },
    "consent_categories": ["analytics"]
  }'

API endpoint

POST {data_plane_url}/v1/track
Authorization: Basic {base64(write_key:)}

Other RudderStack event types route to the same data plane on their canonical paths (/v1/identify, /v1/page, /v1/group). The default Signal preset targets /v1/track; pipelines can override the path per event type if needed.

Event mapping

Signal’s canonical event model is Segment-compatible, so RudderStack delivery is a near-pure pass-through.

Signal eventRudderStack eventEndpoint path
pagepage/v1/page
identifyidentify/v1/identify
groupgroup/v1/group
Order Completed (or any track event)Order Completed (name preserved)/v1/track

Properties pass through to the RudderStack properties object. Traits set via datafly.identify() pass through to traits.

Example: Order Completed

Signal call:

datafly.track("Order Completed", {
  order_id: "ORD-001",
  total: 129.99,
  currency: "USD",
  products: [
    { product_id: "SKU-A", name: "Widget", price: 49.99, quantity: 2 }
  ]
});

Payload sent to RudderStack:

{
  "type": "track",
  "event": "Order Completed",
  "anonymousId": "anon_a1b2c3",
  "userId": "user_42",
  "messageId": "evt_abc123",
  "timestamp": "2026-05-12T10:00:00.000Z",
  "context": {
    "ip": "203.0.113.50",
    "userAgent": "Mozilla/5.0 ...",
    "page": { "url": "https://example.com/checkout/confirmation" },
    "library": { "name": "datafly.js", "version": "1.0.0" }
  },
  "properties": {
    "order_id": "ORD-001",
    "total": 129.99,
    "currency": "USD",
    "products": [
      { "product_id": "SKU-A", "name": "Widget", "price": 49.99, "quantity": 2 }
    ]
  }
}

Identity

Signal fieldRudderStack field
anonymous_idanonymousId
user_iduserId
event_idmessageId
context.ipcontext.ip
context.user_agentcontext.userAgent
context.pagecontext.page
context.campaigncontext.campaign
context.librarycontext.library

Signal generates a stable first-party anonymous_id and forwards it to RudderStack as anonymousId. When datafly.identify() is called, the same userId arrives at RudderStack on subsequent events.

The default consent category for this integration is analytics. Events are only forwarded when the visitor has granted analytics consent.

Override the category list in the integration config if you need to gate delivery on a different category (for example advertising for marketing-focused RudderStack workspaces).

Verify

Trigger an event

Visit a page on your site with Signal and a test integration enabled, or call:

datafly.track("Test Event", { source: "signal-verify" });

Check Live Events in RudderStack

In RudderStack, open Sources > your HTTP source > Live Events. The event should appear within seconds. Confirm:

  • event name matches what Signal sent
  • anonymousId is populated
  • properties contains the expected payload

Confirm downstream delivery

Open one of your downstream destinations connected to the source. Confirm the event reached the destination — this validates that Signal-collected events fan out exactly as RudderStack’s own SDK-collected events do.

Troubleshooting

ProblemSolution
401 from RudderStackWrite key is wrong, revoked, or attached to a different source. Regenerate and update the integration config.
404 from RudderStackThe data_plane_url is wrong. Check the source setup panel in RudderStack and confirm the URL exactly.
Events accepted but not visible in Live EventsThe HTTP source is paused. Re-enable it in the RudderStack dashboard.
Events appear in RudderStack but not in a destinationIssue is downstream of Signal — check the destination configuration and transformation in the RudderStack dashboard.
userId is missingdatafly.identify() has not yet been called for the visitor. Verify identify is wired into your login / form-submit flow.

See also