Make (Integromat)
Connect Convoy to 1,800+ apps using Make. Build visual automation scenarios that send prompts and receive AI-generated results — no code required.
Use Case: Automated Content Generation Pipeline
A powerful workflow: new rows in Google Sheets trigger AI content generation via Convoy, and results flow back to your sheet, Slack, Notion, or any destination — all orchestrated visually in Make.
Example scenarios:
- New Airtable records → AI generates product descriptions → results saved back to Airtable
- Typeform submissions → AI drafts personalized responses → sent via Gmail
- RSS feed items → AI summarizes articles → posted to Slack channel
- Scheduled trigger → AI generates daily social media posts → queued in Buffer
How This Works (in plain English)
Convoy is asynchronous — when you POST a prompt, you don’t get the AI response back in the same request. Convoy batches your prompt with others, processes it, and then calls you back with the result later. That means a complete Make setup is two scenarios, one for each direction:
┌─ SCENARIO 1 (Sender) ─┐ ┌─ SCENARIO 2 (Receiver) ─┐
│ │ │ │
You ─▶ │ New Sheet row │ ──── POST ───▶ Convoy ──── POST ──▶ │ Custom Webhook ──▶ Save │
│ → HTTP: Make a Request│ │ to Sheet/Slack/etc. │
└───────────────────────┘ └─────────────────────────┘
↑ │
│ │
└────────────── Scenario 2's webhook URL ──────────────────────┘
goes here as `callback_url`You’ll build them in the same order the data flows: Step 1 sends the prompt, Step 2 catches the response, Step 3 wires them together. It’s normal for the very first Step 1 test to never produce a callback — Step 2 doesn’t exist yet. That’s expected.
Use the convoy-mock test model for this entire guide. Convoy ships a free, instant test model called convoy-mock that returns a synthetic AI response within ~1 minute and is not billed. Use it for every step here. Once your full pipeline works end-to-end, switch the model value to a real production model like claude-3-haiku.
Anatomy of the Convoy POST
This is the actual HTTP request Scenario 1 makes. The Make “HTTP — Make a request” module is just a visual wrapper around it — knowing this makes everything else click.
Endpoint: POST https://api.cnvy.ai/cargo/load
Headers:
| Header | Value | Where it comes from |
|---|---|---|
Content-Type | application/json | Hardcoded in the HTTP module |
X-API-Key | convoy_sk_... | Your Convoy project API key — hardcoded (treat it like a password) |
Body (annotated):
{
"params": {
"model": "convoy-mock", // ← test model — free, ~1 min, no charge
// Swap to "claude-3-haiku" etc. for production
"max_tokens": 1024, // ← hardcoded
"messages": [
{
"role": "user",
"content": "{{2.Topic}}" // ← MAPPED from Scenario 1's trigger module
// (e.g. the Sheet row's "Topic" column)
}
],
"system": "{{2.System Prompt}}" // ← optional, mapped or hardcoded
},
"callback_url": "PASTE_AFTER_STEP_2" // ← Scenario 2's Custom Webhook URL goes here.
// Leave as a placeholder for Step 1 — you'll
// come back and paste the real URL in Step 3.
}The four things you fill in:
X-API-Keyheader — your Convoy project API key, once.messages[0].content— mapped from a field your trigger module produces (the prompt itself).params.model— keep asconvoy-mockwhile testing.callback_url— left as a placeholder for now. You’ll fill this in during Step 3, after Scenario 2 exists.
When Scenario 1 fires, Convoy responds immediately with a cargo_id (an acknowledgement). The actual AI text arrives later via POST to your callback_url — which is why Scenario 2 exists.
See Prompts for the full payload reference — system prompts, multi-turn messages, temperature, and proven prompt patterns (classifier, extractor, summarizer, persona, multi-turn).
Production models batch and may take minutes to hours (up to 24-hour SLA), depending on queue volume. convoy-mock returns in ~1 minute. This integration is designed for asynchronous content generation rather than real-time chat.
Prerequisites
- A Convoy account with an active project
- A project API key (starts with
convoy_sk_) — see Authentication - A Make account (free tier includes 1,000 operations/month)
- A trigger source — Google Sheets, Airtable, Typeform, RSS, schedule, or anything Make supports
Step 1: Build Scenario 1 — Send Prompts to Convoy
This is the scenario that watches your trigger source and POSTs each new prompt to Convoy. It’s the first thing in your data flow.
1a. Create a New Scenario
- Go to make.com and click Create a new scenario
- Name it “Convoy — Send AI Prompts”
1b. Add Your Trigger Module
This is your source of new prompts.
Google Sheets example:
- Add a Google Sheets → Watch Rows module
- Connect your Google account
- Select your spreadsheet and worksheet
- Set the Limit to process rows in batches (e.g., 10 at a time)
Your sheet might look like this:
| Topic | System Prompt | Status | AI Response |
|---|---|---|---|
| Write a blog intro about AI in logistics | You are a marketing copywriter. | ||
| Summarize our Q4 results for investors | You are a business analyst. |
The trigger fields you pull in here (Topic, System Prompt) are what you’ll map into the Convoy POST body in the next step.
1c. Add an HTTP Module (Make a Request)
This module is the Convoy POST from the Anatomy section — you’re filling in those fields here.
- Add an HTTP → Make a request module
- Configure it:
URL:
https://api.cnvy.ai/cargo/loadMethod: POST
Headers:
| Key | Value |
|---|---|
Content-Type | application/json |
X-API-Key | convoy_sk_your_key_here |
Replace convoy_sk_your_key_here with your actual Convoy project API key (Convoy dashboard → project settings).
Body type: Raw
Content type: JSON (application/json)
Request content:
{
"params": {
"model": "convoy-mock",
"max_tokens": 1024,
"messages": [
{
"role": "user",
"content": "{{2.Topic}}"
}
],
"system": "{{2.System Prompt}}"
},
"callback_url": "https://example.com/placeholder-fill-in-step-3"
}Map the values:
{{2.Topic}}— Map to your trigger’s prompt/topic column{{2.System Prompt}}— Map to your system prompt column (or hardcode a default)model— keep asconvoy-mockfor testingcallback_url— leave as the placeholder URL for now. You’ll come back and replace it in Step 3 after Scenario 2 exists. (A bogus URL won’t break Scenario 1 — Convoy still accepts the request.)
Also enable Parse response in the module settings so you can use the returned cargo_id in later modules.
1d. Test the Module
- Click Run once to send a real request to Convoy
- The HTTP module should return:
This means Convoy received your prompt. The actual AI response is not in this response — it’ll arrive later via callback.
{ "cargo_id": "crg_abc123def456", "status": "success", "message": "Cargo loaded successfully" } - If you get an error, check:
- Your API key is correct and active
- The
Content-Typeheader is exactlyapplication/json - The body is valid JSON
- The model is
convoy-mock
What happens to this first test? Convoy is now processing the prompt and will try to call back the placeholder URL — which doesn’t exist yet. That’s fine. The test result will be lost, but you’ll see it tracked as callback_failed. You’re about to build Scenario 2 to fix that.
1e. (Optional) Update the Source Row
After the HTTP module, add a Google Sheets → Update a Row module to mark the row as submitted:
- Map the Row number from the trigger
- Set the Status column to
Submitted - Set a Cargo ID column to
{{3.data.cargo_id}}(you’ll need this in Step 2 to find the row when the callback arrives)
1f. Activate Scenario 1
- Toggle the scenario ON (bottom-left switch)
- Set the schedule (e.g., every 15 minutes, or immediately on paid plans)
It’s now sending every new sheet row to Convoy. None of those results will reach you yet — that’s what Step 2 is for.
Step 2: Build Scenario 2 — Receive AI Results
This is the scenario that catches Convoy’s callback and routes the AI result back to your sheet (or wherever you want it).
2a. Create a New Scenario
- Click Create a new scenario
- Name it “Convoy — Receive AI Results”
2b. Add a Webhooks Trigger (Custom Webhook)
- Click the + button to add a module
- Search for Webhooks and select Custom webhook
- Click Add to create a new webhook
- Give it a name like “Convoy Callback Receiver”
- Click Save — Make generates a unique URL like:
https://hook.us1.make.com/abc123def456ghi789 - Copy this URL. This is the value you’ll paste into Scenario 1’s
callback_urlin Step 3.
Keep this webhook URL private. Anyone with this URL can send data to your scenario.
2c. Determine the Data Structure
Make needs to know the shape of incoming data. The simplest way is to paste a sample now so you can map fields without waiting:
- Click Custom webhook → Redetermine data structure
- Paste this sample payload and click OK:
{
"cargo_id": "crg_abc123def456",
"success": true,
"response": {
"id": "msg_01XFDUDYJgAACzvnptvVoYEL",
"type": "message",
"role": "assistant",
"content": [
{
"type": "text",
"text": "Here is the generated content..."
}
],
"model": "convoy-mock",
"stop_reason": "end_turn",
"usage": {
"input_tokens": 150,
"output_tokens": 500
}
},
"error": null
}2d. Add a Router (Optional but Recommended)
If you want to handle successes and failures differently:
- Add a Router module after the webhook
- Create two paths:
- Path 1 (Success): Filter where
successequalstrue - Path 2 (Error): Filter where
successequalsfalse
- Path 1 (Success): Filter where
2e. Add Your Destination Module
Where should the AI result go? Some popular choices:
Option A: Update the original Google Sheets row
- Add a Google Sheets → Update a Row module
- Look up the row by
{{1.cargo_id}}(you wrote the Cargo ID into the sheet in Step 1e) - Map:
- AI Response column →
{{1.response.content[].text}} - Status column →
Completed
- AI Response column →
Option B: Append a new row (simpler)
- Add a Google Sheets → Add a Row module
- Map:
- Cargo ID →
{{1.cargo_id}} - AI Response →
{{1.response.content[].text}} - Model →
{{1.response.model}} - Tokens Used →
{{1.response.usage.output_tokens}}
- Cargo ID →
Option C: Post to Slack
- Add a Slack → Create a Message module
- Set the message:
✅ AI Result Ready ({{1.cargo_id}}) {{1.response.content[].text}} Model: {{1.response.model}} | Tokens: {{1.response.usage.output_tokens}}
Option D: Save to Notion
- Add a Notion → Create a Database Item module
- Map properties to the callback payload fields
2f. Activate Scenario 2
- Toggle the scenario ON
- Scheduling is automatically set to Immediately (the default for webhook triggers)
It’s now listening for callbacks from Convoy. But Convoy doesn’t know about it yet — that’s Step 3.
Step 3: Wire Them Together
The two scenarios are connected by one value: Scenario 2’s Custom Webhook URL (copied in Step 2b) goes into Scenario 1’s callback_url field. That’s the entire connection.
3a. Edit Scenario 1
- Open Scenario 1 (the Sender)
- Click the HTTP → Make a request module
- In the Request content body, replace the placeholder
callback_urlwith the real Custom Webhook URL from Step 2b:"callback_url": "https://hook.us1.make.com/abc123def456ghi789" - Click OK and Save the scenario
3b. Test the Full Pipeline
- Add a new row to your Google Sheet with a prompt
- Either wait for the schedule or click Run once on Scenario 1
- Confirm Scenario 1 executed successfully (check the execution log — you should see a
cargo_id) - Wait ~1 minute for the
convoy-mocktest model to finish processing - Confirm Scenario 2 fired — its execution log should show an incoming callback with the AI text
- Verify the result arrived at your destination (Sheet, Slack, etc.)
If Scenario 1 fires but Scenario 2 doesn’t, the most common cause is a wrong callback_url — go back to 3a and re-paste the URL exactly from 2b.
3c. Switch to a Production Model
Once the full pipeline works end-to-end on convoy-mock, you can swap in a real model:
- Open Scenario 1 → HTTP → Make a request
- Change
"model": "convoy-mock"to e.g."model": "claude-3-haiku" - Save the scenario
Production models take longer (minutes to hours, depending on queue volume) and are billed based on tokens used.
Verifying Status
You can check the status of any request directly via the API:
curl -H "X-API-Key: convoy_sk_your_key_here" \
https://api.cnvy.ai/cargo/crg_abc123def456/trackingStatus progression: PENDING → BATCHED → PROCESSING → COMPLETED → callback_delivered
If you see callback_failed, your callback_url was wrong, the receiver scenario was off, or the webhook timed out.
Advanced Configuration
Using Multiple Models
Pick a model that matches the workload:
| Use case | Model | Notes |
|---|---|---|
| Testing pipeline end-to-end | convoy-mock | Free, synthetic response in ~1 min, no charge |
| Short summaries, tags | claude-3-haiku | Fast, cheapest production model |
| Blog posts, analysis | claude-3-sonnet | Good balance of quality and cost |
| Complex research, creative | claude-3-opus | Highest quality |
See Supported Models for the full list.
Conditional Model Selection
Use Make’s ifempty function to default to convoy-mock when a column is blank:
{{ifempty(2.Model; "convoy-mock")}}Error Handling with Router
Add robust error handling to Scenario 2:
[Webhook] → [Router]
├── Path 1 (success = true) → [Google Sheets: Update Row]
└── Path 2 (success = false) → [Slack: Send Alert]Set up the filters:
- Path 1 —
success→ Equal to →true - Path 2 —
success→ Equal to →false
Using Make’s Data Store for Tracking
Track all submitted prompts and their results:
-
Create a Data Store in Make with these fields:
cargo_id(text, key)prompt(text)status(text)result(text)submitted_at(date)
-
In Scenario 1, after the HTTP module, add Data Store → Add/Replace a Record:
cargo_id:{{3.data.cargo_id}}prompt:{{2.Topic}}status:submittedsubmitted_at:{{now}}
-
In Scenario 2, add Data Store → Update a Record:
- Find by
cargo_id:{{1.cargo_id}} status:completedresult:{{1.response.content[].text}}
- Find by
Rate Limiting with Sleep Module
If you’re processing many rows, add a Tools → Sleep module after the HTTP module:
- Set the delay to
1second - This stays within Convoy’s rate limits (60 requests/minute)
Temperature Control
Add a “Temperature” column to your sheet and map it:
{
"params": {
"model": "{{2.Model}}",
"max_tokens": 1024,
"temperature": {{ifempty(2.Temperature; 0.7)}},
"messages": [
{"role": "user", "content": "{{2.Topic}}"}
]
},
"callback_url": "https://hook.us1.make.com/..."
}Callback Payload Reference
When Convoy finishes processing, it sends this payload to your webhook — i.e., this is what Scenario 2 receives:
{
"cargo_id": "crg_abc123def456",
"success": true,
"response": {
"id": "msg_01XFDUDYJgAACzvnptvVoYEL",
"type": "message",
"role": "assistant",
"content": [
{
"type": "text",
"text": "Here is the generated content..."
}
],
"model": "convoy-mock",
"stop_reason": "end_turn",
"usage": {
"input_tokens": 150,
"output_tokens": 500
}
},
"error": null
}Key fields for Make mapping:
| Make Field Path | Description |
|---|---|
cargo_id | The unique request ID |
success | true if processing succeeded |
response.content[].text | The AI-generated text content |
response.model | The model that was used |
response.usage.input_tokens | Tokens used for input |
response.usage.output_tokens | Tokens used for output |
error | Error message (if success is false) |
Make vs. Zapier
| Feature | Make | Zapier |
|---|---|---|
| Visual builder | ✅ Flowchart-style | ✅ Linear steps |
| Branching/routing | ✅ Built-in Router | ⚠️ Requires Paths (paid) |
| Data stores | ✅ Built-in | ❌ Requires external DB |
| Error handling | ✅ Granular per-module | ⚠️ Basic |
| Free tier | 1,000 ops/month | 100 tasks/month |
| Webhook response | ✅ Instant | ✅ Instant |
| Scheduling | Every 15 min (free) | Every 15 min (free) |
| Complexity | Higher learning curve | Simpler for basic flows |
Choose Make if you need branching logic, data stores, or complex multi-step workflows. Choose Zapier if you want the simplest possible setup with minimal configuration.
Troubleshooting
Scenario 1 succeeds but Scenario 2 never fires
Almost always a callback_url issue:
- Confirm Scenario 2 is active (toggle ON)
- Re-copy Scenario 2’s Custom Webhook URL and paste it back into Scenario 1’s HTTP module body (Step 3a) — make sure no quotes, spaces, or trailing slashes were lost
- Hit the tracking endpoint —
callback_failedmeans the URL was wrong or the receiver timed out
”Invalid API key” error in HTTP module
- Verify your key starts with
convoy_sk_ - Check that the key hasn’t been revoked in the Convoy dashboard
- Header name must be exactly
X-API-Key(case-sensitive) - No extra spaces in the header value
”Unknown model” error
- Use
convoy-mockfor testing, or check the Supported Models page - Model IDs are case-sensitive (
claude-3-haiku, notClaude-3-Haiku)
Result is taking a long time
convoy-mockshould return in ~1 minute. If it doesn’t, check the tracking endpoint- Production models batch and may take minutes to hours — that’s normal
”Connection error” in HTTP module
- Verify the URL is
https://api.cnvy.ai/cargo/load - Check that the method is
POST - Ensure the body is valid JSON (use Make’s JSON validator)
Scenario runs but no data appears
- Check the execution log for each module — click on the bubble numbers
- Verify field mappings are correct (look for empty values)
- Ensure the data structure was properly detected in the webhook module
Rate limit errors (429)
- Add a Sleep module (1–2 seconds) between HTTP requests
- Reduce the batch size in your trigger module
- Convoy allows 60 requests per minute and 500 per hour per project
Make operations running out
- Each module execution counts as one operation
- A scenario with 4 modules processing 10 rows = 40 operations
- Process rows less frequently but in larger groups, or upgrade your Make plan
Tips for Production Use
- Test on
convoy-mockfirst. Always end-to-end test the full pipeline with the test model before swapping in a billed production model. - Add a “Cargo ID” column to your sheet. Write
cargo_idfrom Scenario 1 into the row so Scenario 2 can update the correct row when the callback arrives. - Add a “Status” column updated by Scenario 2 (
Submitted,Completed,Failed) so you can see what’s still in flight. - Enable error notifications — Scenario settings → Notifications → “If a scenario fails”
- Set up incomplete executions — configure what happens when a module fails (retry, ignore, or break)
- Use scenario blueprints — export a working scenario as a blueprint for backup or sharing
- Monitor operations usage — keep an eye on your Make plan’s operation limits, especially with high-volume workflows
Cost efficiency: Convoy batches your requests together, which can reduce costs by up to 50% compared to making individual API calls. Combined with Make’s visual builder, this creates a powerful no-code AI content pipeline.