← Back to Licensing & Commercial
LIC-009 Licensing & Commercial 18 min read For: Solution Architects & ISV Partners

AppExchange Commercial Models: OEM, Free, and ISV Licensing

Understanding the mechanics of AppExchange partner agreements, licensing models, and hidden costs when integrating third-party solutions.

VS

Vishal Sharma

Salesforce Architecture Specialist · Updated May 2026

What you will learn in this tutorial
  • Analyse the architectural and structural differences between ISVforce and OEM Embedded partner distribution models.
  • Evaluate the financial mechanics of Percent of Net Revenue (PNR) revenue-share models and contract negotiation levers.
  • Understand the schema of the License Management Application (LMA) and automate custom seat and site provisionings.
  • Uncover hidden commercial and operational costs associated with free versus paid AppExchange packages.
  • Implement a structured governance playbook for assessing package dependencies, custom object consumption, and security risks.

The AppExchange Partner Architecture: Understanding ISVForce and OEM Models

For independent software vendors (ISVs) and enterprise solution architects, distributing software on the Salesforce platform requires a deep alignment between technical architecture and commercial agreements. Salesforce offers two foundational partner distribution architectures: ISVforce and OEM Embedded (Original Equipment Manufacturer). Selecting the incorrect model during the design phase can lead to severe architectural friction, compliance infractions, and unsustainable margins. Understanding the precise capabilities and constraints of each model is a prerequisite for any enterprise solution deployment.

The ISVforce Model: Native Extension

The ISVforce model is engineered to deliver native extensions directly into a customer’s existing Salesforce environment. In this model, the customer has already procured core CRM licences—such as Sales Cloud, Service Cloud, or Salesforce Platform licences—directly from Salesforce. The partner’s application is packaged as a managed package and installed into this host organisation.

Commercially, the ISVforce model assumes a co-existence paradigm. The end-user utilises their pre-existing Salesforce user licence to access the standard platform capabilities, while the partner's managed package introduces custom metadata, Apex classes, custom objects, and Lightning components that enhance this baseline capability. The primary architectural benefit is the direct, unhindered access to the customer's standard CRM objects (such as Account, Contact, Lead, Opportunity, and Case) without additional compliance friction.

The OEM Embedded Model: Standalone Distribution

The OEM Embedded model allows a partner to distribute a complete, standalone solution that bundles the underlying Salesforce platform utility alongside the partner's proprietary intellectual property. In this scenario, the customer does not need to have a pre-existing commercial contract with Salesforce; the partner act as the sole commercial counterparty, selling a complete application powered by Salesforce technology.

Architecturally, OEM Embedded licences are built on top of the Salesforce Platform User Licence. The partner provisions the user licences directly to the customer as part of their bundle. However, because these user licences are platform-based, they are subject to strict functional constraints enforced by Salesforce's product terms. The most significant boundary is that OEM users are technically and commercially blocked from accessing standard CRM objects. Specifically, OEM licences do not grant access to:

  • Lead
  • Opportunity
  • Campaign
  • Forecast
  • Case (standard customer service case tracking)

If an OEM application requires lead tracking, sales pipelines, or support ticketing, the solution architect must completely design and build custom schemas (e.g., a custom Custom_Opportunity__c object) and build custom logic to replicate these features. Attempting to bypass these object boundaries by writing custom integrations that expose standard objects to OEM users violates Salesforce’s "indirect access" policies and will fail commercial audits, leading to substantial back-licensing penalties.

Architectural Warning: Copying standard CRM data into custom objects solely to circumvent licensing boundaries is known as "feature replication" or "licence circumvention". Salesforce's commercial audit team closely monitors schema designs during security reviews and post-install audits to ensure compliance.

ISVforce vs. OEM Embedded Architectural Comparison

The table below provides a comprehensive architectural and commercial breakdown of the two partner models:

Architectural Dimension ISVforce Model OEM Embedded Model
Target Audience Existing Salesforce customers with Sales/Service Cloud Both existing Salesforce customers and non-Salesforce customers
Core User Licence Customer's existing Sales, Service, or Platform licence Partner-provided Salesforce Platform (OEM) licence
Standard Object Access Full access to Opportunity, Lead, Case, etc. Strictly restricted to Account, Contact, and custom objects
Custom Object Limit Exempt from limits if certified via security review Exempt from limits up to 110 custom objects per OEM app
Billing Channel Salesforce bills core; Partner bills app separately Partner bills the customer for the entire bundled solution
Distribution Mechanism Managed Package installed in customer's existing org Managed Package installed in customer's org or a dedicated org

