Track 1099 contractor payments against the $600 threshold

On the 2nd of every month, see which contractors have crossed the $600 reporting line this year and which are getting close, well before January.

Deterministic Code
PuzzleGoogle SheetsSlackFinanceOperationsDaily DigestsNotifications & AlertsData Sync
PromptCreate

On the 2nd of every month at 8am, build a running 1099 readiness worksheet for our contractors from our Puzzle books, write it to Google Sheets, and post one summary to Slack. Every step is a fixed lookup, a sum, or a threshold comparison, so build this as a deterministic code workflow rather than an agent. Use a cron trigger.

Expose these as editable inputs: the 1099 reporting threshold as a number defaulting to 600, the Google Sheet id and tab name for the worksheet, and the Slack channel to post to. The threshold has to be editable so we can set it lower, for example 500, to get an early warning before a contractor actually crosses.

Start with Puzzle Get Current User to resolve the company, taking the company id from companies[].id (ids are prefixed co_). If the account has access to more than one company, use the one matching an optional company name input, otherwise the first one. If any data read comes back 409 RESOURCE_PROCESSING, the company is still in Syncing status, so wait and retry with backoff a few times before failing. Never report a partial picture as if it were complete.

Call Puzzle Get Vendors with the 1099 filter to list every 1099 eligible vendor, keeping each vendor's id, name, type and status. This list is cursor paginated, so page through it fully using pageInfo.endCursor with the after parameter before moving on.

For each vendor, call Puzzle Get Transactions filtered by that vendor id and by a date range covering the current calendar year, from January 1 of the current year through the run date. Page through every result with pageInfo.endCursor and after before totalling anything. Stopping at the first page understates a total and silently misses a threshold crossing, which is the one thing this workflow exists to catch.

Puzzle monetary amounts are objects shaped { amount, currency }, where amount is an arbitrary precision decimal serialized as a string. Sum them as decimals, not as floating point numbers, so cents do not drift across hundreds of transactions. Net refunds and credits against payments so each total reflects what we actually paid that vendor. If a vendor has transactions in more than one currency, total each currency separately rather than adding them together, and compare the USD total to the threshold. A 1099 eligible vendor with no transactions this year still belongs in the table with a zero total.

Before writing anything, read the previous run's block back from the same sheet with Google Sheets Get Values so we can work out who is newly over the line. A vendor counts as crossed since last month if it is at or above the threshold now and was below it, or absent entirely, in the most recent previous block. On the very first run there is no prior block to compare against, so treat that run as the baseline and say so in the Slack message rather than reporting every vendor as newly crossed.

Now write the full table to the Google Sheet. If the tab is empty, first write a header row with Update Values: run date, vendor, vendor type, status, year to date paid, currency, and over threshold. Then append one row per vendor with Append Values, each stamped with the run date, so every month adds a dated block and the sheet becomes a running worksheet instead of a snapshot that overwrites itself. Sort the rows by year to date paid, highest first.

Finish with a single Slack Send a Message to the configured channel. Include the company name and the year to date period covered, the count of vendors at or over the threshold, the count still under it, and then name the vendors that crossed since last month along with their year to date totals. If nobody crossed this month, say that in one line rather than posting an empty section. Keep it to one message and format all money to two decimal places.

This is a read and report workflow. Do not create, update or file anything in Puzzle.

Example output

1099 readiness for Northwind Labs, Jan 1 to Aug 2 2026 7 contractors at or over the $600 threshold 12 still under Crossed since last month: • Marta Reyes Design, $1,240.00 year to date • Cobalt Copywriting LLC, $875.50 year to date • J. Okafor Consulting, $610.00 year to date Full worksheet updated in the 1099 Tracking sheet.

What does this prompt do?

  • Pulls every 1099 eligible vendor from your Puzzle books on the 2nd of each month and totals what you have actually paid each one so far this calendar year.
  • Marks each contractor as over or under the $600 reporting threshold, so your filing list is ready months before January.
  • Keeps a running worksheet in Google Sheets with vendor, type, status, year to date paid and threshold status, adding a fresh dated block every month.
  • Posts one Slack message with how many contractors are over the line, how many are still under, and exactly who crossed since last month.

