Choosing Between Trello Butler and API Webhooks for Due-Date Card Moves
Decide between Trello Butler and API Webhooks for automating card moves on due dates. Compare limits, trade-offs, and see a Node.js implementation.
10 Jan 2026, 18:48 UTC

The Problem: Automating Card Transitions on Due Dates
Moving cards to a "Done" or "Overdue" list automatically when a due date passes prevents manual board cleanup and ensures visibility of stale tasks. The primary challenge is deciding between Trello's native no-code automation (Butler) and a custom external integration (API Webhooks) based on volume, technical resources, and logic requirements.
Decision Matrix: Butler vs. Webhooks
| Constraint | Trello Butler | Trello API Webhook |
|---|---|---|
| Setup Effort | Low (UI-based) | Medium (Requires hosting/coding) |
| Maintenance | None | Ongoing (TLS, Server uptime) |
| Execution Limit | 1,000 runs/day per workspace | Trello API rate limits (300 req/10 min) |
| Logic Flexibility | Native Trello actions only | Custom (External DBs, complex logic) |
Trade-offs and Constraints
Trello Butler is the optimal choice for small to medium teams. It requires zero infrastructure and is configured directly in the board. However, the 1,000-run daily limit is shared across the entire workspace; if multiple boards use heavy automation, Butler rules may silently fail without notification.
API Webhooks are necessary for high-volume boards or workflows requiring external validation (e.g., checking a Jira ticket status before moving the Trello card). The trade-off is operational overhead: you must maintain a publicly reachable HTTPS endpoint, verify the X-Trello-Signature header to prevent spoofing, and ensure your server responds with a 200 OK within 10 seconds to avoid Trello's retry logic, which can lead to duplicate card moves.
Implementation Path A: Trello Butler (No-Code)
- Navigate to your board and select Butler → Rules → Create Rule.
- Define the trigger: "when the due date is marked complete".
- Define the action: "move the card to list 'Done'".
- Save the rule.
Verification: Create a test card with a due date set to 2 minutes in the future. Once the date passes or the checkbox is clicked, verify the card moves to the "Done" list via the card's activity log.
Implementation Path B: Node.js Webhook (Custom)
This approach requires a server with a public URL and a Trello API token. Run this on a Node.js environment with express and axios installed.
const express = require('express');
const crypto = require('crypto');
const axios = require('axios');
const app = express();
// Middleware to capture raw body for signature verification
app.use((req, res, next) => {
let data = '';
req.setEncoding('utf8');
req.on('data', chunk => { data += chunk; });
req.on('end', () => {
req.rawBody = data;
next();
});
});
app.use(express.json());
const TRELLO_API_KEY = 'YOUR_API_KEY';
const TRELLO_TOKEN = 'YOUR_TOKEN';
const DONE_LIST_ID = 'YOUR_DONE_LIST_ID';
const WEBHOOK_SECRET = 'YOUR_WEBHOOK_SECRET';
function verifySignature(req, buf) {
const signature = req.get('X-Trello-Signature');
const hmac = crypto.createHmac('sha1', WEBHOOK_SECRET);
hmac.update(buf);
const expected = 'sha1=' + hmac.digest('hex');
return crypto.timingSafeEqual(Buffer.from(signature), Buffer.from(expected));
}
app.post('/trello-webhook', (req, res) => {
if (!verifySignature(req, req.rawBody)) {
return res.status(401).send('Invalid signature');
}
// Respond immediately to Trello to avoid timeouts/retries
res.sendStatus(200);
const action = req.body.action;
if (!action || action.type !== 'updateCard') return;
const card = action.data.card;
if (!card.due || new Date(card.due) > new Date()) return;
axios.put(`https://api.trello.com/1/cards/${card.id}`, {
key: TRELLO_API_KEY,
token: TRELLO_TOKEN,
idList: DONE_LIST_ID
}).catch(err => {
if (err.response && err.response.status === 429) {
console.error('Rate limit hit');
}
});
});
app.listen(3000, () => console.log('Webhook listening on port 3000'));
Deployment and Registration
1. Deploy the code to an HTTPS-enabled host.
2. Register the webhook via a POST request to https://api.trello.com/1/webhooks/ including your callbackURL and the idModel (Board ID).
3. Verification: Update a card's due date to a past timestamp. Check your server logs for the updateCard event and verify the card moves to the target list.
Limitations and Practical Checks
- Precision: Neither method is millisecond-accurate; Trello's internal due-date checker runs periodically.
- Butler Quotas: If cards stop moving, check Workspace Settings → Butler to see if the 1,000-run limit was hit.
- Webhook Retries: If your server returns anything other than
200 OK, Trello will retry the request, which may result in multiple API calls for the same card move.
0 replies
A thoughtful contribution can make all the difference. Be the first to share one.