Revenue Share Mechanics: Standard ISV Margins vs Custom OEM Terms

Entering the AppExchange ecosystem requires a thorough understanding of the financial obligations partners owe to Salesforce. Every paid transaction on the AppExchange is subject to a revenue-sharing agreement governed by the partner's AppExchange Partner Programme Agreement (SPPA). Architects and business leaders must model these costs over a multi-year horizon to ensure commercial viability.

Percent of Net Revenue (PNR) Mechanics

The standard commercial baseline for a paid AppExchange application is the Percent of Net Revenue (PNR) model. Under the standard SPPA, the revenue-share margin is typically 15% of the net revenue generated by the partner's application. For example, if a partner licenses their managed package to an enterprise customer for £100 per user per month, the partner must remit £15 per user per month to Salesforce.

Net revenue is calculated based on the actual price billed to the customer, net of any standard regional taxes. However, partners must be cautious: discounting the customer's subscription price reduces the partner's margin but does not exempt them from their percentage obligations. To prevent partners from selling licences at unsustainably low prices to bypass revenue shares, Salesforce enforces specific pricing parameters, particularly in the OEM Embedded space.

OEM Embedded Floor Pricing and Custom Terms

Under the OEM Embedded model, Salesforce does not merely charge a simple percentage of the partner's sale price. Because Salesforce is providing the underlying platform infrastructure (including database capacity, security layers, compute resources, and upgrades), they enforce a "Floor Price" per user per month. This floor represents the absolute minimum amount the partner must pay to Salesforce for every provisioned user, regardless of the discount given to the customer.

For instance, a standard OEM contract might specify a PNR of 15% with a floor price of £8 per user per month. Consider the commercial impact of this floor under two pricing scenarios:

  1. Scenario A (Standard Pricing): The partner sells the application at £80 per user per month. The 15% PNR equates to £12. Since £12 is higher than the £8 floor, the partner remits £12 to Salesforce and retains £68. The effective margin is 85%.
  2. Scenario B (Aggressive Discounting): The partner discounts the application to £30 per user per month to secure a strategic enterprise deal. The 15% PNR would equate to £4.50. However, because this is below the £8 floor, the partner must pay the full £8 floor price to Salesforce. The partner retains only £22. The effective revenue-share margin rises from 15% to 26.7%, severely compressing the partner's net margin.

Commercial Risk: Solution architects and sales leaders must coordinate closely. Disregarding the contractually mandated OEM floor pricing during enterprise discounting cycles can completely eliminate a partner's operating margin.

Multi-Year Revenue Share Model

Below is a commercial simulation displaying the multi-year impact of a contract with a PNR of 15% and a £10 floor price, assuming an initial enterprise deal of 1,500 seats scaling over three years at different price points:

Metric Year 1 (List Price) Year 2 (10% Discount) Year 3 (Aggressive Discount)
Active User Seats 1,500 2,000 2,500
Unit Price charged to Customer £100.00 / user / mo £90.00 / user / mo £45.00 / user / mo
Total Gross Revenue £1,800,000 £2,160,000 £1,350,000
PNR Share (15%) £15.00 / user / mo £13.50 / user / mo £6.75 / user / mo
Contractual Floor Price £10.00 / user / mo £10.00 / user / mo £10.00 / user / mo
Effective Payment to Salesforce £270,000 (PNR applied) £324,000 (PNR applied) £300,000 (Floor applied)
Partner Net Revenue £1,530,000 £1,836,000 £1,050,000
Effective Revenue-Share % 15.0% 15.0% 22.2%

Licensing Enforcements: Managing Installs via the License Management Application (LMA)

To enforce commercial agreements and control software delivery, AppExchange partners must utilise Salesforce's standard tool: the License Management Application (LMA). The LMA is installed in the partner’s License Management Organisation (LMO), which is typically their primary business environment. It acts as the absolute source of truth for all installations, version distributions, and licence states.

The LMA Schema and Data Model

