Mert Ozcetin
Available for AI roles · Mert’s timePORTFOLIO — 2026

Case study

Your team is doing work software should do

The missing step between Gmail and ClickUp: classify every unread email as a task or no_action, cite the source, and wait for a human before anything happens.

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.

TaskPriorityDueSource
Review Q2 proposal22026-08-05Aisha Khan - "Action required: review Q2 proposal by 2026-08-05" (Thu, 30 Jul 2026 10:20:00 -0400).
Review updated contract22026-08-10Jordan 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.