Notion is a workspace tool that combines docs, databases, and project management. Connecting InstantDM to Notion lets you automatically log Instagram DM leads into a Notion database - giving your team a clean, organized view of every lead without switching between tools.
This guide covers setup via Make.com, Zapier, and Notion's direct API.
Why Use Notion with InstantDM?
- Team-friendly - everyone on your team probably already uses Notion
- Rich database views - table, board, timeline, calendar, and gallery views
- Linked pages - each lead can have its own page with notes, tasks, and context
- Flexible properties - add any fields you need without rigid schemas
- Free for personal use - Notion's free plan supports unlimited pages and databases
- Built-in collaboration - comment on leads, assign team members, and track status
Common Use Cases
- Log every Instagram lead into a Notion database
- Build a kanban board to track lead status
- Create a shared lead database for your sales team
- Link leads to campaign pages or product databases
- Use Notion as a lightweight CRM for small teams
What You'll Need
| Requirement | Details |
|---|---|
| InstantDM account | Trendsetter, Trendsetter Pro, or any Multi plan |
| Notion account | Free or paid plan |
| InstantDM API key | Found at Settings → API in your InstantDM dashboard |
| Automation platform (optional) | Make.com or Zapier for no-code setup |
Step 1: Create a Notion Database
- Open Notion and create a new page.
- Add a Database - Full page block.
- Name it Instagram Leads.
- Add these properties:
| Property Name | Property Type | Purpose |
|---|---|---|
| Name | Title | Lead's full name (this is the default title column) |
| Lead's email address | ||
| Phone | Phone | Lead's phone number |
| Text | Their IG username | |
| Flow | Text | Which DM flow they completed |
| Interest | Text | What they're interested in |
| Status | Select | New, Contacted, Qualified, Closed |
| Source | Select | Instagram DM |
| Captured | Date | When the lead was captured |
Tip: Add "New", "Contacted", "Qualified", and "Closed" as options for the Status property. Add "Instagram DM" as an option for Source.
Step 2: Connect Notion to Your Integration
For any method (Make.com, Zapier, or API), Notion requires you to share the database with an integration.
For Make.com / Zapier
The platforms handle this during the OAuth connection flow. When prompted, select the Instagram Leads database to grant access.
For Direct API
- Go to notion.so/my-integrations.
- Click New integration.
- Name it InstantDM and select your workspace.
- Set capabilities: Read content, Insert content, Update content.
- Copy the Internal Integration Token.
- Go to your Notion database page.
- Click ... (three dots) → Connections → Connect to → select your InstantDM integration.
Important: You must share the database with the integration, or API calls will return 404.
Method 1: Via Make.com (Recommended)
Step 1: Set Up the Webhook
Follow Steps 1-4 in the Make.com integration guide to create a webhook scenario.
Step 2: Add a Notion Module
- After the webhook trigger, add a Filter:
eventequalsflow_completed. - Click "+" and search for Notion.
- Select Create a Database Item.
- Connect your Notion account.
- Select the Instagram Leads database.
Step 3: Map Fields
| Notion Property | Make.com Mapping |
|---|---|
| Name (Title) | {{data.response_variables.full_name}} |
{{data.response_variables.email}} | |
| Phone | {{data.response_variables.phone}} |
@{{data.username}} | |
| Flow | {{data.flow_name}} |
| Interest | {{data.response_variables.interest}} |
| Status | New |
| Source | Instagram DM |
| Captured | {{timestamp}} |
Step 4: Test and Activate
- Run once in Make.com.
- Trigger a test event from InstantDM.
- Check your Notion database - a new entry should appear.
- Activate the scenario.
Method 2: Via Zapier
Step 1: Create the Zap
Follow the Zapier integration guide to set up a webhook trigger.
Step 2: Add Notion Action
- Add a Filter:
eventexactly matchesflow_completed. - Add Notion → Create Database Item.
- Connect your Notion account and select the database.
- Map properties as shown in Method 1.
Step 3: Test and Activate
- Test with sample data.
- Verify the entry in Notion.
- Turn the Zap on.
Method 3: Direct API Integration
Build a Webhook Receiver
const express = require('express');
const app = express();
app.use(express.json());
const NOTION_TOKEN = process.env.NOTION_TOKEN;
const DATABASE_ID = 'your-database-id-here';
app.post('/instantdm-webhook', async (req, res) => {
const { event, timestamp, data } = req.body;
if (event !== 'flow_completed') {
return res.status(200).json({ status: 'skipped' });
}
const page = {
parent: { database_id: DATABASE_ID },
properties: {
'Name': {
title: [{ text: { content: data.response_variables.full_name || data.username } }],
},
'Email': {
email: data.response_variables.email || null,
},
'Phone': {
phone_number: data.response_variables.phone || null,
},
'Instagram': {
rich_text: [{ text: { content: `@${data.username}` } }],
},
'Flow': {
rich_text: [{ text: { content: data.flow_name || '' } }],
},
'Interest': {
rich_text: [{ text: { content: data.response_variables.interest || '' } }],
},
'Status': {
select: { name: 'New' },
},
'Source': {
select: { name: 'Instagram DM' },
},
'Captured': {
date: { start: timestamp },
},
},
};
try {
const response = await fetch('https://api.notion.com/v1/pages', {
method: 'POST',
headers: {
'Authorization': `Bearer ${NOTION_TOKEN}`,
'Content-Type': 'application/json',
'Notion-Version': '2022-06-28',
},
body: JSON.stringify(page),
});
const result = await response.json();
if (result.id) {
res.status(200).json({ status: 'created', id: result.id });
} else {
res.status(500).json({ status: 'error', details: result });
}
} catch (error) {
res.status(500).json({ status: 'error', message: error.message });
}
});
app.listen(3000);
Finding Your Database ID
The database ID is in the URL when you open the database as a full page:
https://www.notion.so/yourworkspace/abc123def456...?v=...
^^^^^^^^^^^^^^^^
This is the database ID
It's the 32-character hex string before the ?v= parameter. Format it with dashes: abc123de-f456-....
Adding Page Content to Leads
With the Notion API, you can add rich content to each lead's page - not just properties.
Add a Summary Block
const page = {
parent: { database_id: DATABASE_ID },
properties: { /* ... same as above ... */ },
children: [
{
object: 'block',
type: 'heading_2',
heading_2: {
rich_text: [{ text: { content: 'Lead Details' } }],
},
},
{
object: 'block',
type: 'bulleted_list_item',
bulleted_list_item: {
rich_text: [{ text: { content: `Flow: ${data.flow_name}` } }],
},
},
{
object: 'block',
type: 'bulleted_list_item',
bulleted_list_item: {
rich_text: [{ text: { content: `Interest: ${data.response_variables.interest || 'N/A'}` } }],
},
},
{
object: 'block',
type: 'bulleted_list_item',
bulleted_list_item: {
rich_text: [{ text: { content: `Instagram: @${data.username}` } }],
},
},
{
object: 'block',
type: 'divider',
divider: {},
},
{
object: 'block',
type: 'paragraph',
paragraph: {
rich_text: [{ text: { content: 'Notes: ' } }],
},
},
],
};
This creates a lead page with a structured summary and a space for notes.
Building Useful Views
Board View (Kanban)
- In your database, click Add a view → Board.
- Group by Status.
- Columns: New → Contacted → Qualified → Closed.
- Drag leads between columns.
Calendar View
- Add a Calendar view.
- Use the Captured date property.
- See when leads are coming in over time.
Filtered Views
- Today's Leads: Filter where Captured is today.
- By Campaign: Filter where Flow contains a specific name.
- Uncontacted: Filter where Status is "New".
- High Interest: Filter where Interest contains "Premium" or "Enterprise".
Troubleshooting
| Issue | Solution |
|---|---|
| Entry not appearing in Notion | Check the automation platform execution log. Verify the Notion connection and database selection. |
| API returning 404 | The database isn't shared with your integration. Go to the database → Connections → add your integration. |
| "Property not found" error | Property names are case-sensitive. Ensure exact match with your database properties. |
| Select value rejected | The value must exist as an option in the Select property. Add "New" and "Instagram DM" as options first. |
| Date format error | Notion requires ISO 8601 dates (e.g., 2025-01-15T10:30:00Z). InstantDM timestamps are already in this format. |
| API returning 400 | Check the JSON structure. Notion's API has specific formats for each property type (title, rich_text, select, etc.). |
| Rate limiting (429) | Notion's API allows 3 requests per second. If you're processing many events, add a delay or queue. |
Frequently Asked Questions
Is Notion a good CRM replacement?
For small teams (1-10 people) with simple sales processes, Notion works well as a lightweight CRM. It's especially good if your team already uses Notion for other work. For larger teams or complex sales processes, a dedicated CRM like HubSpot or Pipedrive is better.
Can I use Notion's built-in automations?
Notion has basic automations (available on paid plans) that can trigger when database items are created or updated. You can use them to send notifications or update properties. For more complex automations, use Make.com or Zapier.
How do I handle duplicates?
Notion doesn't have built-in deduplication. In Make.com/Zapier, add a "Search" step before creating to check if an entry with the same email already exists. If found, update it instead of creating a new one.
Can I link Instagram leads to other Notion databases?
Yes. Create a Relation property in your Leads database that links to another database (e.g., Campaigns, Products, Team Members). In the API, set the relation property with the linked page IDs.
What's Next
- Set up Airtable for a more database-focused alternative.
- Connect to Google Sheets for simple spreadsheet logging.
- Read the HubSpot guide for a full CRM solution.
- Build a Custom AI Agent to qualify leads before logging them.
- Explore the full API docs at instantdm.com/instagram-api-docs.