When a subscriber installs a managed package from the AppExchange, a secure handshake occurs between the subscriber's environment and the partner's LMO. This handshake automatically instantiates and updates specific custom records in the partner's database. Understanding this schema is essential for automating user provisionings and tracking licence lifecycles:

  • sfLma__Package__c: Represents the partner’s actual application. It stores the metadata associated with the package, including the unique Package ID and the developer namespace prefix.
  • sfLma__Package_Version__c: Represents a specific release version of the package. It contains metadata such as the version number (e.g., 2.4.0), security review status, release date, and whether the package version is Beta or Released.
  • sfLma__License__c: The central operational object. Every installation in a subscriber org generates an active sfLma__License__c record in the partner’s LMO. It tracks the subscriber’s Org ID, expiration date, number of licensed seats (or site-wide indicator), status (Trial, Active, Suspended, Expired), and installation source.

Seat-Based vs. Site-Based Enforcement Mechanics

When designing a managed package, partners must choose how to enforce licences in the customer’s environment. This choice determines how the platform handles licence assignment:

  1. Seat-Based Licensing (Per-User): The LMA licence record specifies a discrete number of allowed users (e.g., 50 seats). In the subscriber org, the administrator must go to Setup > Installed Packages, select the package, and click Manage Licenses to explicitly allocate a licence to a specific active user. If the administrator attempts to assign a 51st user, the Salesforce platform UI blocks the action, returning an insufficient licence error. Behind the scenes, the platform stores these allocations in the standard UserPackageLicense object.
  2. Site-Based Licensing (Org-Wide): The LMA licence record is marked as site-wide. In this model, the "Manage Licenses" link is suppressed in the subscriber's Setup menu. The platform automatically authorises every active user in the subscriber's organisation to access the packaged components. Enforcement of specific user permissions is left entirely to the partner's custom code, such as inspecting custom permission sets or custom settings at runtime.

LMA Integration & Apex Automation

To deliver modern SaaS experiences, partners integrate custom Apex logic in their LMO to respond immediately when a customer installs a trial or purchases a licence. Below is a production-ready Apex handler framework designed to run on the creation of a sfLma__License__c record, auto-provisioning off-platform sandbox integrations or generating welcome notifications:

trigger LicenseAutomationTrigger on sfLma__License__c (after insert, after update) {
    List<sfLma__License__c> newLicenses = new List<sfLma__License__c>();
    
    for (sfLma__License__c lic : Trigger.new) {
        // Only trigger automation on newly active customer production environments
        if (lic.sfLma__Status__c == 'Active' && 
            (Trigger.isInsert || Trigger.oldMap.get(lic.Id).sfLma__Status__c != 'Active')) {
            newLicenses.add(lic);
        }
    }
    
    if (!newLicenses.isEmpty()) {
        LicenseProvisioningService.processActiveLicenses(newLicenses);
    }
}

public class LicenseProvisioningService {
    @future(callout=true)
    public static void processActiveLicenses(List<Id> licenseIds) {
        // Query fully populated license fields
        List<sfLma__License__c> activeLicenses = [
            SELECT Id, sfLma__Subscriber_Org_ID__c, sfLma__Seats__c, 
                   sfLma__Expiration__c, sfLma__Package_Version__r.sfLma__Version__c
            FROM sfLma__License__c 
            WHERE Id IN :licenseIds
        ];
        
        for (sfLma__License__c lic : activeLicenses) {
            try {
                // Call external provisioning API to create account tenant
                Http http = new Http();
                HttpRequest request = new HttpRequest();
                request.setEndpoint('https://api.partnerportal.com/v1/tenant/provision');
                request.setMethod('POST');
                request.setHeader('Content-Type', 'application/json');
                
                String payload = JSON.serialize(new Map<String, Object>{
                    'subscriberOrgId' => lic.sfLma__Subscriber_Org_ID__c,
                    'allocatedSeats' => lic.sfLma__Seats__c,
                    'expiryDate' => lic.sfLma__Expiration__c,
                    'installedVersion' => lic.sfLma__Package_Version__r.sfLma__Version__c
                });
                
                request.setBody(payload);
                HttpResponse response = http.send(request);
                
                if (response.getStatusCode() != 200) {
                    System.debug(LoggingLevel.ERROR, 'API Provisioning Failed for Org: ' + lic.sfLma__Subscriber_Org_ID__c);
                }
            } catch (Exception ex) {
                System.debug(LoggingLevel.ERROR, 'Exception in license provisioning: ' + ex.getMessage());
            }
        }
    }
}

