Integration sources and mapping
How popular sources (Zapier, Make, Tally, Typeform, SendGrid, Stripe) send data and how to map them to your tables.
Browse docs
How popular sources (Zapier, Make, Tally, Typeform, SendGrid, Stripe) send data and how to map them to your tables.
This guide explains how popular integration sources send data and how to map their payloads to your Brandow Storage tables. Use it when setting up webhooks, Zapier, Make, form tools, and other external systems.
Brandow integrations accept flat JSON via POST to your webhook URL:
{
"email": "alice@example.com",
"name": "Alice Smith",
"company": "Acme Inc",
"message": "Interested in your product"
}
You configure field mapping in the integration editor: each incoming key (e.g. email) maps to a table column. The system writes the payload values into the corresponding columns and creates a new row.
Important: Brandow expects a flat object. Nested structures (arrays of objects, deeply nested fields) must be flattened before sending, or routed through an automation tool that does the transformation.
When editing a webhook integration, you can enable an email trigger. Each webhook call will create a pending email from a chosen template. Use {{key}} in your template's subject and body for values from the payload (e.g. {{magic_link}}, {{user_name}}).
Example payload:
{
"email": "user@example.com",
"user_name": "Alice",
"magic_link": "https://app.example.com/login?token=abc123"
}
Template body: Hi {{user_name}}, click here to sign in: {{magic_link}}
Configure in the integration editor: select a template, set the payload key for recipient email (default email), and optionally enable "Email only" to skip creating a table row.
How it sends data: You define the payload in your Zap. Zapier sends whatever you map from the trigger app into the "Webhooks by Zapier" action.
Payload shape: Flat JSON. You choose the keys and values.
Example mapping:
| Incoming key (Zapier) | Table column |
|-----------------------|--------------|
| email | Email |
| first_name | First Name |
| last_name | Last Name |
| company | Company |
| created_at | Submitted At |
Setup steps:
Zapier best practices:
2024-01-15T14:30:00Z.true/false for booleans, not 1/0.first_name and last_name for easier column mapping.How it sends data: You build a scenario that sends HTTP requests to your webhook. The payload is whatever you define in the HTTP module.
Payload shape: Flat JSON. You choose the keys and values.
Example mapping:
| Incoming key (Make) | Table column |
|--------------------|--------------|
| email | Email |
| name | Full Name |
| phone | Phone |
| source | Lead Source |
| timestamp | Submitted At |
Setup steps:
For nested sources (Tally, Typeform): Use Make's mapper to extract values from nested fields. For example, from Tally's data.fields array, use an iterator to build a flat object, then send that to Brandow.
How it sends data: Tally sends a JSON payload with eventType, data, and data.fields (array of field objects).
Payload shape: Nested. Each field has key, label, type, and value.
Example Tally payload:
{
"eventId": "a4cb511e-d513-4fa5-baee-b815d718dfd1",
"eventType": "FORM_RESPONSE",
"data": {
"responseId": "2wgx4n",
"formName": "Contact form",
"fields": [
{ "key": "question_3EKz4n", "label": "Name", "type": "INPUT_TEXT", "value": "Alice" },
{ "key": "question_w4Q4Xn", "label": "Email", "type": "INPUT_EMAIL", "value": "alice@example.com" },
{ "key": "question_3Nrpl3", "label": "Message", "type": "TEXTAREA", "value": "Hello" }
]
}
}
Direct mapping (Brandow expects flat): Brandow does not auto-flatten nested payloads. Use one of these approaches:
Option A – Zapier/Make:
data.fields (e.g. by label or key).Option B – Map by label:
If you use Make, you can map each field by label:
| Tally field label | Incoming key (after Make transform) | Table column |
|-------------------|-------------------------------------|--------------|
| Name | name | Name |
| Email | email | Email |
| Message | message | Message |
Tally field keys: Each field has a key (e.g. question_3EKz4n) and a label (e.g. "Name"). Use label for readability when building your flat payload in Make.
How it sends data: Typeform sends JSON with form_response, answers (array), and nested definition for field metadata.
Payload shape: Nested. Answers are in form_response.answers; each has field, type, and answer (or nested structures).
Example:
{
"event_type": "form_response",
"form_response": {
"answers": [
{ "field": { "id": "abc123", "title": "Email" }, "type": "email", "text": "alice@example.com" },
{ "field": { "id": "def456", "title": "Name" }, "type": "text", "text": "Alice" }
]
}
}
Direct mapping: Brandow expects flat JSON. Use Zapier or Make to:
form_response.answers into a flat object (e.g. by field.title → key).Example mapping after transformation:
| Typeform field title | Incoming key | Table column |
|----------------------|--------------|--------------|
| Email | email | Email |
| Name | name | Name |
How it sends data: SendGrid Inbound Parse receives emails and POSTs them as multipart/form-data, not JSON.
Payload fields (form-data):
| Field | Description |
|-------------|--------------------------------|
| from | Sender email |
| to | Recipient email |
| subject | Email subject |
| text | Plain text body |
| html | HTML body |
| envelope | JSON string with envelope data |
| cc | CC recipients (if present) |
Direct mapping: Brandow expects JSON. SendGrid sends form-data, so you need a bridge:
Option A – Zapier/Make:
Option B – Email integration:
When Brandow supports email ingestion, configure it for inbound email and map from, subject, text directly.
Example mapping (after conversion to JSON):
| Incoming key | Table column |
|--------------|--------------|
| from | Sender Email |
| subject | Subject |
| text | Body |
| to | Recipient |
How it sends data: Stripe sends webhook events as JSON with type, data.object, and nested resource objects.
Payload shape: Event wrapper with data.object containing the full resource (e.g. customer, invoice, payment).
Example (simplified):
{
"id": "evt_xxx",
"type": "customer.created",
"data": {
"object": {
"id": "cus_xxx",
"email": "alice@example.com",
"name": "Alice Smith"
}
}
}
Direct mapping: Brandow expects flat JSON. Use Zapier or Make to:
customer.created, invoice.paid).data.object and flatten the fields you need.Example mapping for customer.created:
| Incoming key (from Stripe) | Table column |
|----------------------------|--------------|
| email | Email |
| name | Customer Name|
| id | Stripe ID |
How it sends data: You control the payload. Send flat JSON directly.
Example request:
curl -X POST "https://your-app.com/api/integrations/webhook?token=YOUR_TOKEN" \
-H "Content-Type: application/json" \
-d '{"email":"lead@example.com","name":"John","source":"website"}'
Example mapping:
| Incoming key | Table column |
|--------------|--------------|
| email | Email |
| name | Name |
| source | Source |
Best practices:
| Source | Payload shape | Flatten needed? |
|------------------|-----------------------|------------------|
| Zapier | Flat (you define) | No |
| Make | Flat (you define) | No |
| Tally | Nested (data.fields)| Yes (Zapier/Make)|
| Typeform | Nested (answers) | Yes (Zapier/Make)|
| SendGrid Inbound | Multipart form-data | Yes (JSON bridge)|
| Stripe | Nested (data.object)| Yes (Zapier/Make)|
| Custom API | Flat (you define) | No |
?token=YOUR_TOKEN.?token=YOUR_TOKEN.email, first_name, company).email → Email column, first_name → First Name column, etc.?token=YOUR_TOKEN.email, name, phone).