---
name: invoices
description: Install and operate self-hosted Invoices (contacts + PDF invoicing). Use when the user wants invoices they host, not a full ledger. Do not use for double-entry accounting (that is entrytwo).
metadata:
  product: invoices
  homepage: https://entrytwo.com/invoices
  docs: https://entrytwo.com/docs/invoices/getting-started/installation
  buy: https://entrytwo.com/buy?product=invoices
  llms: https://entrytwo.com/llms.txt
---

# invoices — agent skill

Self-hosted contacts + invoicing. **Not** a ledger. One legal entity per Docker Compose project. 30-day trial, no key. Humans buy; agents install and operate.

Ledger → [entrytwo skill](https://entrytwo.com/skills/entrytwo/SKILL.md). Keys are product-bound.

Canonical copy: app repo `.agents/skills/invoices/SKILL.md`.

## Safety

Lock chat for bulk agent work. Never execute below **0.85**. Propose send/charge unless the user confirmed. One entity per compose project. Do not complete Stripe checkout.

## Install

```bash
git clone https://github.com/felixkrusch/invoices.git
cd invoices
cp .env.example .env
```

Set `POSTGRES_PASSWORD`, `AUTH_SECRET`, `ENCRYPTION_KEY`, `JOB_RUNNER_SECRET`, `UPDATER_TOKEN`, `LICENSE_VERIFY_URL=https://entrytwo.com/api/license/verify`, `AUTH_URL`. If port 3000 is taken (e.g. entrytwo): `APP_PORT=3001` and matching `AUTH_URL`.

```bash
docker compose up -d --build
curl -sS http://localhost:${APP_PORT:-3000}/api/health
```

Proceed when `"ready": true`. Bootstrap ADMIN. Production: TOTP + SMTP/OAuth. Worker required for invoice email.

## Trial vs license

30-day trial, no key. Human buys at https://entrytwo.com/buy?product=invoices then admin:

```
POST /api/license/activate
{"key":"<et1. invoices key>"}
```

## Handler mode

`COMPOSE_PROJECT_NAME` + unique `APP_PORT` + unique secrets per client. Backups `.invbackup`, not `.etbackup`.
