- Create a reusable HTTP Request destination that points at the Novu API
- Sync rows from a Hightouch model into Novu subscribers
- Trigger notification workflows in Novu from a Hightouch events model
- Configure retries and rate limits for reliable delivery
Before you start, ensure you have:
- A Hightouch account with a connected source (a warehouse or database such as Snowflake, BigQuery, or Postgres) and permission to create destinations and syncs
- At least one model in Hightouch that returns the rows you want to sync (for example, a table of users)
- A Novu account with an API key (find this in your Novu dashboard under Settings > API Keys)
Hightouch is a reverse ETL platform. Instead of running code on each event like Segment Destination Functions, Hightouch queries a model on a schedule and sends an HTTP request for each row that is added, changed, or removed. You map those row changes to Novu API calls.
1
Create the HTTP Request destination
Create one destination per service and reuse it across syncs.- Go to the Destinations overview page and click Add destination
- Select HTTP Request and click Continue
- Enter the Base URL for the Novu API:
- US (default):
https://api.novu.co - EU:
https://eu.api.novu.co
- US (default):
- Under HTTP headers, add the following headers. Mark the
Authorizationvalue as Secret so it is encrypted and hidden in the UI:
- Leave the certificate options off unless your setup requires them, then click Continue
- Give the destination a descriptive name, such as
HTTP Request - Novu API, and save
2
Sync a model into Novu subscribers
This sync keeps Novu subscribers in step with the users in your warehouse. Use one request shape for both new and updated rows:POST /v2/subscribers creates a subscriber when the subscriberId is new and updates it when it already exists.Assume your model returns one row per user with columns like this:- Go to the Syncs overview page and click Add sync
- Select your users model and the Novu HTTP Request destination
- Under request triggers, enable Rows added and Rows changed
- Configure both triggers the same way:
- HTTP method:
POST - URL:
/v2/subscribers - Payload type: JSON
- Define JSON payload:
Explanation
Explanation
- Map
subscriberIdto a stable warehouse column that never changes. Novu uses it as the recipient identifier. POST /v2/subscribersis idempotent for a givensubscriberId: the first request creates the subscriber, later requests update the same record.- Wrap every string value in double quotes inside the JSON payload. Leave numeric or boolean values unquoted.
- Use Hightouch’s Preview tab to confirm the rendered body before you save.
Optional: partial updates with PATCH
Optional: partial updates with PATCH
If you only want to send changed fields and not a full profile, configure Rows changed as:
- HTTP method:
PATCH - URL:
/v2/subscribers/{{ row.subscriber_id }} - Body with only the fields you want to update
POST upsert path above unless you specifically need partial updates. PATCH returns 404 if the subscriber does not exist yet.3
Trigger workflows from an events model
To trigger a Novu workflow, sync a model that returns one row per event you want to notify on. Keep this separate from the subscriber sync so you can schedule and backfill them independently.Novu can create a subscriber just in time when a workflow is triggered. A prior subscriber sync is useful for preferences and enrichment, but it is not required for triggers to succeed.A simple events model returns the target subscriber, the workflow to run, and the fields you need in the payload:- Create a new sync from your events model to the Novu destination
- Under request triggers, enable Rows added only, so each new event fires once
- Configure the trigger:
- HTTP method:
POST - URL:
/v1/events/trigger - Payload type: JSON
- Define JSON payload:
Explanation
Explanation
nameis the workflow identifier in Novu. Store it in a column so one sync can drive many workflows, or hard-code a static value like"welcome"if the model only feeds one workflow.to.subscriberIdaddresses the recipient. You can also pass profile fields such asemailorfirstNameinsidetoso Novu upserts them on trigger.- Build
payloadfrom typed columns in the Liquid template. Prefer this over injecting a pre-serialized JSON string from the warehouse, which can escape incorrectly when the column is stored as text.
4
Configure reliability and run the sync
Before your first run, set rate limits and error handling so you stay within Novu’s limits and recover cleanly from transient failures.- Rate limiting and concurrency: Hightouch defaults to 1000 requests per second. Novu’s Free plan allows 20 RPS for subscriber and configuration endpoints and 60 RPS for event triggers. Higher plans raise those caps. See Rate limiting. Start below your plan’s limit (for example, 10 to 20 RPS for subscriber syncs and 30 to 60 RPS for triggers on Free), then raise the limit if your plan allows it.
- Error handling: Hightouch treats any
400or500level response as an error and can retry until the request succeeds. Retrying on the next sync run is appropriate for 429 and 5xx responses. Permanent client errors such as 400, 401, 404, and 422 usually mean a bad payload, key, or template. Fix those with the live debugger and alerts rather than relying on endless retries. - Initial sync behavior: decide how existing rows are handled on the first run. For a subscriber backfill, sync all rows. For workflow triggers, skip existing rows so you do not notify users about historical events.
- Set a schedule or run the sync manually, then click Run.
5
Verify the integration
1. Confirm subscribers
1. Confirm subscribers
After the subscriber sync completes, open the Subscribers list in your Novu dashboard and confirm the rows appear with the expected
subscriberId, name, email, and phone.2. Confirm workflow triggers
2. Confirm workflow triggers
After the events sync completes, open the Activity Feed in your Novu dashboard and confirm the workflow ran for the expected subscriber with the payload from your model.
Troubleshooting
Troubleshooting
- 401 Unauthorized: Check the
Authorizationheader on the destination. It must beApiKey YOUR_NOVU_API_KEY, and the key must match your Novu environment (Development or Production) and region. - Workflow not triggering: Confirm the value in
namematches an existing workflow identifier in Novu, the workflow is active, and you are using an API key from the same environment. - Invalid JSON payload: Make sure every string is wrapped in double quotes. Use Hightouch’s payload Preview against a sample row before running the sync.
- 429 Too Many Requests: Lower the rate limit and concurrency in the sync configuration to stay within your plan limits.
Additional notes
Additional notes
- One destination, many syncs: The Novu destination holds the base URL and credentials. Add a new sync for each endpoint you need rather than creating a second destination.
- Batching workflow triggers:
POST /v1/events/triggerexpects a single event. For batches, usePOST /v1/events/trigger/bulkwith aneventsarray. Bulk requests cost 100 rate-limit tokens each. Example Liquid body when batching is enabled:
- Region: EU accounts must use
https://eu.api.novu.co. A US API key will not authenticate against the EU host, and the reverse is also true.