> For the complete documentation index, see [llms.txt](https://docs.kick.co/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.kick.co/ai/cli/cli-use-case-library/monthly-reporting.md).

# Monthly Reporting

Export profit and loss JSON for every entity, compare periods, and archive reports for client delivery using verified Kick CLI commands.

<details>

<summary><strong>Generate P&#x26;L JSON for every entity</strong> (read)</summary>

To archive profit and loss data for each entity in a workspace, resolve ledger ids and export JSON. The CLI does not emit PDF; save JSON and convert externally if you need PDF.

**The Script**

```bash
#!/bin/bash
# monthly-pl-reports.sh

WORKSPACE_ID="<workspace-id>"
START_DATE="2026-01-01"
END_DATE="2026-01-31"
OUTPUT_DIR="./reports/${START_DATE}-to-${END_DATE}"

mkdir -p "$OUTPUT_DIR"

kick workspaces list --include-entities --fields id,name,entities --output json | \
  jq -r --arg ws "$WORKSPACE_ID" '.[] | select(.id == $ws) | .entities[]? | "\(.id)\t\(.name)"' | \
while IFS=$'\t' read -r entity_id entity_name; do
  ledger_id=$(kick --workspace "$WORKSPACE_ID" accounting ledgers get --entity-id "$entity_id" --output json | jq -r '.ledgers[0].id')
  safe_name=${entity_name// /-}

  echo "Generating P&L for $entity_name (entity $entity_id)..."

  kick --workspace "$WORKSPACE_ID" reports profit-loss \
    --entity "$entity_id" \
    --ledger-id "$ledger_id" \
    --start-date "$START_DATE" \
    --end-date "$END_DATE" \
    --cycle month \
    --output json \
    > "$OUTPUT_DIR/pl-${safe_name}-${START_DATE}.json"

  echo "Saved $OUTPUT_DIR/pl-${safe_name}-${START_DATE}.json"
done

echo "All reports saved in $OUTPUT_DIR"
```

**How to Customize**

* Change `START_DATE` and `END_DATE` to the period you are closing
* Add `--comparisons previous_period` to include a comparison column in the report output
* Filter entities in the `jq` step if you only need active clients

**What It Outputs**

* One JSON file per entity in `./reports/<start>-to-<end>/`
* Filename format: `pl-Entity-Name-2026-01-01.json`

</details>

<details>

<summary><strong>Compare month-over-month with built-in comparisons</strong> (read)</summary>

To see current-period profit and loss beside the previous period for one entity, use the report comparison flags instead of running two separate exports.

**The Script**

```bash
#!/bin/bash
# mom-pl-comparison.sh

WORKSPACE_ID="<workspace-id>"
ENTITY_ID=123
START_DATE="2026-02-01"
END_DATE="2026-02-28"

ledger_id=$(kick --workspace "$WORKSPACE_ID" accounting ledgers get --entity-id "$ENTITY_ID" --output json | jq -r '.ledgers[0].id')

kick --workspace "$WORKSPACE_ID" reports profit-loss \
  --entity "$ENTITY_ID" \
  --ledger-id "$ledger_id" \
  --start-date "$START_DATE" \
  --end-date "$END_DATE" \
  --cycle month \
  --comparisons previous_period \
  --output json | jq .
```

**How to Customize**

* Change `ENTITY_ID` and the date range
* Add `--comparison-diffs amount` or `--comparison-diffs percent` to control how differences display
* Run for multiple entities by looping over ids from `kick workspaces list --include-entities`

**What It Outputs**

* Formatted JSON profit and loss with a previous-period comparison column
* Pipe through `jq` to extract the rows you need for a spreadsheet

</details>

<details>

<summary><strong>Archive trial balance before statements</strong> (read)</summary>

To snapshot trial balance rows before you prepare statements, export JSON for one entity.

**The Script**

```bash
#!/bin/bash
# trial-balance-export.sh

WORKSPACE_ID="<workspace-id>"
ENTITY_ID=123
START_DATE="2026-01-01"
END_DATE="2026-01-31"
OUTPUT_FILE="trial-balance-${ENTITY_ID}-${END_DATE}.json"

ledger_id=$(kick --workspace "$WORKSPACE_ID" accounting ledgers get --entity-id "$ENTITY_ID" --output json | jq -r '.ledgers[0].id')

kick --workspace "$WORKSPACE_ID" reports trial-balance \
  --entity "$ENTITY_ID" \
  --ledger-id "$ledger_id" \
  --start-date "$START_DATE" \
  --end-date "$END_DATE" \
  --cycle month \
  --output json \
  > "$OUTPUT_FILE"

echo "Saved $OUTPUT_FILE"
```

**How to Customize**

* Add `--fields` to limit columns when the full row set is too large
* Use `--limit` and `--cursor` to page through very large trial balances

**What It Outputs**

* A JSON file with trial balance rows for the entity and period

</details>


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation by asking a question.

Perform an HTTP GET request on the following URL with the `ask` and `goal` query parameters:

```
GET https://docs.kick.co/ai/cli/cli-use-case-library/monthly-reporting.md?ask=<question>&goal=<user_goal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is what the user is ultimately trying to achieve, the reason they need the answer. Sharing it helps GitBook give you a better, more relevant answer. A goal is most helpful when it describes the outcome the user wants rather than restating the question. For example, with `ask=how do I create an API token`, a goal like `automate deployments from our CI pipeline` lets GitBook tailor the answer to that use case.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
