
If you're distributing software through the Replicated Enterprise Portal, you already have a built-in path for getting your software into customers' hands. However, to recognize revenue under ASC 606, vendors also need to be able to report the timeframe when the software was transferred to customers.
The specific timeframe you use for revenue recognition depends on your company's policy and your auditors. Some of the most common definitions include when access to the software was provisioned, when the customer first accessed it, when the software was first downloaded, or when it was confirmed running in their environment.
Over the past quarter, we've shipped a set of capabilities that make it possible to track each of these milestones. With the latest updates to Replicated's event notification system and the customer API, vendors can report on the full customer lifecycle: from when the Enterprise Portal invitation was sent, to the moment the software is up and running in the customer's environment, and several other milestones along the way. It's also possible to connect the Vendor Portal to Salesforce (or HubSpot, or Attio) programmatically so that the right data flows to the right people automatically.
This post walks through what's available, how the pieces fit together, and how to start integrating them into your revenue workflows.
You now have full programmatic visibility into your customer's Enterprise Portal access lifecycle, from invite sent through first software pull. Three new notification events cover the key moments:
You can subscribe to each of these via webhook or email through the Vendor Portal. You can also use the customer API to query the timestamps for each event.
The critical detail for revenue recognition: milestones are tracked per license type. So, if a customer first activates on a trial and later converts to paid, the "first access" and "first pull" events fire again for the paid license type.
This means that you're not recording the moment they first accessed a trial as your proof of delivery for a paid contract.
Here's what the API response looks like for a customer who started on a trial and converted to paid:
[.inline]curl -s -H "Authorization: $REPLICATED_API_TOKEN" \[.inline] [.inline]"https://api.replicated.com/vendor/v3/app/$APP_ID/customer/$CUSTOMER_ID" \[.inline]
[.inline]| jq '.customer.enterprise_portal'[.inline]
[.inline]{[.inline]
[.inline]"enabled": true,[.inline]
[.inline]"first_invite_sent_at": "2026-03-01T14:30:00Z",[.inline]
[.inline]"access_granted_at": "2026-03-01T15:12:00Z",[.inline]
[.inline]"access_method": "invite",[.inline]
[.inline]"total_active_users": 3,[.inline]
[.inline]"first_software_pulled_at": "2026-03-01T15:45:00Z",[.inline]
[.inline]"first_software_pulled_asset_type": "helm_chart",[.inline]
[.inline]"first_software_pulled_asset_version": "1.4.0",[.inline]
[.inline]"access_milestones": {[.inline]
[.inline]"trial": {[.inline]
[.inline]"access_granted_at": "2026-03-01T15:12:00Z",[.inline]
[.inline]"access_method": "invite"[.inline]
[.inline]},[.inline]
[.inline]"paid": {[.inline]
[.inline]"access_granted_at": "2026-03-15T10:00:00Z",[.inline]
[.inline]"access_method": "saml_jit"[.inline]
[.inline]}[.inline]
[.inline]},[.inline]
[.inline]"software_pull_milestones": {[.inline]
[.inline]"trial": {[.inline]
[.inline]"first_pulled_at": "2026-03-01T15:45:00Z",[.inline]
[.inline]"asset_type": "helm_chart",[.inline]
[.inline]"asset_version": "1.4.0"[.inline]
[.inline]},[.inline]
[.inline]"paid": {[.inline]
[.inline]"first_pulled_at": "2026-03-15T10:30:00Z",[.inline]
[.inline]"asset_type": "helm_chart",[.inline]
[.inline]"asset_version": "1.5.2"[.inline]
[.inline]}[.inline]
[.inline]}[.inline]
[.inline]}[.inline]
To pull just the paid milestones for revenue recognition:
[.inline]# When did the customer first access the Enterprise Portal on a paid license?[.inline]
[.inline]curl -s -H "Authorization: $REPLICATED_API_TOKEN" \[.inline]
[.inline]"https://api.replicated.com/vendor/v3/app/$APP_ID/customer/$CUSTOMER_ID" \[.inline]
[.inline]| jq '.customer.enterprise_portal.access_milestones.paid.access_granted_at'[.inline]
[.inline]# When did the customer first pull software on a paid license?[.inline]
[.inline]curl -s -H "Authorization: $REPLICATED_API_TOKEN" \[.inline]
[.inline]"https://api.replicated.com/vendor/v3/app/$APP_ID/customer/$CUSTOMER_ID" \[.inline]
[.inline]| jq '.customer.enterprise_portal.software_pull_milestones.paid.first_pulled_at'[.inline]
If the key is absent or null, the customer hasn't hit that milestone yet for that license type. The [.inline]access_milestones[.inline] and [.inline]software_pull_milestones[.inline] maps are keyed by license type ([.inline]trial[.inline], [.inline]paid[.inline], [.inline]community[.inline], [.inline]dev[.inline]), so you can check any combination.
You can now opt in to automatically sending an Enterprise Portal invite when a new customer is created with an email address. This removes a manual step that vendors reported their teams routinely missed, leaving customers without the access they needed. With this toggle enabled, every new customer gets an Enterprise Portal access invite as part of customer creation, streamlining the onboarding flow.
This is especially relevant for vendors automating customer creation from their CRM. If your Salesforce integration creates a customer via the Vendor API when a contract is activated, enabling auto-invite means the customer gets access to your software immediately; no separate manual step required.
Vendors who prefer a more hands-on invite process can leave it off.
Two new self-serve signup capabilities give you more control over who enters your trial funnel, and what information you collect from them when they do:
Both are configured per-app in the Vendor Portal under Enterprise Portal settings and default to off.
Two new notification events let you distinguish between "a customer started an install or upgrade" and "it actually succeeded":
Previously, the Instance Upgrade event fired on first telemetry with a new version, before the app was necessarily healthy. Vendors had no way to know if an upgrade actually completed without manually checking. These new events make it possible to trigger post-deployment workflows (onboarding outreach, success team notification) only after confirming a successful install or upgrade of your software is reporting back as ready, and not just that one was attempted.
For tracking the customer’s lifecycle, Instance Ready is particularly useful. In online installations, this event gives you a programmatic signal that the software is successfully running for the first time on that instance, not just that it was downloaded. Depending on how your team defines delivery, this could be another valid recognition milestone.
All of these events are delivered through the new event notification system (currently in beta, no opt-in required). If you're not familiar with it yet, the short version: you set up subscriptions for the events you care about, scope them with filters (application, customer, channel, license type, custom license field values), and route them to email or a webhook endpoint.
For revenue workflows, the webhook delivery is what makes this actionable. When an event fires, your automation can receive it, update your CRM, and trigger an internal workflow or record a timestamp, all without anyone logging into the Vendor Portal.
Learn more about event notifications here.
The specific timestamp you use for recognition depends on your company's policy and your auditors. The platform now covers the most common definitions:
You pick which one applies to your policy.
These capabilities are most valuable when you connect them end to end. Here's what that looks like in practice, tracking the customer lifecycle from trial signup to paid conversion:
Chuck D'Antonio from Replicated has built and demoed a full reference implementation of this integration with Salesforce. He walks through the full bidirectional flow:
The code is available in his GitHub repository as a reference implementation.
There's no turnkey Salesforce integration in the Replicated product today. Every vendor's Salesforce is different, with different objects, different workflows, different automation. The mappings often have to be hand-crafted. What we do offer is the API surface and event system to make it possible, a working reference implementation to start from, and we will absolutely pair with you to help you get it set up. If this is something your team wants to pursue, reach out to your account team and we'll connect you with the right people to make it happen.
While the reference implementation uses Salesforce, the same patterns work with any CRM that can receive webhooks and make API calls. HubSpot, Attio, and others all support this.
As Chuck put it in his demo: "The people who need to think about it from the perspective of delivering the software, they have the Replicated Vendor Portal. And the people who are more revenue oriented, they have the system that they're always in."
The goal is to make sure those two systems talk to each other.
Reach out. If you want to build this integration, we'll pair with you on it. Talk to your account team or connect with us directly in Slack.