---
title: "Start the reviewed billing plan with Stripe or record outside billing"
method: POST
path: "/firm/crm/proposals/{id}/companies/{engagementId}/billing/start"
tags: ["CRM Proposals"]
---

# Start the reviewed billing plan with Stripe or record outside billing

`POST /firm/crm/proposals/{id}/companies/{engagementId}/billing/start`

## Request

- Base URL: `https://ledgerhq.pro/api/v1`
- URL: `https://ledgerhq.pro/api/v1/firm/crm/proposals/{id}/companies/{engagementId}/billing/start`
- Auth: one of:
  - HTTP bearer and API key in header `x-organization-id`
  - HTTP bearer and API key in header `x-organization-id`

Firm-side proposals. Select the firm with x-organization-id. Reads require active staff membership and access to every linked company; prospects are visible to their creator or firm managers. Writes require Firm Owner/Admin and billing permission. OAuth requires the broad mcp grant. Saves are revision-checked and idempotent using a stable requestId. All amounts are integer USD cents. Historical service dates and separately priced backwork are supported; saves never send, sign, provision companies or charge. Invalid dates, overlapping backwork/ongoing coverage and deposits exceeding the fee are rejected.

## Path parameters

- `id` string, uuid, required
- `engagementId` string, uuid, required

## Request body

- object
  - `timeZone` string: Billing timezone, displayed during review. Date-based collections are scheduled at 09:00 in this timezone.
  - `firstChargeOn` string, required: First collection date, today or later; historical service dates do not initiate collection
  - `firstUnpaidPeriods` object: First unpaid recurring period for each service line; omit to use agreed ongoing coverage start. Already-paid periods can be skipped explicitly.
  - `requestId` string, uuid, required: Stable billing activation request UUID; reuse unchanged on retry
  - `expectedPlanHash` string, required: Hash from the reviewed billing preview
  - `confirmed` true, required: Firm authorization to collect exactly the reviewed charges and start the schedules
  - `method` 'stripe' | 'outside': stripe collects through the firm's connected Stripe account; outside records that the firm bills this engagement elsewhere and creates no charge
  - `acknowledgeExistingBilling` boolean: Required when the company already has linked Stripe subscriptions outside this proposal history; confirms both will continue

## Response `200`

Success

- object

## Other responses

- `400`: Invalid input
- `403`: Insufficient firm authority
- `404`: Record not found or not accessible
- `409`: Revision, request identity or immutable-state conflict; preserve unsaved edits

---

[API](https://skmtc.dev/ledgerhq-pro/apis/ledgerhq-bookkeeping-api.md) · [All operations](https://skmtc.dev/ledgerhq-pro/apis/ledgerhq-bookkeeping-api/llms.txt) · [OpenAPI document](https://skmtc.dev/ledgerhq-pro/apis/ledgerhq-bookkeeping-api/revisions/9a8269f0a586?raw)
