En corto
Con ocho consultas sabes en media hora cuántos usuarios entran de verdad, cuántas licencias tienes asignadas y libres, qué paquetes de AppExchange pagas y cuántos objetos custom, Flows, clases Apex y triggers hay en tu org. Es la base para negociar una renovación o para dimensionar una migración.
Antes de empezar
Necesitas un usuario que pueda ver la configuración. Lanza las consultas desde el Developer Console, en el Query Editor, o desde Workbench. Las marcadas como Tooling API requieren activar esa opción. Ninguna cambia nada: todas son de lectura.
1. Usuarios activos que no entran
SOQL
SELECT Name, Profile.Name, LastLoginDate
FROM User
WHERE IsActive = true
AND (LastLoginDate < LAST_N_DAYS:90 OR LastLoginDate = null)Cada fila es una licencia que pagas y que nadie usa desde hace tres meses.
2. Licencias contratadas y usadas
SOQL
SELECT Name, TotalLicenses, UsedLicenses
FROM UserLicense
WHERE TotalLicenses > 0Compara la licencia Salesforce con Salesforce Platform. Mucha gente que solo consulta podría ir con una licencia más barata.
3. Licencias de permission sets
SOQL
SELECT MasterLabel, TotalLicenses, UsedLicenses
FROM PermissionSetLicense
WHERE TotalLicenses > 0Aquí aparecen los add-ons que se asignan por usuario, como CPQ o funciones de IA.
4. Paquetes de AppExchange
SOQL
SELECT NamespacePrefix, Status, AllowedLicenses, UsedLicenses, ExpirationDate
FROM PackageLicenseCada paquete es otra factura, otro proveedor y otra dependencia en una migración.
5. Objetos custom
Tooling API
SELECT DeveloperName, NamespacePrefix, CreatedDate
FROM CustomObject
WHERE NamespacePrefix = nullDespués, cuenta los registros de los que importen con SELECT COUNT() FROM Objeto__c. Un objeto sin registros nuevos en un año es candidato a quedarse fuera.
6. Flows y procesos activos
SOQL
SELECT ApiName, ProcessType, LastModifiedDate
FROM FlowDefinitionView
WHERE IsActive = trueLos que tienen ProcessType = 'Workflow' son procesos de Process Builder, sin soporte desde finales de 2025.
7. Código Apex propio
Tooling API
SELECT Name, LengthWithoutComments, LastModifiedDate
FROM ApexClass
WHERE NamespacePrefix = nullLas clases largas que nadie toca desde hace años son deuda. Las que llevan la lógica del negocio son lo primero que hay que entender, te quedes o te vayas.
8. Triggers
Tooling API
SELECT Name, TableEnumOrId, Status
FROM ApexTrigger
WHERE NamespacePrefix = nullVarios triggers sobre el mismo objeto, más Flows y reglas, es la receta de esos errores que nadie sabe explicar.
Qué hacer con los resultados
- Ajusta las licencias antes de la renovación.
- Haz la lista de lo que pagas y no usas: paquetes, add-ons y permission set licenses.
- Marca qué objetos, Flows y código siguen vivos. Es el alcance real de cualquier cambio.
Si prefieres no hacerlo tú, en la primera semana de un proyecto hacemos este mismo diagnóstico con un usuario de solo lectura. No tocamos nada de tu org.
Preguntas frecuentes
¿Necesito ser administrador?
Necesitas el permiso View Setup and Configuration y, para la Tooling API, acceso a la API. Normalmente, un admin.
¿Estas consultas cambian algo en mi org?
No. Son consultas de lectura.
¿Funcionan en Pro Suite?
Depende del acceso a API de tu edición. En Enterprise, Unlimited, Core o Advanced, sí.
Fuentes: referencia de SOQL (Salesforce Developers), guía de la Tooling API (Salesforce Developers).