by deathau


Welcome to notion-heroku 👋

License: MIT Twitter: kevinjalbert

Heroku hosted application that performs Notion actions (i.e., new task, new note) based on voice requests via IFTTT Webhooks and Google Assistant.


  1. Have a Notion account
  2. Have a Heroku account
  3. Have an IFTTT account (with Google Assistant service enabled)
  4. Have Specific Notion Template as described in this blog post Have a table for Notes and/or a table for Tasks (can be the same table)
  5. Your Notion Token
  6. URLs for the tables defined in 4.


Note: The required environment variables mentioned in the below steps are outlined in kevinjalbert/alfred-notion's section on finding your Notion Token and finding your Notion URLs.

Environment Variables

  • NOTION_TOKEN = your Notion Token
  • NOTES_DATABASE_URL = the url to your notes database
  • TASKS_DATABASE_URL = the url to your tasks database (can be the same)
  • MAX_TITLE_LENGTH (optional) = the maximum length of the title before it gets truncated. If your title gets truncated, the full, untruncated title will first be added to the database row's page as a text block, so you won't lose any text. Defaults to 100 characters.

With Heroku Deploy Button


  1. Use above deploy button to create/launch application on Heroku
  2. Navigate to application settings page (i.e., and set required environment variables.


  1. Clone the repository via git clone
  2. heroku create
  3. git push heroku master
  4. Set all required environment variables via heroku config:set xxxx=yyyy

Setting up IFTTT Actions

Click to view walkthrough (images)

This walkthrough demonstrates how to setup a IFTTT action to add a Notion Task.

The main difference is that the webhook URL is either /add_note or /add_task in Step 6.

Step 1 - Choose Trigger Service (Google Assistant)

Step 1

Step 2 - Choose Google Assistant Trigger

Step 2

Step 3 - Complete Google Assistant Trigger Fields

Step 3

Step 4 - Choose Action Service (Webhooks)

Step 4

Step 5 - Choose Webhooks Action

Step 5

Step 6 - Complete Webhook Action Fields

Step 6


ThI haven't updated the above screenshots from @kevinjalbert's original versions. While I've made sure you can still use the ?title= parameter, you can also omit that if you send JSON in the request body.

If the JSON object is present, it will extract a "title" from that, and anything in the "body" property will be put into the database row's page. Any other properties you supply in this object will automatically map to other database properties if present, and if not return an error indicating which properties were not present.

This opens up opportunities to include information like the source of your note (e.g. Google Assistant, Email, etc) if you set up multiple IFTTT trigger sources, or to add any other contextual information you deem relevant.


  "title": "<Row title>", // REQUIRED. The title of the database row you're creating
  "type": "Note"|"Task",  // Which of the databases you want it to go to
  "url": "<url>",         // The url of the database you want it to go to (overrides "type")
  "body": "<text>"        // Text block you want to create inside the row's page (Markdown supported)


👤 Kevin Jalbert

Show your support

Give a ⭐️ if this project helped you!

This README was generated with ❤️ by readme-md-generator