Для компаний, обслуживающих десятки или сотни клиентов, выставление счетов часто превращается в источник хаоса и стресса.
Мы, в составе команды Coders Club After-AI являлись исполителями интересного заказа для компании GTO-service, которая занимаетсяя регламентным обслуживанием коммерческих автопарков в Европе.
Проблема оказалась типичной: счета выставлялись вручную, напоминания об оплате отправлялись нерегулярно, а начисление пеней вызывало внутренние этические споры.
В итоге — задержки платежей, непредсказуемый денежный поток и перегруженный бухгалтерский отдел.
Наш руководитель Александр Шаман и менеджер цифровой трансформации расскажет про то, как мы за 100 часов построили полностью автоматизированную систему на Node.js + TypeScript, задеплоенную на Cloudflare Serverless, которая связала CRM клиента с SAP и автоматически управляет:
- выставлением счетов,
- напоминаниями об оплате,
- и формированием пеней за просрочку.
Результат — +70% своевременных платежей и +€12 000 дополнительного дохода за счёт автоматических начислений.
Проблема
Исходные данные
Компания обслуживает более 400 корпоративных клиентов, управляя плановыми ТО, заменой запчастей и проверками автопарков.
Каждый контракт имеет собственные сроки оплаты — от 14 до 60 дней.
Все счета создавались вручную в CRM, а данные переносились в SAP через экспорт CSV.
Основные сложности
- ❌ Хаос в выставлении счетов — дубли, пропуски, несвоевременные отправки.
- 🕒 Просрочки по оплатам — около 45% счетов оплачивались с задержкой.
- 📧 Напоминания вручную — бухгалтеры тратили по 10–15 часов в неделю.
- ⚖️ Этический конфликт — менеджеры стеснялись напоминать о долгах и начислять пени.
- 🔄 CRM и SAP не синхронизированы — отчёты не совпадали, что мешало аудиту.
Цели проекта
Мы поставили перед собой четыре задачи:
- Автоматически синхронизировать счета между CRM и SAP.
- Автоматизировать напоминания об оплате до и после срока.
- Автоматически начислять пени и формировать отдельный счёт.
- Сделать всё это без серверов и обслуживания инфраструктуры, используя Cloudflare Serverless.
План по времени:
- 10 часов — анализ и проектирование
- 40 часов — разработка
- 30 часов — тестирование и корректировки
- 20 часов — внедрение и обучение
Итоговая стоимость: €5000
Решение
Мы реализовали серверлесс-коннектор между CRM и SAP, работающий на Cloudflare Workers и использующий встроенные инструменты Cloudflare:
- Workers — основной API и бизнес-логика;
- KV Storage — хранилище для статусов счетов;
- Cron Triggers — планировщики напоминаний и синхронизации;
- Pages — фронтенд-панель для бухгалтерии.
Почему именно Cloudflare Serverless
- Никаких серверов или Docker-контейнеров — всё на edge-инфраструктуре Cloudflare.
- Мгновенные реакции — напоминания рассылаются с ближайшего узла пользователю.
- Cron-триггеры позволяют выполнять код по расписанию без внешних задач.
- Минимальные расходы — система работает в пределах бесплатного тарифа.
Бэкенд на TypeScript
1. Синхронизация счетов
Каждый час Worker опрашивает CRM и передаёт новые счета в SAP.
// src/worker.ts
import { fetchCRMInvoices, updateSAPInvoice } from './services';
export default {
async scheduled(event, env) {
const invoices = await fetchCRMInvoices(env);
for (const inv of invoices) {
await updateSAPInvoice(inv, env);
}
console.log(`[SYNC] Синхронизировано ${invoices.length} счетов`);
},
};
2. Ежедневные напоминания
Напоминания запускаются Cloudflare Cron Trigger’ом каждый день в 07:00.
// src/reminder.ts
import { sendReminderEmail } from './services';
import { getOverdueInvoices } from './store';
export async function handleReminders(env) {
const overdue = await getOverdueInvoices(env);
for (const inv of overdue) {
await sendReminderEmail(inv, env);
}
console.log(`Отправлено ${overdue.length} напоминаний`);
}
Типы напоминаний:
- За 3 дня до срока — дружеское письмо.
- В день срока — официальное уведомление.
- Через 5 дней — предупреждение с упоминанием пени.
3. Автоматическое начисление пеней
Через 7 дней после просрочки создаётся новый счёт с пеней и синхронизируется в SAP.
// src/penalty.ts
export async function createPenaltyInvoice(inv, env) {
const daysLate = Math.floor(
(Date.now() - new Date(inv.dueDate).getTime()) / 86400000
);
const weeksLate = Math.ceil(daysLate / 7);
const penalty = inv.total * 0.02 * weeksLate;
const penaltyInvoice = {
reference: inv.number,
amount: penalty,
description: `Пени за просрочку (${weeksLate} нед.)`,
customerId: inv.customerId,
};
await fetch(`${env.SAP_URL}/InvoiceCreate`, {
method: 'POST',
headers: { Authorization: `Basic ${env.SAP_TOKEN}` },
body: JSON.stringify(penaltyInvoice),
});
}
Фронтенд (React + Cloudflare Pages)
Мы сделали простую панель для бухгалтерии: просмотр счетов, фильтрация, ручной запуск синхронизации и просмотр истории напоминаний.
// src/components/InvoiceTable.tsx
import React, { useEffect, useState } from "react";
import { getInvoices } from "../api";
export const InvoiceTable = () => {
const [invoices, setInvoices] = useState([]);
useEffect(() => {
getInvoices().then(setInvoices);
}, []);
return (
<table>
<thead>
<tr>
<th>№</th><th>Клиент</th><th>Сумма</th><th>Срок</th><th>Статус</th>
</tr>
</thead>
<tbody>
{invoices.map(inv => (
<tr key={inv.id} className={inv.isOverdue ? "overdue" : ""}>
<td>{inv.number}</td>
<td>{inv.client}</td>
<td>€{inv.total}</td>
<td>{inv.dueDate}</td>
<td>{inv.status}</td>
</tr>
))}
</tbody>
</table>
);
};
Хранилище на Cloudflare KV
Cloudflare KV используется для хранения состояния счетов и журналов:
- Дата последнего напоминания
- Сумма и срок
- Признак «пени начислены»
// src/store.ts
export async function getOverdueInvoices(env) {
const all = await env.INVOICES.list();
return Object.values(all.keys)
.map((k) => JSON.parse(k.metadata))
.filter((inv) => new Date(inv.dueDate) < new Date());
}
KV работает молниеносно и не требует отдельной базы данных.
Интеграция с CRM и SAP
- CRM: REST API + OAuth2
- SAP: SOAP / OData
Маппинг данных выполняется внутри Worker’а:
// src/transform.ts
export const crmToSapInvoice = (crmInv) => ({
SAPInvoiceId: crmInv.id,
CustomerCode: crmInv.clientId,
Amount: crmInv.amount,
DueDate: crmInv.dueDate,
Description: crmInv.notes || "Регламентное обслуживание",
});
Cloudflare Deployment
Развёртывание занимало считанные секунды:
npm run build
npx wrangler deploy
wrangler.toml:
name = "invoice-automation"
main = "dist/worker.js"
compatibility_date = "2025-10-01"
kv_namespaces = [
{ binding = "INVOICES", id = "xxxx-yyyy-zzzz" }
]
[triggers]
crons = ["0 * * * *", "0 7 * * *"]
- каждый час — синхронизация счетов
- каждый день в 07:00 — рассылка напоминаний
Мониторинг и отчётность
- Логи доступны через wrangler tail
- Slack-уведомления о просроченных счетах
- Ежедневный отчёт по e-mail для бухгалтерии
Этика и прозрачность
Автоматизация не должна превращаться в “жёсткий сбор долгов”.
Мы реализовали гибкую систему напоминаний, где сначала отправляется дружеское уведомление, а пени начисляются только после трёх предупреждений.
Пример письма:
Тема: Напоминание об оплате счёта №4312
Здравствуйте, Иван!
Наши записи показывают, что счёт №4312 (от 30 сентября, €2100)
пока не оплачен. Пожалуйста, произведите оплату до 7 октября,
чтобы избежать начисления пени (2% за неделю просрочки).
Если вы уже оплатили, просто проигнорируйте это письмо.
С уважением,
Отдел расчётов Fleet Maintenance Services
Результаты
После двух месяцев эксплуатации:
МетрикаДоПослеОплата в срок55%93%Средняя просрочка9 дней2 дняРучные напоминания15 ч/нед6 ч/недДоп. доход от пеней—€12 000+Надёжность системы92%99.999%
Система полностью окупилась за два месяца.
Технические выводы
- Serverless идеально подходит для периодических задач — без cron-серверов и контейнеров.
- Cloudflare KV заменил полноценную базу для кэша и логов.
- Прозрачные уведомления повысили доверие клиентов — никто не оспаривал начисленные пени.
- Отделение логики от интеграций упростило поддержку.
- Cron Triggers Cloudflare оказались промышленным решением для финансовых задач.
Экономический эффект
ПоказательЗначениеЗатраты на разработку€5000Ежемесячная экономия на ручной работе~€2000Дополнительный доход от пеней€12 000+ROI за 3 месяца+220%
Этот проект в очередной раз подчеркнул: автоматизация может быть и выгодной, и этичной.
Серверлесс-архитектура позволила построить полностью автономную систему,
которая не требует серверов, обслуживается за минуты и приносит компании ощутимый результат.
100 часов работы → 70% рост своевременных платежей → ноль инфраструктурных забот.
Планы заказчика на будущее
- Интеграция с WhatsApp Business API для мгновенных уведомлений.
- Прогнозирование задержек на основе ML-модели.
- Локализация напоминаний для разных стран.
- Автоматическая сверка оплат с банковскими выписками.