DocsAutomate
Automations
Rules that act on your ideas when they get a tag, sit untouched or are archived: calendar events, AI notes, tags, webhooks and Grok Bot.
On this page
An automation is a rule of the form "when this happens to an idea, do that", like On #sunday → Create a calendar event tomorrow (all day). Rules run on the server, so they fire however the change happened: a drop from your phone, an edit, a tag merge or an assistant working through a connector, even with the app closed.
Create a rule
- Open Profile → Automations.
- Select New rule.
- Under When, pick a trigger. Under Do this, pick an action and fill in its fields.
- Check the sentence under the form. It reads your rule back to you, for example On #podcast → Gemini writes a note: “suggest three guests”.
- Select Save rule.
Each rule in the list has an On/Off switch, Edit and Delete. If you delete a rule by mistake, select Undo in the message that appears.
Tags that an active "gets a tag" rule watches are highlighted across the app. Hover one to see Has an automation. While a rule is running on an idea, the idea's card shows a small Automation running dot.
You can have up to 50 rules.
Triggers
| Button | The rule fires when… | Example sentence |
|---|---|---|
| Gets a tag | an idea gets the tag you name | On #sunday → … |
| Since created | a set time has passed since the idea was created | 2 weeks after an idea is created → … |
| Since updated | the idea hasn't changed for a set time | When a #garden idea hasn't changed for 1 month → … |
| Since opened | the idea hasn't been opened for a set time | When an idea hasn't been opened for 3 months → … |
| Archived | the idea is archived | When an assistant archives an idea → … |
Gets a tag
The rule fires when the tag is added to an idea in any way: typed by you, added by an assistant, added by another rule, or brought in by a tag merge. A new idea saved with the tag counts too, including one saved offline that syncs later.
Archived ideas and ideas in the trash don't fire tag rules.
Time triggers
For Since created, Since updated and Since opened, set How long in hours, days, weeks or months. The time must be between 1 hour and 1 year. A month counts as 30 days.
- Since updated: editing the idea, changing its tags, or adding or editing a note counts as an update. Notes that automations write, like AI notes and calendar notes, don't count. Archiving the idea doesn't count either.
- Since opened: opening the idea in the app, or an assistant reading it, counts. An idea that has never been opened counts from when it was created.
Time rules are checked every 10 minutes, so a rule can fire up to about 10 minutes after the idea is due.
Time rules have two more options:
- Include archived ideas: off by default, so archived ideas are skipped.
- Also apply to ideas already past this: off by default. The rule then acts only on ideas that come due after you save it. Turn it on to also catch every idea that is already past the time. For example, "hasn't been opened for 3 months" with this on fires for every idea you haven't opened in 3 months.
Archived
Under Archived by, choose whose archiving fires the rule: Me, Assistants, Automations, or any mix. Pick at least one. All three are on by default.
An Archived rule can't use the Archive action, because the idea is already archived.
Limit to one tag
For every trigger except Gets a tag, the Only ideas tagged field limits the rule to ideas with that tag. Use one tag, like #work, or leave it empty for all ideas.
How often a rule fires
| Trigger | Fires |
|---|---|
| Gets a tag | Once per idea. If you remove the tag and add it again, the rule doesn't fire again. |
| Since created | Once per idea. |
| Since updated | Once per quiet spell. After the idea changes and goes quiet again for the set time, it fires again. |
| Since opened | Once per quiet spell. After you open the idea and leave it again for the set time, it fires again. |
| Archived | Every time the idea is archived. |
Actions
Calendar
This action creates an event in the primary calendar of your Google account. First connect the account. On the Google Calendar card at the top of Automations, select Connect and allow access on Google's screen. The card then shows Connected as your Google address. Select Disconnect to remove the connection. Idea Bucket only asks for access to calendar events.
Choose the Day:
- The same day: the day the rule fired.
- The next day.
- On the next… a Weekday you pick. If the rule fires on that weekday, the event goes on the same weekday a week later.
- A few days later: 1 to 365 Days later.
Choose the Time:
- All day.
- At a set time: pick when it Starts at and how long it Lasts (15 min up to 8 hours).
Dates and times use the time zone your device had when you saved the rule. The event title is the first line of the idea, cut to 120 characters. The description holds the full idea, its tags and a link to Idea Bucket.
When the event is created, the idea gets a note like "📅 Added to Google Calendar for Sun 4 Oct at 09:00", with an Open the event link. The run in Recent runs has an Open event link too.
AI note
Under Ask Gemini to, write an instruction of up to 1,000 characters, like "outline 3 next steps" or "suggest a title for this #podcast episode". Gemini reads the idea and its tags and adds its answer to the idea as a note signed Gemini.
Add tags and Remove tags
List up to 10 tags, like #work #later. Adding a tag that's already there, or removing one that isn't, does nothing. The run is then marked Skipped with "No change".
For Add tags, you can also pick a Color (Violet, Blue, Teal, Green, Amber, Orange, Red or Pink). When you save the rule, those tags take that color. Choose Keep current to leave their colors alone.
Tags added by a rule can fire other "gets a tag" rules. For example, On #podcast → Add #listen followed by On #listen → Create a calendar event… creates the event when you tag an idea #podcast.
Archive
This action moves the idea to your archive. The idea is marked as archived by an automation, so an Archived rule limited to Automations fires next.
Webhook
This action sends the idea to your own URL as an HTTPS POST, for Zapier, Make, n8n or your own server. Paste the URL. It must start with https:// and point to a public address. Local and private addresses are refused.
The editor creates a Signing secret for the rule. Copy it into the service that receives the requests, so it can check that each request came from Idea Bucket. See Verify the signature.
Dispatch Grok Bot
This action hands the idea to a Grok Bot coding agent, which starts building it and reports back on the idea. Nothing is sent until you select Send on the idea. The rule sentence ends in (asks first). For setup, see Grok Bot dispatch.
Webhook requests
Each request is a POST with these headers:
| Header | Value |
|---|---|
Content-Type |
application/json |
User-Agent |
IdeaBucket-Automations/1 |
x-ideabucket-event |
The event name, the same as event in the body |
x-ideabucket-signature |
sha256= followed by the hex HMAC-SHA256 of the body |
The body looks like this:
{
"event": "idea.tagged",
"tag": "podcast",
"idea": {
"id": "6f1c2a9e-3b7d-4e8a-9c41-2d5f8b7a1e03",
"content": "Interview a beekeeper about urban hives",
"tags": ["podcast", "garden"],
"created_at": "2026-09-28T08:14:03.512+00:00",
"archived_at": null
},
"automation": {
"id": "b2e4d6f8-1a3c-4e5f-8a7b-9c0d1e2f3a4b",
"tag": "podcast",
"action": "webhook",
"trigger": "tag",
"after_minutes": null
},
"run_id": "0d9e8f7a-6b5c-4d3e-2f1a-0b9c8d7e6f5a",
"sent_at": "2026-09-28T08:14:05.201Z"
}| Field | Meaning |
|---|---|
event |
idea.tagged, idea.time_since_created, idea.time_since_updated, idea.time_since_viewed or idea.archived, depending on the trigger |
tag |
The watched tag for Gets a tag rules. For other triggers, the Only ideas tagged tag, or null |
idea |
The idea's id, full text, tags, creation time, and archive time (null if it isn't archived) |
automation |
The rule: its id, tag, action, trigger (tag, created, updated, viewed or archived) and, for time rules, the time in minutes |
run_id |
The run's id. It stays the same when you retry a run, so you can use it to ignore duplicates |
sent_at |
When this request was sent |
Any 2xx answer counts as success. Idea Bucket doesn't follow redirects: a 3xx answer fails the run. Your endpoint must answer within 10 seconds. A failed request isn't retried automatically. Select Retry on the run to send it again.
Verify the signature
Idea Bucket signs every webhook request this way:
- What's signed: the raw request body, exactly as received, as UTF-8 bytes. There is no timestamp in the signature.
sent_atin the body tells you when the request was sent. - Key: your rule's Signing secret, used as text (its UTF-8 characters). Don't hex-decode it, even though it looks like hex.
- Algorithm: HMAC-SHA256, written as lowercase hex.
- Header:
x-ideabucket-signature: sha256=<64 hex characters>.
Compute the same value over the raw body and compare it with the header in constant time. Do this before you parse the JSON: parsing and re-serialising the body changes the bytes.
Node.js
This example uses only Node's built-in modules (Node 18 or later):
import { createHmac, timingSafeEqual } from 'node:crypto'
import { createServer } from 'node:http'
const SECRET = process.env.IDEABUCKET_SIGNING_SECRET // the rule's Signing secret
function isValid(rawBody, header) {
const expected = 'sha256=' + createHmac('sha256', SECRET).update(rawBody).digest('hex')
const given = Buffer.from(header ?? '', 'utf8')
const wanted = Buffer.from(expected, 'utf8')
return given.length === wanted.length && timingSafeEqual(given, wanted)
}
createServer((req, res) => {
const chunks = []
req.on('data', chunk => chunks.push(chunk))
req.on('end', () => {
const rawBody = Buffer.concat(chunks)
if (!isValid(rawBody, req.headers['x-ideabucket-signature'])) {
res.writeHead(401).end()
return
}
const payload = JSON.parse(rawBody.toString('utf8'))
console.log(payload.event, payload.idea.content)
res.writeHead(204).end()
})
}).listen(3000)With Express, use express.raw({ type: 'application/json' }) on the route, so req.body is the raw Buffer, and pass it to isValid.
Web Crypto
For Cloudflare Workers, Deno, Bun and other runtimes with Web Crypto:
async function isValid(secret, rawBody, header) {
const match = /^sha256=([0-9a-f]{64})$/.exec(header ?? '')
if (!match) return false
const enc = new TextEncoder()
const key = await crypto.subtle.importKey(
'raw',
enc.encode(secret),
{ name: 'HMAC', hash: 'SHA-256' },
false,
['verify'],
)
const signature = new Uint8Array(match[1].match(/../g).map(h => parseInt(h, 16)))
// crypto.subtle.verify compares in constant time.
return crypto.subtle.verify('HMAC', key, signature, enc.encode(rawBody))
}
export default {
async fetch(request, env) {
const rawBody = await request.text()
const ok = await isValid(
env.IDEABUCKET_SIGNING_SECRET,
rawBody,
request.headers.get('x-ideabucket-signature'),
)
if (!ok) return new Response('Bad signature', { status: 401 })
const payload = JSON.parse(rawBody)
// … do something with payload.idea
return new Response(null, { status: 204 })
},
}Recent runs
Each time a rule fires, it creates a run. Recent runs on the Automations screen shows your latest 20 runs, with any runs waiting for you at the top. Each run shows the rule, the start of the idea, how long ago it ran and its status:
| Status | Meaning |
|---|---|
| Waiting | A Grok Bot dispatch waiting for you to select Send or Not now |
| Queued | The run is about to start |
| Running | The run is in progress |
| Done | It worked. Calendar runs show Open event. Grok Bot runs show "Sent", the run's id and, if an assistant sent it, by whom (like "Sent · run 1a2b3c · by Claude") |
| Failed | It didn't work. The reason is shown under the idea, with a Retry button |
| Skipped | There was nothing to do. The reason is shown next to the time |
Reasons a run is Skipped:
- Idea is in the trash
- Rule is turned off: the rule was off by the time the run started.
- Already archived
- No change: the tags were already as the rule wanted.
- Not sent: you chose Not now on a Grok Bot dispatch.
- Expired: nobody chose Send or Not now on a Grok Bot dispatch within 14 days.
Retry runs a failed run again straight away. It counts towards your hourly limits like any other run.
Limits
| Limit | Value |
|---|---|
| Rules | 50 per account |
| Runs | 300 per hour, across all your rules |
| AI notes | 100 per hour, which also count towards the 300 runs |
| Tags in an Add tags or Remove tags rule | 10 |
| AI note instruction | 1,000 characters |
| Time triggers | 1 hour to 1 year |
| Webhook and Grok Bot answer time | 10 seconds |
A run counts towards the hourly limits when it reaches its action, including runs that fail there. Skipped runs and Grok Bot runs waiting for your approval don't count. The Grok Bot Test button counts as one run.
Failure messages
These are the messages a Failed run can show, and what to do about each.
| Message | What it means and what to do |
|---|---|
| Timed out | The run started but didn't finish within 15 minutes. Select Retry. |
| Never started | The run waited in the queue for over an hour without starting, usually because of a temporary server problem. Select Retry. |
| Hourly automation limit reached | You've used 300 runs this hour. Retry after the hour is up. |
| Hourly AI note limit reached | You've used 100 AI notes this hour. Retry after the hour is up. |
| Couldn't check the automation limit | A temporary server problem. Select Retry. |
| The rule or the idea no longer exists | The rule or the idea was deleted. Nothing to retry. |
| Something went wrong running this automation | An unexpected error. Select Retry. If it keeps failing, check the rule's settings, or delete it and add it again. |
| The run finished but its result couldn't be saved | The action probably happened (check the idea or your calendar), but its result couldn't be saved. Retry only if it didn't happen. |
| The idea kept changing; try again | The idea's tags changed several times while the rule was updating them. Select Retry. |
| Google Calendar isn't connected | Connect Google Calendar at the top of Automations, then select Retry. |
| Google Calendar access was revoked. Reconnect it in Automations | Google no longer accepts the connection, for example because you removed Idea Bucket from your Google account. Select Disconnect, then Connect, then Retry. |
| Google Calendar refused the event. Reconnect it in Automations | Google refused the request. Reconnect as above. |
| Google Calendar didn't answer in time, Couldn't reach Google Calendar, Google didn't answer in time, Couldn't reach Google | A temporary problem reaching Google. Select Retry. |
| Google sign-in failed (…) or Google Calendar answered … | Google returned an error, with its status code. Retry later, or reconnect if it persists. |
| Gemini didn't answer within 25 seconds, Couldn't reach Gemini | A temporary problem reaching Gemini. Select Retry. |
| Gemini gave an empty answer | Gemini answered with nothing. Retry, or reword the instruction. |
| Could not save the note | The AI note couldn't be saved. Select Retry. |
| The webhook didn't answer within 10 seconds | Your endpoint was too slow. Answer with a 2xx first, then do slow work in the background. |
| Couldn't reach the webhook | The address doesn't resolve, refused the connection or has a TLS problem. Check the URL. |
| The webhook answered … | Your endpoint answered with this status code instead of 2xx. A 3xx means a redirect: use the final URL. A 401 often means your signature check failed: compare your code with Verify the signature. |
| Webhooks must use https, The webhook URL is invalid, The webhook URL can't contain a password | Fix the URL in the rule. |
| Webhooks can't reach local or private addresses | The URL points to, or resolves to, a local or private network address. Use a public HTTPS endpoint. |
| Grok Bot rejected the key, The routine is turned off in Grok Bot, Add the Grok Bot key in this rule | See Grok Bot troubleshooting. |