Why Connect Notion to Odoo?
Notion serves as the documentation hub for thousands of teams — wikis, meeting notes, project databases, and knowledge bases. Odoo runs the business operations — CRM, sales, inventory, HR. The challenge is that business context lives in Odoo while team documentation lives in Notion, creating information silos.
Connecting them means your Notion wikis can reference live Odoo data (customer counts, revenue, inventory levels), and your Notion project databases can sync with Odoo project tasks for billing and reporting.
Integration Approaches
| Method | Difficulty | Real-time | Best For |
|---|---|---|---|
| Zapier / Make | Low | Polling (1-15min) | Simple one-way sync |
| Notion API + Odoo Cron | Medium | Scheduled (5-60min) | Database sync |
| n8n Workflow | Medium | Webhook + polling | Complex workflows |
| Custom Module | High | Configurable | Deep integration |
Step 1: Set Up Notion API
- Go to notion.so/my-integrations
- Create a new integration
- Select capabilities: Read content, Update content, Insert content
- Copy the Internal Integration Token
- Share the Notion databases you want to sync with the integration (click Share on the database page and add your integration)
Step 2: Map Notion Databases to Odoo Models
Notion databases are essentially structured tables, similar to Odoo models. Common mappings:
| Notion Database | Odoo Model | Sync Direction |
|---|---|---|
| Tasks database | project.task | Bidirectional |
| Contacts database | res.partner | Odoo to Notion |
| Product catalog | product.product | Odoo to Notion |
| Meeting notes | calendar.event notes | Notion to Odoo |
| Bug tracker | project.task (bug type) | Bidirectional |
Step 3: Build the Sync Script
import requests
import xmlrpc.client
NOTION_TOKEN = 'secret_xxx'
NOTION_DB_ID = 'your_database_id'
ODOO_URL = 'https://your-odoo.com'
# Fetch Notion database entries
def get_notion_tasks():
resp = requests.post(
f'https://api.notion.com/v1/databases/{NOTION_DB_ID}/query',
headers={
'Authorization': f'Bearer {NOTION_TOKEN}',
'Notion-Version': '2022-06-28',
},
json={'sorts': [{'property': 'Last edited time', 'direction': 'descending'}]}
)
return resp.json()['results']
# Push to Odoo
models = xmlrpc.client.ServerProxy(f'{ODOO_URL}/xmlrpc/2/object')
for page in get_notion_tasks():
props = page['properties']
name = props['Name']['title'][0]['plain_text']
status = props.get('Status', {}).get('select', {}).get('name', 'New')
# Check if task exists in Odoo
existing = models.execute_kw(db, uid, api_key, 'project.task', 'search',
[[('x_notion_id', '=', page['id'])]])
vals = {'name': name, 'x_notion_id': page['id']}
if existing:
models.execute_kw(db, uid, api_key, 'project.task', 'write',
[existing, vals])
else:
models.execute_kw(db, uid, api_key, 'project.task', 'create', [vals])Step 4: Push Odoo Data to Notion
Create Notion pages from Odoo records. This is useful for making business data accessible to teams who live in Notion:
def push_customer_to_notion(partner):
requests.post(
'https://api.notion.com/v1/pages',
headers={
'Authorization': f'Bearer {NOTION_TOKEN}',
'Notion-Version': '2022-06-28',
},
json={
'parent': {'database_id': NOTION_CUSTOMERS_DB},
'properties': {
'Name': {'title': [{'text': {'content': partner['name']}}]},
'Email': {'email': partner['email']},
'Revenue': {'number': partner['total_invoiced']},
'Plan': {'select': {'name': partner.get('plan', 'Free')}},
}
}
)Use Cases
- Sales wiki: Notion page auto-populated with latest CRM pipeline stats from Odoo
- Product catalog: Notion database synced from Odoo products for marketing team reference
- Sprint planning: Notion sprint boards synced to Odoo tasks for timesheet billing
- Customer success: Notion customer profiles enriched with Odoo subscription and billing data
- Onboarding checklists: Notion templates that create corresponding Odoo HR records
Limitations
- Notion API does not support webhooks for database changes (polling required)
- Notion's API rate limit is 3 requests per second
- Rich text formatting in Notion does not map cleanly to Odoo HTML fields
- Notion relations and rollups require additional API calls to resolve
DeployMonkey + Notion
DeployMonkey instances provide API access for Notion sync scripts. Our AI agent can help you design the database mapping, build the sync workflow, and set up scheduled actions in Odoo.