---
name: gmail-lead-desk
description: 'Gmail Lead Desk — standalone sales/CS Gmail skill via the AISA gateway:
  OAuth connect, scan unread leads, summarize threads, draft template replies (default
  draft-only), archive with labels. Keywords: Gmail Lead Desk, Gmail, lead desk, sales,
  customer support, follow-up, unread, inquiry summary, draft reply, archive, OAuth,
  AISA, connected account, thread_id. Use when: the user needs this workflow''s domain-specific
  automation or guidance.'
author: AIsa
version: 1.0.1
license: MIT
homepage: https://aisa.one
source: https://github.com/baofeng-tech/agent-skills-io/tree/main/targetSkills/gmail-lead-desk
user-invocable: true
primaryEnv: AISA_API_KEY
requires:
  env:
  - AISA_API_KEY
metadata:
  aisa:
    emoji: 🛠
    requires:
      env:
      - AISA_API_KEY
    primaryEnv: AISA_API_KEY
    compatibility:
    - openclaw
    - claude-code
    - hermes
  openclaw:
    emoji: 🛠
    requires:
      env:
      - AISA_API_KEY
    primaryEnv: AISA_API_KEY
---

# Gmail Lead Desk (`gmail-lead-desk`) 📧

**Gmail Lead Desk** — standalone sales and customer-support Gmail workflows via the AISA gateway.

One skill: connect Gmail, run whitelisted tools, triage inbox, draft replies, archive deals — no other skill required.

## Quick start

```bash
export AISA_API_KEY="your-key"   # get at https://aisa.one
```

> **Pre-flight checks (do first, stop if fails):**
> 1. `AISA_API_KEY` is set — if not, ask the user to set it before any API call.
> 2. `user_id` is known — use the Gmail address the user provides. If not yet known, ask: "What Gmail address should I use as your identity?"
> 3. Gmail is `ACTIVE` — run Workflow 0 if `connected_account_id` is missing or not `ACTIVE`.

- **Base URL:** `https://api.aisa.one`
- **Auth:** `Authorization: Bearer $AISA_API_KEY`
- **Windows:** use `curl.exe`

OAuth and `tools/execute`: [`references/connect_and_execute.md`](./references/connect_and_execute.md)

## When to use

- Connect or reconnect **Gmail** via OAuth
- Scan **unread leads** needing follow-up
- **Summarize** inquiry/support threads (CRM format)
- **Draft** replies from sales templates (default: do not send)
- **Archive** won deals with labels
- User mentions: unanswered, follow-up, inquiry, quote, draft, archive, lead, connect Gmail

## When NOT to use

- Non-Gmail apps (Slack, GitHub, etc.) — out of scope
- Proactive new-mail automation — not MVP; see `references/workflows.md` § Future
- Bulk permanent delete, filter creation — disabled unless user explicitly requests

## Intent → Workflow Quick Reference

| User intent | Workflow | Reference |
|-------------|----------|-----------|
| Connect Gmail / OAuth / authorize | **0** Connect Gmail | `references/connect_and_execute.md` |
| Unanswered / follow-up / unread | **A** Unread lead scan | `references/workflows.md` § A |
| Summarize / summary / summarize thread | **B** Thread summary | `references/workflows.md` § B |
| Reply for me / draft reply / write email | **C** Draft (no send) | `references/workflows.md` § C |
| Confirm send / send now | **C-send** Send after confirm | `references/workflows.md` § C-send |
| Archive / deal closed | **D** Label and archive | `references/workflows.md` § D |

> Run **Workflow 0** first if Gmail is not connected (`ACTIVE` `connected_account_id`).

---

## Workflow 0 — Connect Gmail (summary)