The Commercial Impact of Integrating Free vs Paid Packages

Enterprise IT architectures often view "Free" AppExchange packages as an easy way to speed up delivery. However, solution architects must recognise that there is no such thing as a free lunch in a multi-tenant cloud environment. Free applications can introduce silent, significant commercial and operational overheads that can exceed the cost of paid alternatives.

Data Storage Exhaustion Costs

Salesforce allocates a baseline of data storage to every customer org (typically 10 GB for Enterprise/Unlimited, plus 20 MB per user licence). When a partner distributes a free application (for example, a logging utility, email tracker, or data synchronisation engine), that application often creates custom object records for every event or transaction it handles.

If a free application writes 500,000 logging records to a custom object per month, and each record consumes the standard 2 KB database allocation, this consumes 1 GB of database storage. Over a twelve-month period, this single free utility will consume 12 GB. Once an org exceeds its data storage limit, Salesforce blocks new record creation. To remediate this, the customer must purchase additional storage blocks, which are priced commercially at approximately £120 to £250 per GB per month. A free utility can quickly cost an organisation thousands of pounds in core storage add-ons.

API Call Limits and Off-Platform Syncs

Many "free" applications are actually front-end agents that connect to external, third-party software platforms. While the AppExchange package itself is listed as free, the overall solution requires an API-driven data integration to sync records off-platform.

Every inbound API call consumes the customer org's daily API limit (governed by the org's licence tier). If the free package processes massive batches of records via external callouts or syncs, it can easily exhaust the customer's daily API allocation. When an organisation exceeds its API limits, business-critical integrations (like ERP syncs or website forms) fail immediately. Resolving an API bottleneck typically requires upgrading core licences or purchasing custom API add-on packs from Salesforce, adding unexpected operational and commercial costs.

Architectural Best Practice: Before installing a "free" integration package, evaluate its daily transactional volume. Model the projected API callout density and custom object record generation to calculate the true cost of ownership (TCO) against a paid, native alternative that runs within standard platform bounds.

The Risk of Unmanaged Free Packages

Free applications are frequently delivered as unmanaged packages. While this allows the subscriber to view and customise the source code directly, it introduces severe architectural and governance risks:

  • No Upgrade Path: Once an unmanaged package is installed, it is completely severed from the developer's source repository. The customer cannot receive automatic bug patches, security updates, or feature enhancements. To upgrade, the administrator must completely uninstall the existing package (losing all historical data stored in its objects) and install the new version.
  • Technical Debt Ownership: The moment you install an unmanaged package, your development team becomes the sole owner of the code. If a future Salesforce platform upgrade (such as an API retirement or a mandatory security update) breaks the unmanaged code, your internal team must debug and patch it. This can consume high-value development hours that should be spent on strategic business delivery.

Governance Playbook: Reviewing Third-Party Package Dependencies and Commercial Risk

To safeguard enterprise environments from security vulnerabilities, platform instability, and unexpected licensing costs, the Center of Excellence (CoE) must establish a strict governance playbook for all third-party package installations. Administrators and solution architects should enforce a multi-stage review before any package—free or paid—is allowed in a sandbox or production environment.

The Package Governance Framework

The governance framework must address three primary dimensions: **Security Compliance**, **Metadata Consumption**, and **Commercial Dependencies**.

  1. Salesforce Security Review Validation: Ensure that the managed package has passed the official Salesforce Security Review. Certified managed packages that have successfully passed the security review are granted specific platform exemptions in the subscriber org. Most importantly, their custom objects, custom tabs, and active flows do not count against the subscriber's hard limits (e.g., the limit of 2,000 custom objects per org in Enterprise and Unlimited editions). Uncertified managed packages or unmanaged packages count directly against these limits, which can block future internal custom developments.
  2. Transient Dependency Mapping: Review the package metadata to identify any hidden dependencies on other AppExchange packages or external services. Some free packages require the installation of paid packages to function, or they make callouts to unverified third-party domains that do not comply with the organisation's data privacy policies.
  3. Namespace Limit Tracking: Monitor namespace isolation to ensure that package installations do not create governor limit bottlenecks. Managed packages execute Apex code within their own namespace limits (e.g., they receive a separate transaction limit for SOQL queries), but they share the overall CPU time limit and heap size limits during execution. An unoptimised managed package trigger can cause your standard processes to fail with LimitException errors.

