# Sync JobNimbus jobs, invoices and payments to Google Sheets

> Every night, copy the last day of JobNimbus jobs, invoices and payments into one spreadsheet your bookkeeper and owner can pivot.

- Workflow type: code
- Services: JobNimbus, Google Sheets
- Categories: Operations, Finance
- Published: 2026-08-04

## What it does

- Runs on its own every night at 11pm and picks up every job, invoice and payment that was created or changed in JobNimbus in the past 24 hours.
- Files each record on its own tab of a single Google Sheet: one tab for jobs, one for invoices, one for payments.
- Writes plain readable dates instead of raw system timestamps, so the sheet is ready to sort, filter and pivot the moment you open it.
- Stamps every row with its JobNimbus record number and the date it was pulled, so repeated rows are easy to spot and clean up.

## What you'll need

- A JobNimbus account with permission to view jobs, invoices and payments.
- A Google account with access to Google Sheets.
- One Google Sheet created ahead of time with three tabs named Jobs, Invoices and Payments, each with a header row.

## Prompt

Every night at 11pm, pull the last 24 hours of activity out of JobNimbus and append it to three tabs of a single Google Sheet, so my bookkeeper and my owner can pivot the numbers themselves instead of me copying them out by hand each week. Use a cron trigger set to 11pm daily. JobNimbus does not offer a poll trigger, so a scheduled run plus list operations is the correct shape here.

Start by capturing a single run date for the whole execution and reuse it on every row, so all rows written by one run share the same stamp. Then make three JobNimbus calls: List Jobs, List Invoices and List Payments. Narrow each one to recently touched records with the JobNimbus filter DSL, URL-encoded as the filter query parameter: {"must":[{"range":{"date_updated":{"gte":"now-1d"}}}]}. This keeps each nightly run small rather than pulling the whole account every time.

Page each list call properly. These endpoints are offset based: size sets the page size (default 1000, max 1000) and from is the zero-based offset. Advance by increasing from by size, and stop when a page returns fewer rows than size. Do not use the count field in the response envelope to decide when to stop. Responses come back shaped { count, results } where count is the total number of matching records in the account, not the size of the page you just received. Be aware that some JobNimbus list endpoints name the array files or activity instead of results, so read the array defensively rather than assuming the key.

JobNimbus timestamps are Unix epoch seconds. Convert every one of them to a plain readable date before it reaches the sheet, so nobody opens the spreadsheet to a column of ten digit numbers. Records are keyed by jnid, which is also surfaced as id; carry that value onto every row.

Append the jobs to a Jobs tab using the Google Sheets Append Values operation, with these columns: job name, customer, status, record type, sales rep, and created date. Append the invoices to an Invoices tab with: invoice number, customer, amount, due date, and the job the invoice is linked to. Append the payments to a Payments tab with: amount, date, method, and the invoice the payment applies to. All three tabs live in the same spreadsheet.

Every row on every tab must also carry two extra columns: the JobNimbus record id for that record, and the run date captured at the start of the execution. Those two columns are what let rows be deduplicated downstream, so never omit them. Append rows rather than overwriting, so the sheet accumulates history across runs.

If one of the three list calls returns no records for the window, skip the append for that tab and carry on with the others rather than failing the whole run. A quiet night for payments should not stop jobs and invoices from landing.

## How to customize

- Change the timing. Run it earlier in the evening, or a few times a day if your crews update jobs late.
- Change the columns on any tab, for example adding the job address, the invoice status or the estimator.
- Widen or narrow the window, for example pulling the last seven days instead of the last one.

## FAQ

### Will this overwrite what is already in my spreadsheet?

No. Each run adds new rows underneath whatever is already on the tab, so your history builds up over time and nothing you have typed in gets replaced.

### What happens if the same job changes two nights in a row?

It shows up once for each night it changed. That is why every row carries the JobNimbus record number and the date it was pulled: you can group by record number and keep the most recent row, or drop the older ones with a quick filter.

### Do I need to set up the spreadsheet first?

Yes. Create one Google Sheet with three tabs named Jobs, Invoices and Payments before the first run, and give each tab a header row. After that the workflow just keeps adding to them.

### Will this still work if we run thousands of jobs?

Yes. It only asks for records that changed in the last day, and it pulls them in batches rather than all at once, so a busy account will not choke it.

### Can my bookkeeper use this without a JobNimbus login?

Yes. That is the point. They only need access to the Google Sheet, so you are not paying for extra seats just to hand over numbers.

Use this prompt in General Input: https://www.generalinput.com/prompts/sync-jobnimbus-jobs-invoices-and-payments-to-google-sheets