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

# Создайте коммерческое предложение или счёт из Twenty

> Автоматически создавайте счёта во внешних инструментах при закрытии сделок.

Автоматически отправляйте данные по сделке в вашу систему выставления счетов (Stripe, QuickBooks, Xero и т. д.). когда сделка выиграна.

## Структура рабочего процесса

1. **Триггер**: Запись обновлена (объект 'Сделка')
2. **Фильтр**: Этап = Закрыто — выиграно
3. **Поиск записи**: Получить сведения о компании
4. **Код** (необязательно): Сформатировать полезную нагрузку
5. **HTTP-запрос**: Отправить в систему выставления счетов

## Шаг 1: Настройте триггер

1. Создайте новый рабочий процесс
2. Выберите триггер **Запись обновлена**
3. Выберите **Сделка** в качестве объекта

## Шаг 2: Отфильтруйте по «Закрыто — выиграно»

Добавьте действие **Фильтр**, чтобы продолжать только когда сделка выиграна:

| Настройка | Значение |
| - | - |
| **Поле** | Этап |
| **Условие** | Равно |
| **Значение** | `CLOSED_WON` (или название вашего этапа) |

<Tip>
  Триггер срабатывает при любом обновлении Сделки. Фильтр гарантирует, что рабочий процесс продолжится только когда этап изменится на «Закрыто — выиграно».
</Tip>

## Шаг 3: Получите сведения о компании

Запись Сделки может не содержать всех полей Компании, которые нужны для счёта. Добавьте действие **Поиск записи**:

| Настройка | Значение |
| - | - |
| **Объект** | Компания |
| **Сопоставление по** | ID равен `{{trigger.object.companyId}}` |

Это вернёт полную запись Компании с платёжным адресом, налоговым идентификатором и т. д.

## Шаг 4: Сформатируйте полезную нагрузку (необязательно)

Если ваша система выставления счетов ожидает определённый формат, добавьте действие **Код**:

```javascript theme={null}
export const main = async (params: {
  opportunity: any;
  company: any;
}): Promise<object> => {
  const { opportunity, company } = params;

  return {
    invoice: {
      // Customer info from Company
      customer_name: company.name,
      customer_email: company.email || "",
      billing_address: {
        line1: company.address?.street || "",
        city: company.address?.city || "",
        postal_code: company.address?.postalCode || "",
        country: company.address?.country || ""
      },
      tax_id: company.taxId || null,

      // Invoice details from Opportunity
      amount: opportunity.amount,
      currency: opportunity.currency || "USD",
      description: `Invoice for ${opportunity.name}`,
      due_days: 30,

      // Reference back to Twenty
      metadata: {
        opportunity_id: opportunity.id,
        company_id: company.id
      }
    }
  };
};
```

## Шаг 5: Отправьте в систему выставления счетов

Добавьте действие **HTTP-запрос**:

| Настройка | Значение |
| - | - |
| **Метод** | POST |
| **URL-адрес** | Конечная точка API вашей системы выставления счетов |
| **Заголовки** | `Authorization: Bearer YOUR_API_KEY` |
| **Содержимое** | `{{code.invoice}}` или сопоставьте поля напрямую |

### Пример: счёт Stripe

```
POST https://api.stripe.com/v1/invoices
Headers:
  Authorization: Bearer sk_live_xxx
  Content-Type: application/x-www-form-urlencoded

Body:
  customer: {{company.stripeCustomerId}}
  collection_method: send_invoice
  days_until_due: 30
```

### Пример: счёт QuickBooks

```
POST https://quickbooks.api.intuit.com/v3/company/{realmId}/invoice
Headers:
  Authorization: Bearer YOUR_ACCESS_TOKEN
  Content-Type: application/json

Body: {{code.invoice}}
```

## Итоговая сводка рабочего процесса

| Шаг | Действие | Назначение |
| - | - | - |
| 1 | Триггер: запись обновлена | Срабатывает при любых изменениях в Сделке |
| 2 | Фильтр | Продолжать только если Этап = Закрыто — выиграно |
| 3 | Поиск записи | Получить полные сведения о компании для выставления счёта |
| 4 | Код | Сформатировать данные для API выставления счетов |
| 5 | HTTP-запрос | Создать счёт во внешней системе |

## Советы

* **Сохраняйте внешние ID**: Сохраните идентификатор счёта, возвращённый API, обратно в Сделку с помощью действия **Обновить запись**
* **Обработка ошибок**: Добавьте ветку, чтобы отправлять уведомление, если HTTP-запрос завершится ошибкой
* **Сначала протестируйте**: Используйте песочницу/тестовый режим вашей системы выставления счетов перед запуском в рабочую среду

## Связанные материалы

* [Сгенерировать PDF из Twenty](/ru/user-guide/workflows/how-tos/connect-to-other-tools/generate-pdf-from-twenty) — прикрепляйте сгенерированные PDF-файлы к записям
* [Триггеры рабочего процесса](/ru/user-guide/workflows/capabilities/workflow-triggers)
* [Действия рабочего процесса](/ru/user-guide/workflows/capabilities/workflow-actions)
* [Автоматизации «Закрыто — выиграно»](/ru/user-guide/workflows/how-tos/crm-automations/closed-won-automations)


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