# Make

> Send records from any of Make's apps to Dimension Labs with a scenario and the universal API, without running your own server.

Make connects to thousands of apps ([Make's integrations page](https://www.make.com/en/integrations) lists 3,500+ as of 2026-10-26). If a tool you use has a Make module that watches for new records, such as a new form response, review, ticket or spreadsheet row, a scenario can send each new record to the [universal API](/api/tracker). There's no server to run: Make runs the scenario on its schedule.

Make fits sources where one trigger event is one piece of customer text: a form or survey response, a review, a feedback submission, the first message of a ticket. For full multi-message conversations, or to load history, use the app's own guide or [Any other system](/integrations/other-sources), which pull every message in order.

## What you need

- A Make account.
- A Make trigger module for your app that returns the customer's text and a date.
- A Dimension Labs API key for a new **Universal API** source. See [Your API key](/api/tracker#your-api-key).

## 1. Choose the trigger

1. In the scenario editor, add the trigger module for your app, for example a module that watches new responses, new reviews or new rows.
2. Run it once and check the output has three things: the customer's text, an id for the record, and when it was written.

Use one source in Dimension Labs per app, so its data is easy to filter later.

## 2. Add the HTTP module

Make's own reference is [HTTP: Make a request](https://apps.make.com/http).

1. Add a module after the trigger, search for **HTTP**, and choose **Make a request**. Use the current HTTP app (Version 4), not **HTTP (legacy)**.
2. Set **Authentication type** to **No authentication**. The API key goes in the query string below.
3. Set **Method** to **POST**.
4. In **URL**, enter the address below. The part in braces picks the endpoint: a record written more than an hour ago goes to `/trackhistorical`, as every guide does. Replace `1.writtenAt` with your trigger's date field (click into the formula and pick it from the trigger's output).

```
https://tracker.dimensionlabs.io/{{if(formatDate(1.writtenAt; "x") < formatDate(addHours(now; -1); "x"); "trackhistorical"; "track")}}
```

5. Under **Query parameters**, add these four:

| Name | Value |
|---|---|
| `platform` | `universal` |
| `v` | `11.1.0-rest` |
| `type` | `incoming` |
| `apiKey` | your Dimension Labs API key |

6. Set **Body content type** to **application/JSON**. Make sets the `Content-Type` header from this field, so don't add it under **Headers**.

## 3. Build the message

Set **Body input method** to **Data structure**, not **JSON string**. With a data structure, Make escapes quotes and line breaks in each value for you. With **JSON string** you must escape them yourself, and a review with a quotation mark in it would break the request.

1. Next to the data structure field, add a new data structure and open the generator. Paste this sample and generate:

```json
{
  "text": "Sample text",
  "userId": "jotform-123",
  "incoming": true,
  "sessionId": "jotform-123",
  "conversationId": "jotform-123",
  "dimensionlabs_timestamp": 1761487380000,
  "platformJson": { "source": "jotform", "rating": 4 }
}
```

2. Check the generated types: `incoming` is a Boolean, `dimensionlabs_timestamp` a Number, `platformJson` a Collection. Add or remove `platformJson` items to keep the fields you want to filter or join on later (a rating, a location id, a form name).
3. Map each field from your trigger:

| Field | Map it to | Notes |
|---|---|---|
| `text` | the customer's words | A review, an answer, a message. |
| `sessionId` | `jotform-` followed by `replace(record id; ":"; "-")` | The record's own id: response id, review id, ticket id. `replace` turns any colon into a dash, because ids can't contain colons. |
| `conversationId` | the same as `sessionId` | |
| `userId` | `ifempty(customer id; session id)` | Your internal customer id if the trigger has one, otherwise the `sessionId`. Never an email address or name. |
| `incoming` | `true` | Everything here is the customer's own words. |
| `dimensionlabs_timestamp` | `parseNumber(formatDate(1.writtenAt; "x"); ".")` | `x` is Make's token for Unix milliseconds ([formatting tokens](https://help.make.com/tokens-for-datetime-formatting)). |
| `platformJson.source` | the app's name, typed as text | For example `jotform`. |

If your trigger gives the date as text rather than a date, convert it first with `parseDate` ([date and time functions](https://help.make.com/date-and-time-functions)).

## 4. Skip empty text

Click the line between the trigger and the HTTP module and set up a filter ([Filtering](https://help.make.com/filtering)): condition on the trigger's text field, operator **Exists**. Records with no text stop there.

Click **Run once**. A `200` status in the HTTP module's output means the message reached Dimension Labs. In the module's advanced settings, set **Return error if HTTP request fails** to **Yes** so a rejected message shows as an error, not a success.

## 5. Turn it on

- **Turn the scenario on** and set its schedule. Each new record is sent as Make picks it up, to `/track`, and is enriched automatically every day.
- **If Make sees a record late** (more than an hour after it was written, for example on a slow schedule), the URL sends it to `/trackhistorical`. Run a [backfill](/dimensions/backfill) from the **Backfill** tab to enrich those.
- **History:** a scenario only sees new records. Export your history from the app and [upload a file](/data/upload-a-file) (check it with the [file checker](/data/check-a-file)), then run a backfill.
- **Re-runs are safe:** if Make replays a run, duplicates are removed automatically.

**Personal data.** Don't map email addresses, names or phone numbers into any field: everything in `platformJson` is kept as metadata. Redact the text if customers include personal details. See [PII redaction](/data/pii-redaction).

## A record with several messages

If the trigger returns a whole conversation (a ticket with replies, a chat transcript), each message needs its own `POST`, in order, at least one second apart, with replies from your side marked `incoming: false` and `type=outgoing`. That is easier and more reliable in a script: see the app's guide, or [Any other system](/integrations/other-sources).

## Make reference

- [Make integrations](https://www.make.com/en/integrations)
- [HTTP: Make a request](https://apps.make.com/http)
- [Date and time functions](https://help.make.com/date-and-time-functions)
- [Tokens for date/time formatting](https://help.make.com/tokens-for-datetime-formatting)
- [General functions](https://help.make.com/general-functions)
- [Filtering](https://help.make.com/filtering)

Checked against Make's documentation on 2026-10-26.
