Сверка криптоплатежей: сопоставление счетов в стейблкоинах с заказами

Сверка криптоплатежей: сопоставление счетов в стейблкоинах с заказами

Платёж картой попадает в вашу бухгалтерию через отчёт эквайера, в котором уже указан заказ. Перевод USDC приходит только с адресом, суммой и хешем транзакции — и ничем больше. Сверка криптоплатежей работает, когда счёт содержит бизнес-референс, потому что сам перевод его передать не может.

Это руководство для финансовых и операционных команд мерчантов, PSP и EMI, которые принимают стейблкоины и получают расчёты в евро. Здесь перечислены поля, которые нужны в записи каждого счёта, порядок работы с частичными платежами и платежами не той монетой, то, как вебхуки и API передают данные в учётную систему, и какие правила ЕС определяют, сколько всё это нужно хранить.

Видео-резюме, 119 секунд, на английском.

Ключевые моменты

Коротко

  • Перевод по стандарту ERC-20 содержит только отправителя, получателя и сумму. Номер заказа должен находиться в счёте, а не в платеже.
  • Выставляйте счёт в EUR и отражайте в учёте именно эту сумму в евро. Сумма в криптовалюте — производное число, которое вы сохраняете для аудиторского следа.
  • Основная работа приходится на исключения: частичные платежи, истёкшие счета, платёж не той монетой. Проверяйте их ежедневно, а не в конце месяца.
  • Используйте вебхук как триггер, перечитывайте счёт по ID как источник истины и каждую ночь выгружайте список счетов как страховку и источник для экспорта в CSV.

Почему сверка криптоплатежей сложнее, чем карточных?#

Сверка криптоплатежей сложнее, потому что в блокчейн-переводе нет поля для номера вашего заказа. В Ethereum стандарт токенов ERC-20 (EIP-20) определяет событие перевода как `Transfer(address _from, address _to, uint256 _value)`: кто отправил, кто получил и какая сумма. Ни memo, ни номера счёта, ни имени клиента там нет.

Банковские и карточные платежи устроены наоборот. В переводе SEPA есть поле назначения платежа, которое заполняет плательщик, а в отчёте о расчётах эквайера каждая операция по карте указана с вашим референсом мерчанта. Ваша бухгалтерская система сопоставляет данные именно по этому референсу.

Со стейблкоинами возникают ещё три сложности:

  • Сумма редко бывает круглой. Счёт на 250 EUR, выставленный в USDC, становится числом вроде 279,2846 USDC, поэтому два счёта похожего размера могут выглядеть одинаково.
  • Платёж не становится окончательным сразу. Ethereum формирует блок каждые 12 секунд, но, по данным ethereum.org (страница обновлена в октябре 2026 г.), «финализация блока Ethereum занимает примерно 15 минут». Перевод может быть видим и всё же не засчитываться.
  • Плательщики ошибаются. Они отправляют меньше, отправляют дважды, отправляют другую монету или платят после истечения срока счёта.

Поэтому связь должна возникнуть до того, как плательщик заплатит: один счёт на один заказ, с вашим ID заказа и собственным платёжным адресом, чтобы каждый входящий перевод попадал в запись, которая уже знает, за что он.

Какие поля нужны в записи каждого криптосчёта?#

Каждый счёт требует фиксированного набора полей, которые связывают четыре вещи: ваш заказ, цену в евро, перевод в блокчейне и итоговый статус. Если одного поля не хватает, кто-то будет сопоставлять данные вручную. В таблице ниже используются названия полей API счетов ItisPay; другие провайдеры называют те же понятия иначе.

ПолеЧто хранитЗачем это бухгалтерии
invoice_idУникальный ID, который присваивает провайдерПервичный ключ для каждого поиска и каждой строки в учёте
order_idНомер вашего заказа или договора, уникальный для каждого заказаСвязь с вашей ERP, магазином или CRM; тот референс, который карты дают бесплатно
order_nameКраткое описание заказаПозволяет проверить исключение, не открывая магазин
fiat_amount, fiat_currencyЦена в EURВыручка, которую вы проводите
currency, crypto_amountВыставленная монета и сумма к оплатеПоказывает, что плательщику предложили отправить
actual_crypto_amount_paidСколько реально поступилоВыявляет недоплату и переплату
currency_paidИспользованная монета, если она отличается от выставленнойОтмечает платежи не той монетой для проверки
network, addressБлокчейн-сеть и платёжный адресПодтверждает, куда были отправлены деньги; нужно для любой трассировки или возврата
transactions (tx_hash, amount, status)Одна строка на каждый входящий переводОдин счёт может получить несколько переводов; каждый хеш — ваше доказательство в блокчейне
statusnew, pending, completed, expired, cancelled, paid_partialОпределяет, проводить ли, отгружать, напоминать или закрывать
created_at, updated_at, expires_atВременные меткиОтсечка на конец месяца и доказательство времени оплаты заказа

