Спросите основателя небольшой фирмы по аудиту кода, какова их модель получения выручки, и вы обычно услышите растерянную паузу перед «ну... и то, и другое?» Мастерская статического анализа редко выбирает что-то одно. Один клиент платит 6 500 долларов за двухнедельный статический обзор устаревшего Rails-приложения. Другой платит 40 долларов за разработчика в месяц за действующую подписку SAST, которую фирма перепродает и настраивает. Третий платит по индивидуальному тарифу за «полный пакет аудита», который включает статический анализ, динамическое тестирование и работы по исправлению, оплачиваемые по часам. Три сделки, три разных правила признания выручки и один план счетов, который обычно не предназначен для их разграничения.
На самом деле это весьма распространенная ситуация для технических сервисных компаний сегодня: консалтинговые фирмы в сфере безопасности и качества кода, которые начинали как чистые проектные мастерские, все чаще перепродают или используют под собственной маркой инструменты SAST (Static Application Security Testing — статическое тестирование безопасности приложений) наряду со своей аудиторской работой, потому что клиенты хотят как разовое заключение, так и работающий сканер в CI. Специфическая бухгалтерская проблема, которую это создает, обычно упускается в общих рекомендациях для «консалтинговых фирм».
Три потока выручки, скрытые в одном бизнесе
Прежде чем вы сможете правильно учитывать что-либо, вам нужно разделить то, что вы на самом деле продаете, потому что каждый продукт ведет себя в учете по-разному.
1. Статические аудиты (фиксированный объем, единовременная поставка). Проверка исходного кода — соответствие стандартам, проверка зависимостей и CI/CD пайплайна, архитектурный обзор — обычно стоит в диапазоне 5 000–8 000 долларов за определенный объем. Это дискретный результат: отчет, предоставленный в определенную дату, с четким окончанием.
2. Динамические аудиты и полные пакеты аудита (фиксированный объем или почасовые, часто с оплатой по этапам). Тестирование поведения системы под нагрузкой или в условиях противодействия стоит от 8 000 до 16 000 долларов, а комбинированный «полный пакет аудита» (статический + динамический + исправление) обычно оценивается индивидуально и выставляется по этапам или часам. Квалификация аудитора, размер кодовой базы и качество документации, нормативные требования (аудиты в здравоохранении и финансах требуют более глубокого отслеживания данных и проверки разрешений), а также сжатые сроки — все это влияет на цену, что означает, что два аудита с одинаковым названием могут иметь совершенно разную структуру затрат.
3. Подписки SAST (регулярные, перепродаваемые или с маржой реселлера). Инструментальная сторона этого рынка сконцентрировалась на ценообразовании SaaS за рабочее место: широкие платформы, объединяющие SAST, SCA, сканирование секретов и проверки IaC, начинаются примерно от 15–20 долларов за пользователя в месяц, узкоспециализированные инструменты для одной возможности находятся в диапазоне 10–15 долларов на пользователя, а корпоративные контракты от крупных вендоров могут превышать 100 000 долларов в год для нескольких сотен приложений. Когда аудиторская фирма перепродает или объединяет одну из таких платформ — настраивая ее, настраивая правила для ложных срабатываний и получая маржу на подписке — эта выручка является регулярной, а не проектной, и она может быть или не быть вашей выручкой в зависимости от того, выступаете ли вы в договоре как принципал или агент.
Объединение всех трех в «консалтинговую выручку» — это именно то, как отчет о прибылях и убытках перестает давать вам полезную информацию о бизнесе.
Почему признание выручки на самом деле различается
Согласно ASC 606 (или его близким международным эквивалентам), вопрос бухгалтерского учета заключается в том, когда контроль над обещанным товаром или услугой переходит к клиенту — и ответ для каждого из вышеперечисленных потоков разный.
- Статический или динамический аудит с фиксированным объемом обычно признается единовременно, когда отчет предоставлен и принят — или, если выставление счетов происходит по этапам, признается по мере завершения каждого этапа. Если вы выставляете счет на 50% авансом и 50% после предоставления, депозит является обязательством (доходы будущих периодов) до момента отправки отчета, а не выручкой в день поступления чека.
- Почасовая работа по исправлению и внедрению признается по мере выполнения часов, что означает, что вам нужен механизм для учета невыставленного времени — работы, выполненной в периоде, но еще не выставленной в счете, — которая должна отражаться как актив (невыставленный счет / НЗП), а не исчезать до даты выставления счета. Это самое распространенное искажение в проектном учете: фирма выглядит убыточной в месяце выставления счета и сверхприбыльной в следующем, исключительно из-за задержки выставления счетов, а не из-за изменения самой работы.
- Перепродаваемая подписка SAST признается равномерно в течение срока подписки — ежемесячно или ежегодно, соответствуя периоду, в течение которого клиент фактически имеет доступ к инструменту. Если вы являетесь реселлером и действуете как агент (организуя предоставление программного обеспечения вендором), а не как принципал (обещая предоставить программное обеспечение самостоятельно), вы должны признавать только свою маржу, а не полную цену подписки — проводка полной транзитной суммы как выручки, когда вы экономически являетесь просто проводником для выставления счетов, завышает вашу верхнюю строку и искажает ваш реальный процент маржи.
Правильное решение по вопросу «принципал против агента» важно не только с точки зрения GAAP: это разница между отчетом о прибылях и убытках, который показывает 180 000 долларов дохода от подписок с маржой 8%, и тем, который корректно показывает 14 400 долларов комиссионного дохода с маржой 100%. Кредиторы, страховщики и все, кто строит мультипликаторы оценки на основе ваших цифр, будут читать эти два отчета о прибылях и убытках совершенно по-разному — и только один из них близок к истине.
Практический план счетов
Фирме по аудиту кода, работающей со всеми тремя потоками выручки, выгодно разделять выручку (а часто и себестоимость) на уровне счетов, а не просто помечать что-то в электронной таблице постфактум:
Income:Audits:Static(Выручка:Аудиты:Статический)Income:Audits:Dynamic(Выручка:Аудиты:Динамический)Income:Consulting:Remediation(Выручка:Консалтинг:Исправление) (почасовой)Income:Subscriptions:SAST-Margin(Выручка:Подписки:Маржа SAST) (только ваша комиссия/маржа, если вы агент)Income:Subscriptions:SAST-Gross(Выручка:Подписки:Валовая SAST) (если вы принципал и перепродаете полный контракт)Liabilities:UnearnedRevenue:Audits(Обязательства:Доходы будущих периодов:Аудиты)Assets:UnbilledReceivables:Consulting(Активы:Невыставленные счета:Консалтинг)
Здесь учет в открытом тексте с контролем версий оправдывает себя для технической сервисной фирмы — те же инженеры, которые настраивают правила SAST для клиентов, обычно без проблем просматривают diff бухгалтерской книги .beancount, а история Git для ваших книг дает вам такую же возможность аудита, которую вы продаете своим клиентам. Для мастерской по аудиту кода хранить свои финансовые записи в непрозрачном, не поддающемся сравнению формате было бы несколько иронично.
Где фирмы на самом деле ошибаются
В этой бизнес-модели регулярно встречаются несколько шаблонов:
- Проводка депозитов по подписке как выручки немедленно. Если клиент предоплатил годовую лицензию SAST, которую вы перепродаете, эти денежные средства являются обязательством до истечения периода покрытия — признание всей суммы в первом месяце завышает квартал, в который она попадает, и занижает все последующие кварталы.
- Никогда не отслеживать невыставленные часы. Почасовая работа по исправлению, выполненная ближе к концу месяца, но выставленная в счете в следующем месяце, все равно должна отражаться как актив в правильном периоде, иначе ваша маржа будет выглядеть так, будто она сильно колеблется без операционной причины.
- Отражение транзитной суммы реселлера как валовой выручки. Как указано выше — это завышает показатели верхней строки таким образом, что выглядит хорошо до тех пор, пока команда due diligence покупателя (по иронии судьбы, выполняющая ту же техническую проверку, которую продает ваша фирма) не раскроет это и не переоценит бизнес.
- Отсутствие отдельного отслеживания для проектов в регулируемых отраслях. Аудиты в здравоохранении и финансовых услугах имеют существенно больший объем (отслеживание данных, проверка контроля доступа) и обычно большую ответственность — если ваши книги не разделяют эту выручку и связанные с ней затраты, вы не сможете определить, являются ли ваши проекты с высокими требованиями соответствия на самом деле прибыльными по сравнению с вашими общими статическими проверками.
Практический пример: один счет, три разные проводки
Предположим, ваша фирма заключает договор с клиентом в марте на статический аудит за 7 000 долларов (депозит 50%, 50% после предоставления), 20 часов почасового исправления по 175 долларов в час, которые будут выставлены в апреле, и перепродаваемую подписку SAST по 18 долларов за рабочее место в месяц для их команды из 40 разработчиков, где ваша фирма оставляет себе маржу в 4 доллара за место, а остальное передает вендору.
- Мартовский депозит ($3 500): Дебет «Денежные средства», кредит
Обязательства:Доходы будущих периодов:Аудиты. Выручки пока нет — вы не предоставили отчет. - Апрельская передача отчета: Дебет
Обязательства:Доходы будущих периодов:Аудитыи оставшуюся дебиторскую задолженность в 3 500 долларов, кредитВыручка:Аудиты:Статическийна полные 7 000 долларов. Выручка попадает в месяц, когда работа была фактически принята, а не в месяц, когда был обналичен чек. - Мартовские часы исправления (выполнены, но еще не выставлены): Если 8 из 20 часов были выполнены в марте, но счет выставляется в апреле, дебетуйте
Активы:Невыставленные счета:Консалтинги кредитуйтеВыручка:Консалтинг:Исправлениена эти 8 часов ($1 400) в марте; оставшиеся 12 часов ($2 100) проводятся обычным образом в апреле, когда и работа, и счет попадают в один месяц. - Ежемесячная подписка SAST: Если вы действуете как агент, только ежемесячная маржа в 160 долларов (40 мест × 4 доллара) попадает на
Выручка:Подписки:Маржа SAST; транзитная сумма в 720 долларов (40 × 18) проходит через транзитный счет против того, что вы должны вендору, никогда не затрагивая ваш отчет о прибылях и убытках. Если ваш контракт, наоборот, делает вас принципалом — вы являетесь стороной, обещающей программное обеспечение клиенту, даже если вендор предоставляет его «под капотом», — полные 720 долларов признаются как выручка, а затраты вендора в 560 долларов учитываются как себестоимость, в конечном итоге давая ту же чистую прибыль, но совершенно другие (и, если вы не принципал, вводящие в заблуждение) показатели верхней строки.
Три операции, три разных правила учета времени и — что критически важно — вторая из них является причиной того, что многие небольшие аудиторские мастерские выглядят так, будто у них был тяжелый апрель, хотя в бизнесе на самом деле ничего не изменилось. Проводка по невыставленным часам — это то, что сохраняет честность мартовских цифр.
Почему это сейчас важнее, чем раньше
Спрос на базовую услугу растет по заслуживающей внимания причине: покупатели, проводящие техническую due diligence, все чаще рассматривают код и состояние безопасности как существенные для условий сделки, а не как формальность — технические находки регулярно смещают обсуждения оценки на 15–30%, и значительная доля ожидаемой синергии сделок теперь зависит от качества интеграции, которое аудит кода может выявить до закрытия. Если вашу собственную фирму когда-нибудь приобретут, рекапитализируют или включат в более крупный конвейер due diligence, первое, что сделает финансовая команда покупателя, будет именно то, что ваша аудиторская команда делает с клиентскими кодовыми базами: разберет бухгалтерскую книгу и проверит, выдерживают ли цифры проверку. Бизнес с планом счетов, который уже разделяет выручку от фиксированной платы, почасовой работы и маржи подписки, отвечает на этот вопрос за минуты, а не за недели.
Ведите свои собственные книги так же чисто, как код, который вы проверяете
Ведение гибридного бизнеса аудита и подписок означает, что признание вашей выручки подчиняется трем разным правилам под одной крышей, и электронные таблицы редко обеспечивают последовательное соблюдение этого различия с течением времени. Beancount.io предлагает учет в открытом тексте, который является прозрачным, контролируется версиями и легко поддается сравнению — естественное соответствие для технической команды, которая уже мыслит в терминах аудируемой истории. Начните бесплатно и ведите свои собственные финансовые записи так же тщательно, как аудиты, которые вы продаете.