NeetoInvoice CLI

Work with your time entries and invoices from your terminal, your scripts, and your coding agent. Open source, and it runs on macOS, Linux and Windows.

Install the NeetoInvoice CLI

macOS with Homebrew:

brew install neetozone/tap/neetoinvoice

macOS or Linux:

curl -fsSL https://neetoinvoice.com/cli/install.sh | sh

Windows (PowerShell):

irm https://neetoinvoice.com/cli/install.ps1 | iex

Next, sign in to NeetoInvoice. This opens your browser, so there's no API key to copy or manage:

neetoinvoice login --subdomain your-workspace

To let your AI coding assistant use the NeetoInvoice CLI, run the appropriate setup command from your project folder:

neetoinvoice setup claude      # Claude Code
neetoinvoice setup cursor      # Cursor
neetoinvoice setup codex       # Codex
neetoinvoice setup copilot     # GitHub Copilot
neetoinvoice setup gemini      # Antigravity CLI and Gemini CLI
neetoinvoice setup windsurf    # Devin (formerly Windsurf)

Every command supports --json for structured output and --toon for a more compact format that uses fewer tokens when processed by AI assistants. See the NeetoInvoice CLI reference for the complete list of commands.

Automate with the CLI

Why have a CLI when MCP exists? Because some jobs shouldn't need an AI at all. These run on a schedule, with nothing but the neetoinvoice binary and the tools you already use, such as jq and curl. No model account, no cost per run, and the same result every time.

Nudge people who missed yesterday's timesheet

day=$(date -d yesterday +%F)   # on macOS: date -v-1d +%F

neetoinvoice reports missing-entries \
  --start-date "$day" --end-date "$day" --json \
  | jq -r '.data.users[].user_email' | while read -r email; do
    text="$email hasn't logged time for $day"
    curl -s -X POST -H "Content-Type: application/json" \
      -d "$(jq -n --arg text "$text" '{text: $text}')" \
      "$SLACK_WEBHOOK_URL"
  done

Weekends don't count as missing, and neither does a day with time logged to a holiday or PTO task, so this is safe to run every weekday.

Weekly hours report

Every Monday, write last week's hours per person to a CSV.

START=$(date -d "7 days ago" +%F)   # on macOS: date -v-7d +%F
END=$(date -d yesterday +%F)        # on macOS: date -v-1d +%F

neetoinvoice reports timesheet-summary \
  --start-date "$START" --end-date "$END" --json \
  | jq -r '.data.users[]
      | [.user_name, .user_email, .total_hours] | @csv' \
  > "hours-$START.csv"

Monthly payroll export

neetoinvoice reports payroll-summary --month 9 --year 2026 --json \
  | jq -r '.data.rows[]
      | [.user_name, .user_email, .working_days, .present_days,
         .lop_days]
      | @csv' \
  > payroll-2026-09.csv

Review unbilled time before invoicing

Export a project's unbilled hours so someone can check them before the invoice goes out.

page=1
while :; do
  out=$(neetoinvoice time-entries list \
    --client "$CLIENT_ID" --project "$PROJECT_ID" \
    --start-date 2026-09-01 --end-date 2026-09-30 \
    --page "$page" --page-size 100 --json) || exit 1
  echo "$out" | jq -r '.data[]
    | [.recorded_on, .user_name, .task_name, .hours, .notes] | @csv'
  total=$(echo "$out" | jq '.pagination.total_pages')
  [ "$total" -le "$page" ] && break
  page=$((page + 1))
done > unbilled-september.csv

Log time from another tool

Record time from your own tools, such as a pairing timer or a calendar sync.

neetoinvoice time-entries create \
  --client "$CLIENT_ID" --project "$PROJECT_ID" --task-id "$TASK_ID" \
  --user-email oliver@example.com --recorded-on "$(date +%F)" \
  --hours 2.5 --notes "Pairing session on the checkout flow"

Add PTO every month

Save this as ~/add-pto.sh and make it executable:

#!/bin/sh
neetoinvoice monthly-ptos update-earned \
  --email oliver@example.com --email sam@example.com \
  --month "$(date +%-m)" --year "$(date +%Y)" --pto-earned 12

Then add it to your crontab to run at 6am on the 1st of every month:

0 6 1 * * ~/add-pto.sh

Add new hires

neetoinvoice team-members create \
  --email jane@example.com --email alex@example.com \
  --role "Regular User"

Let a coding agent build it for you

You don't have to write these scripts yourself. Claude Code, Codex, or another coding agent can write the automation and use the open-source NeetoInvoice CLI to work with your account. Run neetoinvoice setup claude (or setup codex, setup cursor) once, then ask:

Every weekday at 10 AM, use the NeetoInvoice CLI to message anyone who didn't log time yesterday on Slack. Write the script, test it, and set up the cron job.

Using the NeetoInvoice CLI, write a script that exports last month's hours per person and per project to a spreadsheet for payroll.

You get the convenience of a chat, and the result is a script you can read, run, and commit.

Terminal recording of Claude Code. It reads timesheet reports with the neetoinvoice CLI, writes a script that messages people who did not log time yesterday on Slack, tests it in dry-run mode, and adds a cron job that runs at 10 AM on weekdays.
Claude Code builds the timesheet reminder with the NeetoInvoice CLI, tests it, and schedules it with cron.

When to use the CLI and when to use MCP

Both work with the same clients, projects, and time entries. Pick based on how the work reaches NeetoInvoice.

Use MCP when:

  • The details are in your head or your chat. "Three hours on the Acme mockups yesterday" becomes a time entry without clicking through menus.
  • You want to review before billing. Checking unbilled time, creating an invoice, and sending it works best as a conversation.
  • You don't use a terminal. NeetoInvoice hosts the server. There's nothing to install.

Use the CLI when:

  • No AI should be in the loop. A cron job runs the CLI with nothing but the binary. No model account, no cost per run.
  • The output feeds another program. Payroll and timesheet reports come out as JSON for jq, a spreadsheet, or your payroll system.
  • The run has to be repeatable. A command records exactly what ran and does the same thing every time.

You can also have both. With neetoinvoice setup claude, your AI assistant drives the CLI for you, so a plain-language request still ends in a command you can read and reuse.

Open source

The NeetoInvoice CLI is open source and available on GitHub. You can inspect its code, see exactly what it sends to NeetoInvoice, and customize it for your workflows. Written in Go, it runs on macOS, Linux, and Windows.

The NeetoInvoice CLI is built on neeto-cli-commons, the shared foundation for all Neeto CLI tools. This means the commands and conventions you learn in one Neeto CLI will feel familiar across the others.

Found a bug or have an idea for a new command? Open an issue or submit a pull request on GitHub.

Frequently asked questions

Can I automate NeetoInvoice without using AI?

Yes. The NeetoInvoice CLI works directly from your terminal, shell scripts, cron jobs, and CI workflows. You don't need Claude, ChatGPT, or any other AI service to automate tasks.

Is the NeetoInvoice CLI open source?

Yes. The NeetoInvoice CLI is open source and available on GitHub. You can inspect the code, modify it, and contribute improvements.

Ready to simplify time tracking and invoicing?

Get started with NeetoInvoice today.