Две из них делают большую часть работы. `order_id` — это референс, который блокчейн-перевод не может передать, поэтому задавайте его из собственной системы и делайте уникальным для каждого заказа, а не для каждого клиента. Список `transactions` важен, потому что счёт не всегда оплачивается за один раз: каждый перевод получает собственную строку с хешем и статусом, так что видно, из каких переводов складывается оплаченная сумма.

Храните сумму в криптовалюте со всеми знаками после запятой в отдельном столбце. Ваша главная книга ведётся в евроцентах; криптостолбцы — это доказательство, а не балансовые значения.

Список счетов ItisPay с номером заказа, статусом, суммой в USDC, суммой в EUR, полученной долей, сетью и адресом для каждого заказа (демонстрационные данные)

Какую сумму в евро отражать в учёте?#

Отражайте в учёте цену в евро, указанную в счёте. Когда счёт выставлен в EUR, провайдер пересчитывает его в криптовалютную сумму по текущему курсу, и плательщик отправляет именно эту сумму. Если платёж зачисляется на ваш счёт в евро, сумма в евро в счёте и есть ваша выручка, а криптовалютная сумма — техническая деталь того, как платёж поступил.

Именно поэтому команды, которые принимают криптоплатежи автоматически с конвертацией в EUR, редко нуждаются в криптоучёте вообще: на балансе нет монеты, которую нужно оценивать на конец месяца.

Всё меняется, если вы держите стейблкоины. Комитет по интерпретациям МСФО решил в июне 2019 года, что криптовалютные активы подпадают под МСФО (IAS) 2 «Запасы», если они удерживаются для продажи в ходе обычной деятельности, и под МСФО (IAS) 38 «Нематериальные активы» в остальных случаях. Его определение криптовалюты исключает активы, которые создают договорные отношения между держателем и другой стороной. USDC устроен иначе: Circle заявляет, что он «погашается 1:1 в долларах США», а с июля 2024 года Circle выпускает USDC и EURC в ЕС как токены электронных денег (e-money tokens) по лицензии на электронные деньги французского регулятора ACPR. Как классифицировать удерживаемый стейблкоин — вопрос к вашему аудитору. Расчёт в EUR сразу после получения снимает этот вопрос.

Как обрабатывать частичные платежи и неверную монету?#

Каждый счёт не в статусе `completed` считайте исключением, у которого есть ответственный и срок. Основные усилия по сверке криптоплатежей уходят именно сюда; полностью оплаченный счёт сходится сам.

Ниже приведено, что каждый статус означает для финансов, на примере статусов ItisPay:

СтатусЧто произошлоЧто делают финансыОтгрузка или освобождение?
newСчёт открыт, ничего не полученоНечего отражатьНет
pendingПеревод виден, но ещё не окончательныйДождаться изменения статусаНет
completedОплачено полностьюОтразить выручку по цене в EUR, освободить заказДа
paid_partialПоступила часть суммыЗапросить остаток, вернуть средства или закрыть по соглашениюЗависит
expiredВремя истекло без полной оплатыЗакрыть заказ; проверить поздние переводыНет
cancelledВы аннулировали счётЗаписи нет; выставить повторно, если клиент всё ещё хочет платитьНет

Частичные платежи#

Частичный платёж обычно означает, что кошелёк или биржа плательщика удержали комиссию с суммы, либо плательщик ввёл сумму неверно. ItisPay учитывает каждый перевод отдельно, поэтому второй перевод может закрыть счёт. У счёта также есть настройка `allowed_error_percent`: небольшое допустимое отклонение, задаваемое для каждого счёта, так что платёж, немного не дотягивающий до суммы, всё равно считается оплаченным. Задайте её один раз как политику, например на уровне, который вы списали бы и при банковском переводе, и не меняйте от случая к случаю.

Если остаток так и не поступил, решите в течение фиксированного числа дней: примите недостачу и спишите её, верните полученное или отмените заказ. Запишите решение в карточку счёта, чтобы аудитор видел, почему на оплаченном заказе денег меньше.

Неверная монета или поздний платёж#