What do I need to use this?

  • A Puzzle account with your bookkeeping connected, and read access to the company you want reported on.
  • Your contractors marked as 1099 eligible in Puzzle, since that flag is what the vendor list is built from.
  • A Google Sheet you want the running contractor worksheet written to.
  • A Slack workspace and the channel where your finance updates should land.

How can I customize it?

  • Lower the $600 threshold to something like $500 if you want an early warning before a contractor actually crosses the reporting line.
  • Move the run date or time. The 2nd of the month is chosen to give the previous month's bookkeeping time to settle, but any schedule works.
  • Point the summary at a different Slack channel, or send it as a direct message to whoever owns filing.
  • Add extra columns to the worksheet, such as vendor contact details, if you want the sheet to double as your filing prep list.

FAQs

What is the $600 threshold and why does it matter?
$600 is the standard IRS reporting threshold for 1099-NEC. If you pay an unincorporated contractor $600 or more across a calendar year, you generally need to file a 1099-NEC for them. This workflow tracks progress toward that line all year instead of reconstructing it in January. It is a tracking aid, not tax advice, so confirm the final list with your accountant.
Does this actually file my 1099s?
No. It prepares and maintains the list of who will need one and what you have paid them, so filing season becomes a review rather than a scramble. The filing itself still happens in your tax filing tool or with your accountant.
What counts as paid?
It totals the actual transactions recorded against each contractor for the current calendar year to date, not bills that have been raised but not yet paid. Refunds and credits are netted out so the number reflects money that genuinely went out the door.
What happens to contractors who are still under the threshold?
They stay in the worksheet with their running total, so you can see who is approaching the line. The Slack message includes a count of everyone still under, and the worksheet shows exactly how close each one is.
Why run it on the 2nd rather than the 1st?
Running a day into the new month gives the previous month's transactions time to land and be categorized, so the totals are not understated. You can change the date if your books close on a different rhythm.
What if my books are still syncing when it runs?
If Puzzle is still processing your data at run time, the workflow waits and tries again rather than reporting a half complete picture. You get accurate totals or a clear failure, never a quietly wrong list.

Related templates

Auto-fix your calendar when a flight slips, and flag what's at risk

When your flight moves, your calendar times get corrected automatically and you get a Slack note naming the meetings you're about to miss.

Google Calendar
AviationStack
Slack
Agentic Task
Trace phishing emails to the sending IP and report abuse

Every 15 minutes, forwarded phishing reports get traced back to the server that really sent them, with a verdict in Slack and the worst senders reported.

AbuseIPDB
Gmail
Slack
Agentic Task
Weekly Amazon S3 bucket security audit posted to Slack

Every Monday, check every S3 bucket for public exposure, missing encryption and weak backup settings, then get the risks ranked in Slack.

Amazon S3
Slack Bot
Google Sheets
Agentic Task
Turn procurement portal tenders into CRM deals each morning

Every weekday at 7am, sign in to the tender portals you track, filter new notices against your bid criteria, and open a deal for the ones worth chasing.

Anchor Browser
Google Sheets
HubSpot
+1
Agentic Task
Draft polite follow-ups for emails that never got a reply

Every weekday at 4pm, spot the threads that went quiet, stage a ready-to-send nudge in your mailbox, and get a ranked Slack recap.

Aurinko
Google Sheets
Slack Bot
Agentic Task
Turn each week's football fixtures into a venue staffing plan

Every Monday, rank the week's matches by expected demand, put the big ones on your venue calendar, and post a rota-ready summary to Slack.

API-Sports
Google Calendar
Slack
Agentic Task

Stop rebuilding your 1099 list every January.

Keep a running contractor payment worksheet all year, so filing season is a review instead of a fire drill.