Programmatic Package Inventory and Metadata Audit

To maintain absolute visibility, platform architects should run programmatic audits to inventory all installed managed packages and assess their impact on the org's metadata limits. Below is a SOQL query designed to execute against the Tooling API to extract a comprehensive inventory of installed subscriber packages, namespaces, and validation states:

-- Query the Tooling API to extract all installed package details
SELECT Id, SubscriberPackageId, SubscriberPackage.Name, 
       SubscriberPackage.NamespacePrefix, MinVersionNumber, 
       MaxVersionNumber, IsOrgDependent
FROM InstalledSubscriberPackage

To identify the volume of custom objects introduced by specific namespace prefixes (which helps verify if a package is consuming core metadata limits), run the following query against the Tooling API:

-- Query the Tooling API to count custom objects allocated to a specific managed namespace
SELECT Id, DeveloperName, NamespacePrefix, SharingModel 
FROM CustomObject 
WHERE NamespacePrefix = 'sfLma' 
   OR NamespacePrefix = 'YOUR_APP_NAMESPACE'

Architectural Licensing Audit Checklist

The Center of Excellence should mandate that the following checklist is completed and signed off by the Lead Salesforce Architect prior to package procurement:

Governance Check Verification Method Acceptable Compliance Standard
Security Review Status Inspect the AppExchange listing for the "Salesforce Certified" badge. Must be fully certified. No uncertified packages allowed in production without explicit executive sign-off.
Custom Object Impact Calculate the number of custom objects in the package. If certified, object count is exempted. If uncertified, the count must fit within the remaining 10% org margin.
Data Storage Footprint Analyse the package's transactional logging rate. Must not generate more than 10,000 persistent records per month without an automated archiving or off-platform storage strategy.
API Limit Consumption Review integration architecture documentation. Package must utilize bulk API endpoints for batch operations. Single REST callouts must not exceed 5% of daily limits.
Upgrade Automation Confirm package delivery type (Managed vs Unmanaged). Must be a managed package. Unmanaged packages are prohibited unless there is an agreed plan for code ownership and support.

Key Takeaways

  • ISVforce applications require customers to have pre-existing CRM user licences and allow direct access to standard objects like Opportunities and Leads.
  • OEM Embedded applications bundle the Salesforce platform under the partner’s own licence, strictly blocking access to standard Sales and Service Cloud objects.
  • Revenue share is calculated via Percent of Net Revenue (PNR), but OEM contracts enforce floor prices that can compress partner margins during high discounting.
  • The License Management Application (LMA) uses objects like sfLma__License__c to track installs, seat allocations, and automate subscriber provisioning processes.
  • Free packages often introduce hidden platform costs, including standard database storage charges, API limit exhaustion, and permanent technical debt.
  • A Center of Excellence (CoE) must establish a package governance playbook to audit security reviews, namespace limits, and custom object consumption.

Checkpoint: Test Your Understanding

1. Solution Architects planning an OEM Embedded package must accommodate which architectural boundary?

A. OEM packages cannot use Apex or custom triggers.
B. OEM users are capped at a maximum of 10 custom objects total.
C. OEM users cannot commercially or technically access standard CRM objects like Lead and Opportunity.
D. OEM packages can only be deployed in unmanaged formats.

2. If an OEM Embedded application has a 15% PNR agreement with a £10 floor price per user per month, what is the payment to Salesforce if the partner licenses the app at a discounted price of £40 per user per month?

A. £6.00, representing the standard 15% PNR share.
B. £10.00, because the standard PNR calculation (£6) falls below the contractual floor price.
C. £16.00, which combines the PNR share and the floor price.
D. £0.00, since the customer is billed directly by Salesforce.

3. Which LMA object is responsible for tracking individual client installation records, trial expirations, and seat quantities?

A. sfLma__Package__c
B. UserPackageLicense
C. sfLma__License__c
D. sfLma__Package_Version__c

Discussion & Feedback