Когда плательщик отправляет стейблкоин, отличный от указанного в счёте, это видно в поле `currency_paid`. Не отражайте такой платёж автоматически: проверьте сумму и стоимость в евро, затем примите его или верните. Перевод на истёкший счёт устроен похоже. Деньги уже в блокчейне, но ваш заказ закрыт, поэтому кто-то должен решить, открыть ли заказ заново или вернуть средства. Если заказ аннулирован на вашей стороне, отмените счёт через API (обновлением статуса), чтобы ваши записи показывали его закрытым до того, как придёт поздний платёж.

Как вебхуки и API должны питать сверку криптоплатежей?#

Используйте три уровня: вебхук сообщает, что что-то изменилось, повторное чтение счёта показывает, что действительно произошло, а ночная выгрузка всех счетов ловит всё, что пропустили первые два.

  1. Каждый счёт может содержать `callback_url`; провайдер отправляет туда обновления статуса. Воспринимайте сообщение как триггер, а не как доказательство.
  2. При каждом вебхуке вызывайте `GET /invoices/{invoice_id}` и действуйте по статусу и суммам из этого ответа. Это защищает от поддельных или повторно отправленных вызовов вашего endpoint, так как запрос к API требует вашего API-ключа.
  3. Сделайте обработчик идемпотентным: один и тот же статус может прийти дважды. Привязывайте запись в учёте к `invoice_id` и статусу, чтобы повтор ничего не менял.
  4. Каждую ночь запрашивайте счета, отсортированные по `updated_at` от новых к старым, и листайте назад до вашего последнего запуска; также перепроверяйте каждый счёт, который всё ещё в статусе `new`, `pending` или `paid_partial`. Сверяйте их с вашим учётом. Всё, что оплачено в записях провайдера, но открыто у вас, — исключение.

Для тестирования ItisPay предоставляет endpoint, который имитирует изменение статуса счёта, и endpoint, который повторно отправляет последний вебхук по `invoice_id` или `order_id`. Используйте повторную отправку, если ваш сервер был недоступен. Команды, которые направляют несколько способов оплаты через один слой оркестрации платежей, применяют тот же подход ко всем каналам.

Пять шагов, которые сопоставляют стейблкоин-платёж с заказом: счёт с ID заказа, перевод в блокчейне, вебхук, повторное чтение по ID счёта, строка в учёте в EUR

Как собрать CSV-экспорт для бухгалтерии?#

Постройте экспорт из API списка счетов: одна строка на счёт плюс одна строка на перевод. В ItisPay `GET /invoices` фильтрует по статусу, монете и дате создания, сортирует по дате или сумме и возвращает до 100 счетов на страницу вместе с количеством страниц. Небольшой скрипт может пройти по страницам за день или месяц и записать колонки из таблицы полей выше.

Два файла удобнее одного:

  • `invoices.csv`: invoice_id, order_id, fiat_amount, fiat_currency, currency, crypto_amount, actual_crypto_amount_paid, status, created_at, updated_at. Этот файл бухгалтер импортирует и сверяет с продажами.
  • `transfers.csv`: invoice_id, tx_hash, amount, currency, transfer status, time. Это файл-подтверждение для аудитора.

Импортируйте файл счетов в бухгалтерскую систему так же, как отчёт о расчётах по картам: одна строка на заказ, в евро, с ID заказа в качестве ключа сверки.

Какие правила ЕС определяют учёт криптоплатежей?#

Три правила ЕС задают контекст. Ни одно из них не делает продавца поставщиком услуг в сфере криптоактивов (CASP), но они определяют, какие данные существуют и как долго их хранят.

  • Регламент о переводе средств (EU) 2023/1113. С 30 декабря 2024 г. CASP плательщика обязан обеспечить, чтобы каждый перевод сопровождался информацией о плательщике и получателе, например именами и адресами в распределённом реестре (статья 14). Данные следуют за переводом, а не находятся внутри него. Для переводов свыше 1 000 EUR на самостоятельно управляемый кошелёк или с него провайдер соответствующей стороны должен оценить, принадлежит ли этот кошелёк его клиенту (статьи 14 и 16). Это задача лицензированного провайдера, и это одна из причин, по которым платёж может находиться на проверке.
  • Хранение записей. Согласно действующей директиве AML (EU) 2015/849, статья 40, обязанные лица хранят записи о транзакциях в течение пяти лет после окончания деловых отношений или совершения операции. Новый регламент AML (EU) 2024/1624 сохраняет пятилетний срок (статья 77) и применяется с 10 июля 2027 г.
  • DAC8, директива (EU) 2023/2226. С 1 января 2026 г. CASP сообщают налоговым органам о криптотранзакциях своих пользователей. Ваши собственные записи должны совпадать с тем, что сообщает ваш провайдер.

