---
name: prep-my-1099s
description: "Prep your 1099-NEC and 1099-MISC list for the tax year. I total year-to-date payments per vendor from your run history, flag eligible vendors (non-corporate, ≥ $600), split NEC from MISC, cross-reference W-9 status against the W-9s you have on file, and draft chase emails for missing W-9s as Gmail / Outlook drafts (or as plain `.md` files if no inbox is connected). I prep, you file via IRS FIRE, Track1099, or Tax1099. I never file and I never send."
version: 1
category: Bookkeeping
featured: no
image: ledger
integrations: [gmail, outlook]
---


# Prep My 1099s

1099-NEC and 1099-MISC prep for the tax year. I total payments per vendor from your run transactions, flag who's eligible, split NEC from MISC, cross-reference W-9 status, and draft chase emails for the missing W-9s. The chase emails sit in your Gmail or Outlook drafts (never sent) so you can review and click send. I prep — you file with the IRS.

## When to use

- "who are our 1099 vendors" / "prep the 1099 list for {year}".
- "draft chase emails for missing W-9s".
- Called by `hand-off-to-my-tax-preparer` as part of year-end package.
- Called in January for prior tax year (IRS deadline: Jan 31 for NEC).

## Connections I need

I run external work through Composio. Before this skill runs I check that the categories below are linked. Missing → I name the category, ask you to connect it from the Integrations tab, stop.

- **Gmail or Outlook** (inbox) — optional, lets me create draft chase emails directly to vendors with missing W-9s. I never send. If not connected I write the email text to a draft file you can copy.

This skill works fully offline against your run history. No connection blocks the run; the inbox connection just makes chase emails easier.

## Information I need

I read your bookkeeping context first. For every required field that's missing I ask ONE plain-language question (best modality: connected app > file drop > URL > paste) and wait.

- **The tax year** — Required. Why: defines the date range for year-to-date payment aggregation. If missing I ask: "Which tax year are we prepping the 1099 list for? In January I default to the year that just ended."
- **Your company's legal name and EIN** — Required. Why: drops into the 1099 payer block on every form. If missing I ask: "What's the company's legal name and EIN as registered with the IRS?"
- **A current run history covering the tax year** — Required. Why: I aggregate vendor payments from your processed runs. If missing I ask: "Have we processed statements for the tax year yet? If not, drop the bank and credit card statements so I can categorize them first."
- **W-9s on file for your contractors** — Optional. Why: lets me mark each 1099 vendor as "have-w9" and skip the chase email. If you don't have them in one place I ask: "Do you have W-9s collected anywhere? If not, I'll flag every eligible vendor as missing and draft chase emails for each."
- **A vendor email list** — Optional. Why: lets me address chase emails to each vendor directly. If you don't have it I leave the recipient blank in each draft and ask you to fill it in.

## Steps

1. **Read context.** Load `context/bookkeeping-context.md`, `config/context-ledger.json`, `config/chart-of-accounts.json`. Required ledger: `universal.company` (legal name + EIN for 1099 payer block), `domains.tax` (preparer name / email for cover note).

2. **Determine tax year.** User specified year → use it. Called in January no year → default to prior calendar year (`today.year - 1`)  -  that 1099 cycle. Called mid-year → use current year as running draft.

3. **Aggregate year-to-date payments per vendor.** Read every `runs/*/run.json` whose period overlaps tax year. Filter transactions to `amount < 0` (money out), group by `party` (canonical name). Sum absolute amounts per party within tax year date range. Cite every transaction by `(run period, date, amount)`  -  no invented payments.

4. **Exclude payments not 1099-reportable.**
   - Transfers (`gl_code == "9000"` / `source == "transfer"`).
   - Payments to corporations (S-corp / C-corp exempt except specific categories like attorney fees). Default-assume corporate if canonical party ends in `Inc`, `Corp`, `LLC` (W-9 confirms), `Corporation`, `Ltd`. Flag for user confirm  -  default exclude.
   - Payroll payments (go on W-2, not 1099).
   - Credit-card payments to vendor. Vendor paid exclusively via credit card → card issuer issues 1099-K  -  exclude from list. Flag any vendor paid only via credit card.
   - Reimbursements labeled pass-through.

5. **Apply 1099 eligibility thresholds.**
   - **1099-NEC**  -  contractors / services (account categories: professional services, contract labor, consulting, engineering contractors). Threshold: ≥ $600 year-to-date.
   - **1099-MISC**  -  rent, attorney fees (even if incorporated), prizes, medical payments, other. Threshold: ≥ $600 year-to-date.
   - Flag vendors straddling categories (e.g., law firm paid for both services and settlement)  -  user decides split.

6. **Cross-reference W-9 status.** Check `files/` (or user-provided vendor-W9 folder) for PDF matching each eligible vendor canonical name (fuzzy match, token-set-ratio ≥ 0.85). Record W-9 status per vendor: `have-w9` / `missing-w9` / `pending`. Vendor list with W-9 indicators provided at runtime → merge in.

7. **Draft chase emails for missing W-9s.** For every vendor flagged `missing-w9`:
   - Write `drafts/1099-chase-{vendor-slug}.md`  -  subject line, body, signature. Body references tax year, $ threshold, Form W-9 link (`https://www.irs.gov/pub/irs-pdf/fw9.pdf`), asks for return by specified date (default: Jan 15 for prior-year filing).
   - `composio search inbox` returns connected Gmail / Outlook slug → create inbox draft (never send) using vendor email if known from prior correspondence; include draft URL / id in `.md`. No connection → skip inbox step silently.
   - Cite canonical party, year-to-date paid, source run periods in draft body so user can verify before sending.

8. **Write `compliance/1099s/{year}.md`.** Atomic write. Structure:
   - **Payer block**  -  legal name, EIN, state.
   - **Summary**  -  NEC count, NEC $ total, MISC count, MISC $ total, missing-W-9 count.
   - **NEC recipients**  -  table: canonical party, year-to-date paid, account category breakdown, W-9 status, address (from W-9 if present; else `TBD`).
   - **MISC recipients**  -  same table shape.
   - **Excluded**  -  corporate exclusions, credit-card-only, payroll, transfers  -  one-line reason per row (so user can audit exclusions).
   - **Straddle cases**  -  vendors where NEC/MISC split needs judgment call, with options.
   - **Filing note**  -  "Prep only. File via IRS FIRE, Track1099, or Tax1099. Deadline: Jan 31 (NEC to recipient + IRS), Feb 28 paper / Mar 31 electronic (MISC to IRS)."

9. **Append to `outputs.json`.** Row: `{type: "vendor-1099-list", title: "1099 list {year}", summary, path: "compliance/1099s/{year}.md", status: "draft", domain: "compliance"}`. Read-merge-write.

10. **Summarize to user.** One paragraph: NEC count + $, MISC count + $, missing-W-9 count with chase-email paths, any straddle cases needing call, filing reminder ("I preplied  -  you file via FIRE / Track1099 / Tax1099"). Never file. Never send.

## Outputs

- `compliance/1099s/{year}.md` (indexed in `outputs.json` as `vendor-1099-list`)
- `drafts/1099-chase-{vendor-slug}.md` (one per missing W-9  -  not indexed; drafts)
- Optional inbox drafts in Gmail / Outlook via Composio (never sent)