1. `GET /auth_configs?toolkit_slug=gmail` → `auth_config_id`
2. `GET /connected_accounts?toolkit_slugs=gmail&user_ids={user_id}` — reuse `ACTIVE` if present
3. Else **confirm**, then `POST /connected_accounts/link` → user opens `redirect_url`
4. Poll every 3–5 s until `status` is `ACTIVE`; save `connected_account_id`
   - **Timeout after ~2 min (24 polls):** stop polling, tell user "OAuth not completed — please try again or check the browser tab."
   - `DISCONNECTED` / `REVOKED`: re-run from step 3.

Full steps: [`references/connect_and_execute.md`](./references/connect_and_execute.md)

---

## Core Workflows (summary)

### A — Unread lead scan

1. Resolve `connected_account_id` (Workflow 0).
2. `GMAIL_FETCH_EMAILS` with sales default query — see `workflows.md`.
3. Table: **Sender | Subject | Days waiting | thread_id | Suggested action**.
4. **Do not send** at end of this workflow.

### B — Thread summary (CRM-ready)

1. `GMAIL_FETCH_MESSAGE_BY_THREAD_ID`; sort by `internalDate`.
2. Fixed sections: customer, need, budget/timeline, next action, attachments (**unverified** when inferred).

### C — Template draft (default: no send)

1. Load thread (B); confirm recipient, tone, quote/link.
2. `GMAIL_REPLY_TO_THREAD` or `GMAIL_CREATE_EMAIL_DRAFT`; **empty subject** when `thread_id` set.
3. Return `draft_id` + preview.

### C-send — Send only on explicit request

- User says **send / confirm send / send now**.
- Show full To/Cc/subject/body; confirm; then `GMAIL_SEND_DRAFT` or `GMAIL_SEND_EMAIL`.

### D — Archive and label

1. `GMAIL_LIST_LABELS` → `Label_*` IDs only.
2. `GMAIL_CREATE_LABEL` if needed (confirm).
3. Sample ≤5 `messageIds` + count → `GMAIL_BATCH_MODIFY_MESSAGES`.

**Never guess `tool_slug`.** Whitelist: [`references/tool_whitelist.md`](./references/tool_whitelist.md).

---

## Safety

| Action | Rule |
|--------|------|
| Default after A/B/C | **Draft only** — no auto-send |
| OAuth link / create auth config | Confirm with user |
| Create draft | Confirm recipient and thread |
| Send | Explicit user request + show To/Cc |
| Batch label/archive | ≤5 sample IDs + total count |
| Batch delete / filters | **Refuse** in MVP unless explicit cleanup request |
| Privacy | No uploading full mailbox externally; attachments need consent |
| Rate limits | Concurrency ≤10; backoff on 429 |

Gmail pitfalls: [`references/gmail_gotchas.md`](./references/gmail_gotchas.md).

---

## Reference routing

| Need | File |
|------|------|
| API key, OAuth, execute | `references/connect_and_execute.md` |
| Sales workflows A–D | `references/workflows.md` |
| message_id, labels, drafts | `references/gmail_gotchas.md` |
| Allowed tool slugs | `references/tool_whitelist.md` |

**Lookup order:** intent → Workflow 0 if needed → `workflows.md` → `tool_whitelist.md` → `GET /tools/{tool_slug}` → `POST /tools/execute/{tool_slug}`.

---

## Troubleshooting

| Symptom | Action |
|---------|--------|
| `AISA_API_KEY` not set | Ask user to run `export AISA_API_KEY="..."` before any API call |
| `user_id` unknown | Ask "What Gmail address should I use as your identity?" |
| No Gmail connection | Workflow 0 in `connect_and_execute.md` |
| OAuth poll timeout (>2 min) | Tell user to check browser tab; re-run Workflow 0 step 3 |
| `Invalid id value` | See `gmail_gotchas.md` |
| Label not applied | Used display name — `GMAIL_LIST_LABELS` for `id` |
| New thread on reply | Subject set on draft — leave subject empty |
| `successful: false` | `connect_and_execute.md` §4 + re-fetch tool schema |
| Deprecated `GMAIL_LIST_MESSAGES` | Use `GMAIL_FETCH_EMAILS` |