Если вы работаете через лицензированного партнёра, партнёр несёт обязанности CASP по MiCA и этим правилам, как объясняется в нашем руководстве по лицензии MiCA CASP. Ваши записи о заказах и ваша часть цепочки подтверждений остаются у вас.

Где сверка криптоплатежей всё ещё требует участия человека?#

Автоматизация справляется со случаем полной оплаты. Остальное требует назначенного ответственного и короткой письменной политики.

Где это не помогает

  • Возвраты — это новые исходящие переводы, а не отмены. Им нужна выплата на адрес или IBAN и собственные записи.
  • Плательщика, который отправляет со счёта на бирже, не всегда можно установить по адресу отправителя. Сопоставляйте по счёту, а никогда по отправителю.
  • Платежи по просроченным счетам, дублирующие платежи и неверные монеты требуют решения человека.
  • Комиссии сети и округление дают небольшие расхождения. Один раз определите допустимое отклонение и придерживайтесь его.

Ежедневная рутина сверки криптоплатежей в пять шагов#

Короткая ежедневная процедура превращает закрытие месяца в формальность:

  1. Получите через API счета, созданные или обновлённые с момента последнего запуска, и обновите файлы счетов и переводов.
  2. Проверьте, что у каждого счёта со статусом `completed` есть соответствующий оплаченный заказ в вашем магазине или ERP, и наоборот.
  3. Разберите список исключений: `paid_partial`, платежи по просроченным счетам, неверные монеты. Закройте каждую запись письменным решением.
  4. Сверьте зачисление в евро на вашем банковском счёте с суммой завершённых счетов за период. Если расчёты идут на IBAN, то виртуальные IBAN помогают разделять потоки по направлениям бизнеса.
  5. Архивируйте оба файла не менее пяти лет.

Если вы хотите принимать стейблкоины и получать евро, не выстраивая этот стек самостоятельно, ItisPay предоставляет API, выставление счетов и данные для сверки: ID счетов и заказов, хеши по каждому переводу, статусы и вебхуки. Лицензирование, KYC и расчёты на ваш IBAN проходят через нашего партнёра с лицензией ЕС, являющегося CASP и платёжным учреждением, и большинство команд проходят путь от KYB до первой транзакции менее чем за неделю.

Эта статья носит исключительно информационный характер и не является юридической или регуляторной консультацией.

Часто задаваемые вопросы

Может ли клиент указать номер заказа в переводе USDC?

Нет, не в стандартном переводе ERC-20: он содержит только отправителя, получателя и сумму. Укажите номер заказа в счёте и назначайте каждому счёту собственный адрес для оплаты.

Что произойдёт, если клиент дважды оплатит один и тот же счёт?

Второй перевод появится как дополнительная транзакция по счёту, поэтому оплаченная сумма будет выше цены. Относитесь к этому как к исключению по переплате: уточните у клиента, затем верните лишнюю сумму как новый исходящий перевод и отразите его по тому же счёту.

Что записывать: сумму в криптовалюте или сумму в евро?

Отражайте в учёте цену в евро из счёта, когда платёж зачисляется в евро. Сумму в криптовалюте, монету, сеть и хеш транзакции храните в отдельных колонках как подтверждение. Если вместо этого вы держите стейблкоины, сначала согласуйте учётную трактовку с аудитором.

Как долго нужно хранить записи о криптоплатежах?

Планируйте хранение не менее пяти лет. Именно такой срок правила ЕС о борьбе с отмыванием денег устанавливают для записей о транзакциях, которые хранят обязанные лица, а национальное налоговое законодательство может требовать большего срока. Храните файл счетов, файл переводов и решения по исключениям вместе.

Можно ли передавать платежи в стейблкоинах в Xero, NetSuite или QuickBooks?

Да, в виде импортируемого файла. Экспортируйте по одной строке на каждый оплаченный счёт в евро с ID заказа и импортируйте её так же, как отчёт о расчётах по картам. Хеши транзакций идут в отдельный файл-подтверждение.

Nik Perkov

Nik Perkov

Founder, ItisPay

Share this article:

The newsletter for crypto entrepreneurs

Join founders and innovators exploring crypto payments. Get insights, product updates, and stories from businesses building the future of digital commerce.

Unsubscribe anytime. By entering your email, you agree to receive marketing emails from ItisPay. By proceeding, you agree to the Terms and Conditions and Privacy Policy.

Ready to launch stablecoin-first payments under your brand?

Stablecoin-first infrastructure with 1:1 EUR/USD backing. Deploy in 1 week. Built for high-volume PSPs and neobanks with zero volatility risk.