> ## Documentation Index
> Fetch the complete documentation index at: https://docs.weflayr.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Set revenue

> Book revenue per customer and month.

On an [internal project](/product/organizations-and-projects#internal-projects), go to [Manage Key metrics](/api/management/set-key-metrics) instead.

A customer can have several lines in the same month (in case of multiple billings).

## Parameters

<ParamField body="rows" type="array of row objects" required>
  The revenue lines to book, described below. Up to 1,000 per call.
</ParamField>

<ParamField body="upsert" type="boolean" default="false">
  If a row's `revenue_id` already exists (c.f. `rows` parameters below), overwrite it instead of throwing an error.
</ParamField>

Each object inside `rows` accepts:

<ParamField body="customer_name" type="string" required>
  The same `customer_name` you stamp on your LLM calls when [propagating metadata](/api/gateway/responses#weflayr-fields), so revenue and AI cost land on the same customer.
</ParamField>

<ParamField body="amount" type="number" required>
  The value to book.
</ParamField>

<ParamField body="month" type="&#x22;YYYY-MM&#x22;">
  The calendar month the value belongs to. Required unless you set `month_start` and `month_end` instead.
</ParamField>

<ParamField body="month_start, month_end" type="&#x22;YYYY-MM&#x22;">
  Bill over a multi-month period (e.g. quarterly) instead of a single `month`. `amount` is split evenly over the period. Set either `month`, or both `month_start` and `month_end`, never both forms on the same row.
</ParamField>

<ParamField body="revenue_id" type="string">
  An id for the revenue row over which uniqueness is checked, typically from a billing management system.
</ParamField>

<Note>
  API values are their own revenue source, alongside [Stripe and CSV](/product/sync-revenue). Sources add up: if you post revenue for a customer-month that also has a CSV upload or a Stripe sync, Weflayr assumes it is the sum. We recommend using one source only to avoid double counting.
</Note>

<RequestExample>
  ```python Python theme={null}
  import weflayr
  from weflayr.openapi.models import SetRevenueInput

  client = weflayr.client()  # reads WEFLAYR_API_KEY

  client.set_revenue(body=SetRevenueInput.from_dict({
      "rows": [
          {"customer_name": "c_123", "amount": 1200.50, "month": "2026-06"},
          {"customer_name": "c_456", "amount": 800, "month": "2026-06"},
      ]
  }))
  ```

  ```js Node.js theme={null}
  const weflayr = require('weflayr');

  const client = weflayr.client(); // reads WEFLAYR_API_KEY

  await weflayr.api.setRevenue({
    client,
    throwOnError: true,
    body: {
      rows: [
        { customerName: 'c_123', amount: 1200.50, month: '2026-06' },
        { customerName: 'c_456', amount: 800, month: '2026-06' },
      ],
    },
  });
  ```

  ```bash cURL theme={null}
  curl -X POST https://app.weflayr.com/api/revenue/ \
    -H "Authorization: Bearer $WEFLAYR_API_KEY" \
    -H "Content-Type: application/json" \
    -d '{
      "rows": [
        {"customer_name": "c_123", "amount": 1200.50, "month": "2026-06"},
        {"customer_name": "c_456", "amount": 800, "month": "2026-06"}
      ]
    }'
  ```
</RequestExample>

<ResponseExample>
  ```json 200 theme={null}
  {"ok": true, "rows_inserted": 2}
  ```
</ResponseExample>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.