Most of what lands in an inbox is not a request. It is receipts, newsletters, shipping alerts, and system noise. The real work is the decision: is this asking me to do something? That decision is repetitive and rule-based, which makes it a candidate for automation.
This script is the judgment layer. It pulls unread Gmail via gmail-unread.py, reads subject, sender and date only, and routes each item to either a ClickUp-ready task or a no_action list. The no_action list is kept visible so nothing is silently dropped.
It is deliberately passive. It writes a JSON file. It does not create tasks, send mail, or mark anything read. A human reviews the JSON, then runs inbox-to-clickup.py if it looks right.
It will not act
The script only writes JSON. It does not create ClickUp tasks, send replies, mark messages read, or touch the inbox. A human reviews the output and runs inbox-to-clickup.py separately.
It will not invent tasks
Newsletters, receipts, shipping alerts, onboarding welcomes and system notifications go into a no_action list with a reason. If a subject is too vague to know the real request ("Quick question", "Team lunch tomorrow?"), it also goes to no_action. Nothing is silently dropped.
It will not invent due dates
A due field is set only when the subject itself states a deadline. If there is no visible deadline, the field is omitted. A made-up date is worse than no date.
It has only subject, sender and date
It never sees the body, so it stays conservative. It classifies from what is visible, cites the source email by sender and subject, and refuses to pretend it knows more.
The fixture has 11 synthetic unread emails. The script produced2 tasks and 9 no_action items. This is the real output, not a mock-up.
| Task | Priority | Due | Source |
|---|---|---|---|
| Review Q2 proposal | 2 | 2026-08-05 | Aisha Khan - "Action required: review Q2 proposal by 2026-08-05" (Thu, 30 Jul 2026 10:20:00 -0400). |
| Review updated contract | 2 | 2026-08-10 | Jordan Lee - "Please review the updated contract by 2026-08-10" (Thu, 30 Jul 2026 09:50:00 -0400). |
no_action
- Domain registered - mertozcetin.comCloudflare <noreply@cloudflare.com>auto-generated domain registration confirmation
- Your HighLevel Voice AI Agency workshop starts Jul 6-7HighLevel <hello@gohighlevel.com>marketing event notification
- Perplexity Weekly: new discovery featuresPerplexity <news@perplexity.ai>newsletter
- Receipt for your purchase from StripeStripe <receipts@stripe.com>receipt
- Invoice #1024 is due August 1, 2026QuickBooks <quickbooks@notification.intuit.com>auto-generated billing notification with due date but no explicit request
- Welcome to NotionNotion <team@makenotion.com>onboarding welcome
- Your Amazon order has shippedAmazon <shipment-tracking@amazon.com>shipping notification
- Team lunch tomorrow?Dan Roberts <dan@exampleclient.com>subject too vague without body
- New sign-in from Chrome on WindowsGoogle <no-reply@accounts.google.com>system security alert
The fixture data is synthetic and contains no real personal information. The output shown is what the script produced when run with--in scripts/inbox-triage.example.json.