Esta es una traducción que desde EGA Futura ofrecemos como cortesía a toda la Ohana y comunidad de programadores , consultores , administradores y arquitectos de Salesforce para toda Iberoamérica .
El enlace a la publicación original, lo encontrarás al final de este artículo.
…
High Velocity Sales (HVS) es una solución de Sales Cloud para acelerar el proceso de ventas para los equipos de ventas internos. La configuración básica de HVS normalmente la realiza un administrador. Sin embargo, a menudo se necesita a los desarrolladores para implementar automatizaciones más avanzadas. HVS incluye varias funciones, como cadencias de ventas, puntuación de clientes potenciales de Einstein, integración de correo electrónico y marcador de ventas. En esta publicación de blog, cubriremos lo que los desarrolladores necesitan saber sobre las cadencias de ventas y también profundizaremos en cómo implementar automatizaciones comunes, con y sin código.
Antes de comenzar: si no conoce los conceptos básicos sobre HVS, mire esta demostración de 2 minutos .
Automatizar los flujos de trabajo de ventas internas con Sales Cadences
Una cadencia de ventas es una representación de un flujo de trabajo de ventas interno; guía a los representantes de ventas a través de los procesos de prospección y fomento de oportunidades de una venta. Los pasos para una cadencia de ventas se configuran con clics en Sales Cadence Builder. Por ejemplo, esta cadencia de ventas contiene una combinación de correos electrónicos y llamadas que un representante de ventas debe realizar para comunicarse con un posible cliente. Usaremos esta cadencia de ventas para los ejemplos de esta publicación de blog.
Los prospectos se pueden asignar a las cadencias de ventas. Esto se puede hacer manualmente o de forma automatizada, llamando a la acción invocable assignTargetToSalesCadence. Una vez hecho esto, el prospecto entra en la cadencia de ventas y los siguientes pasos a realizar se vuelven visibles para el representante de ventas apropiado.
Modelo de datos de cadencias de ventas
Bajo el capó, la definición de una cadencia de ventas se almacena como datos en un conjunto de nuevos sObjects:
-
ActionCadence
: creado cuando usa la aplicación High Velocity Sales para crear una cadencia de ventas -
ActionCadenceStep
: representa un paso; si el paso es un paso de bifurcación, también se crean los registrosActionCadenceRul
e yActionCadenceRuleCondition
-
ActionCadenceRule
: representa la lógica que utiliza un paso de rama para tomar decisiones en su cadencia de ventas -
ActionCadenceRuleCondition
: representa la lógica de un paso de bifurcación. Mientras queActionCadenceRule
representa la expresión lógica completa,ActionCadenceRuleCondition
representa cada componente de la expresión. Entonces, si la expresión lógica es (A = 2) AND (B = 4), entonces las condiciones de la regla serían (A = 3), (B = 4) y la regla es la combinación de ellas con el operador AND.
Hay dos sObjects adicionales que realizan un seguimiento del paso de la cadencia de ventas en el que se encuentra un cliente potencial:
-
ActionCadenceTracker
: creado cuando asigna un cliente potencial a una cadencia de ventas -
ActionCadenceStepTracker
: se crea cada vez que el cliente potencial pasa a un nuevo paso
Esos sObjects están disponibles a través de la API SOAP , lo que significa que también puede consultarlos. Por el momento, la create()
no está disponible para los objetos de cadencia de ventas, sin embargo, esto está en la hoja de ruta del producto y será posible pronto. Esto significa que no puede crearlos mediante programación utilizando Apex o API. Solo puede crearlos desde Sales Cadence Builder.
Para comprender mejor el modelo de datos, echemos un vistazo a lo que sucede cuando agrega un cliente potencial a la cadencia de ventas por correo electrónico simple que vimos anteriormente.
Cuando se hace esto, se ActionCadenceStepTracker
registros ActionCadenceTracker
y ActionCadenceStepTracker. Luego podemos recuperar el ActionCadenceTracker
creado ejecutando:
SELECT ActionCadence.Name, Target.Name, CurrentStep.StepTitle, LastCompletedStep.StepTitle, State, RelatedToId FROM ActionCadenceTracker
Esto es lo que obtendrás:
ActionCadence.Name | Target.Name | CurrentStep.StepTitle | LastCompletedStep.Title | Estado |
Cadencia de correo electrónico simple | Robert Janzen | Correo electrónico de introducción | – | Corriendo |
Del mismo modo, podemos echar un vistazo al ActionCadenceStepTracker
que se ha creado:
SELECT ActionCadenceName, Target.Name, StepTitle, DueDateTime, IsActionTaken, ActionTakenDatetime, State from ActionCadenceStepTracker
ActionCadenceName | Target.Name | StepTitle | DueDateTime | IsActionTaken | IsActionTakenDateTime | Estado |
Cadencia de correo electrónico simple | Robert Janzen | Correo electrónico de introducción | 2021-08-31T21: 59: 59.000 + 0000 | FALSO | – | Activo |
Llamar a acciones invocables de HVS
Las automatizaciones básicas se pueden implementar mediante clics. HVS tiene la siguiente lista de acciones invocables que puede invocar desde lugares, como Flow, Process Builder, la API REST (como lo hacemos en este ejemplo ) o Apex (como lo hacemos aquí ), para implementar sus automatizaciones:
-
assignTargetToSalesCadence
-
removeTargetFromSalesCadence
-
pauseSalesCadenceTracker
-
resumeSalesCadenceTracker
-
changeSalesCadenceTargetAssignee
-
modifyCadenceTrackerAttributes
-
sendSalesCadenceEvent
Tenga en cuenta que la llamada a acciones invocables desde Apex se puede simplificar utilizando esta función de vista previa para desarrolladores en Winter '22 .
Eche un vistazo a una definición más detallada de las acciones disponibles en la guía de acciones invocables de HVS .
Trabajar con cambios en Action Cadence Tracker
Como se mencionó anteriormente, para automatizaciones más avanzadas, deberá escribir código. Un caso de uso de automatización común es poder reaccionar a los ActionCadenceTracker
para ejecutar una acción en función de ciertas condiciones. Por ejemplo, cambie el estado del ActionCadenceTracker
a "En funcionamiento" cuando se crea el ActionCadenceTracker por primera vez oa "" Cerrado "cuando se completa. Una limitación que existe a día de hoy es que no puede crear activadores para ActionCadenceTracker
y ActionCadenceStepTracker
. Sin embargo, la captura de datos modificados (CDC) se puede utilizar para crear automatización. Primero, deberá activar CDC para el objeto ActionCadenceTracker
Luego, puede escuchar eventos de CDC en Apex, creando un disparador de Apex Async . Por ejemplo, implementemos una automatización que cambia el estado de un cliente potencial a "En funcionamiento" cuando se agrega a una cadencia de ventas:
desencadenar UpdateLeadWhenAddedToCadenceTrigger en ActionCadenceTrackerChangeEvent (después de insertar) { Establecer <Id> leadIds = new Establecer <Id> (); para (evento ActionCadenceTrackerChangeEvent: Trigger.New) { Encabezado EventBus.ChangeEventHeader = event.ChangeEventHeader; // Si se creó el rastreador (el cliente potencial se agregó a la cadencia de ventas), cambie el estado del cliente potencial a 'Trabajando' if (header.changeType == 'CREATE') { // Es posible que el Id no sea un leadId, pero en ese caso la consulta no lo devolverá leadIds.add (event.TargetId); } } Enumere <Lead> leadsToUpdate = [SELECCIONE Estado DESDE el Lead DONDE ID IN: leadIds]; para (LeadToUpdate: leadsToUpdate) { if (leadToUpdate.Status! = 'Trabajando') { leadToUpdate.Status = 'Trabajando'; } } actualizar leadsToUpdate; }
Desafortunadamente, no es posible escuchar eventos de CDC en Flow o Process Builder. Tendrá que crear un disparador de Apex Async que transforme el evento de CDC en un evento de plataforma personalizado y luego escuchar el evento de plataforma personalizado.
Por ejemplo, digamos que el evento de plataforma personalizado se llama SalesCadenceTrackerEvent__e
. Así es como implementaría el disparador CDC:
/ ** * Este disparador escucha eventos de cambio en ActionCadenceTracker y publica una plataforma * evento (SalesCadenceTrackerEvent__e) siempre que un rastreador se inicia por primera vez y cuando se * completado. A continuación, puede utilizar Flows o Process Builder para escuchar el evento de la plataforma. * / desencadenar ActionCadenceTrackerChangeEventTrigger en ActionCadenceTrackerChangeEvent (después de insertar) { List <SalesCadenceTrackerEvent__e> cadenceEvents = new List <SalesCadenceTrackerEvent__e> (); List <String> trackerIdsToQuery = new List <String> (); para (evento ActionCadenceTrackerChangeEvent: Trigger.New) { Encabezado EventBus.ChangeEventHeader = event.ChangeEventHeader; List <String> recordIds = event.ChangeEventHeader.getRecordIds (); String trackerId = recordIds.get (0); // Si se completó Tracker, deberíamos enviar un evento if (header.changeType == 'ACTUALIZAR') { if (event.State == 'Complete') { // Los eventos de actualización no tienen toda la información que necesitamos, así que tenemos que consultar trackerIdsToQuery.add (trackerId); } } // Si se creó Tracker, deberíamos enviar un evento if (header.changeType == 'CREATE') { SalesCadenceTrackerEvent__e cadenceEvent = new SalesCadenceTrackerEvent__e (); cadenceEvent.TrackerId__c = trackerId; cadenceEvent.CadenceId__c = event.ActionCadenceId; cadenceEvent.State__c = event.State; // Esto será 'Corriendo' cadenceEvent.TargetId__c = event.TargetId; // Este será el cliente potencial, el contacto, la identificación de la cuenta de la persona cadenceEvents.add (cadenceEvent); } // Consulta la información de los rastreadores para ACTUALIZACIONES if (trackerIdsToQuery.size ()> 0) { Lista <ActionCadenceTracker> trackers = [SELECT ID, ActionCadenceId, State, TargetId de ActionCadenceTracker DONDE ID en: trackerIdsToQuery]; para (ActionCadenceTracker tracker: trackers) { SalesCadenceTrackerEvent__e cadenceEvent = new SalesCadenceTrackerEvent__e (); cadenceEvent.TrackerId__c = tracker.Id; cadenceEvent.CadenceId__c = tracker.ActionCadenceId; cadenceEvent.State__c = tracker.State; // Esto será 'Completo' cadenceEvent.TargetId__c = tracker.TargetId; // Este será el cliente potencial, el contacto, la identificación de la cuenta de la persona cadenceEvents.add (cadenceEvent); } } } // Publique los eventos para que Flow o Process Builder los escuchen EventBus.publish (cadenceEvents); }
Tenga en cuenta que el código anterior solo lanza el evento cuando el rastreador de cadencia se crea por primera vez o cuando se completa (estado = Completo). Luego, esos SalesCadenceTrackerEvent__e
recién creados se pueden detectar desde Flow o Process Builder para implementar las automatizaciones deseadas.
Aquí tienes un diagrama que representa uno de los posibles flujos en esta automatización:
Si desea obtener más información, consulte este documento que contiene instrucciones detalladas sobre cómo implementar esta automatización.
Trabajar con cambios de ActionCadenceStepTracker
Del mismo modo, si desea reaccionar a los ActionCadenceStepTracker
, tendrá que usar CDC. Luego, puede escuchar los eventos de CDC desde un disparador e implementar las automatizaciones requeridas con código (como lo hacemos en este ejemplo ). Alternativamente , puede convertir el evento CDC en un evento de plataforma personalizado, al igual que hicimos con Action Cadence Tracker. A quí tiene el código para hacerlo:
/ ** * Este disparador escucha eventos de cambio en ActionCadenceStepTracker y publica una plataforma * evento (SalesCadenceStepTrackerEvent__e) siempre que un rastreador de pasos se inicia por primera vez y cuando se * completado. A continuación, puede utilizar Flows o Process Builder para escuchar el evento de la plataforma. * / desencadenar ActionCadenceStepTrackerChangeEventTrigger en ActionCadenceStepTrackerChangeEvent (después de insertar) { List <SalesCadenceStepTrackerEvent__e> cadenceEvents = new List <SalesCadenceStepTrackerEvent__e> (); List <String> stepTrackerIdsToQuery = new List <String> (); para (evento ActionCadenceStepTrackerChangeEvent: Trigger.New) { Encabezado EventBus.ChangeEventHeader = event.ChangeEventHeader; List <String> recordIds = event.ChangeEventHeader.getRecordIds (); String stepTrackerId = recordIds.get (0); // Si se completó StepTracker, deberíamos enviar un evento if (header.changeType == 'ACTUALIZAR') { if (event.State == 'Completed') { // Los eventos de actualización no tienen toda la información que necesitamos, así que tenemos que consultar stepTrackerIdsToQuery.add (stepTrackerId); } } // Si se creó StepTracker, deberíamos enviar un evento if (header.changeType == 'CREATE') { SalesCadenceStepTrackerEvent__e cadenceEvent = new SalesCadenceStepTrackerEvent__e (); cadenceEvent.StepTrackerId__c = stepTrackerId; cadenceEvent.CadenceId__c = event.ActionCadenceId; cadenceEvent.CadenceStepId__c = event.ActionCadenceStepId; cadenceEvent.State__c = event.State; // Esto será 'Activo' cadenceEvent.StepType__c = event.StepType; // Este será SendAnEmail, MakeACall, etc. cadenceEvent.TargetId__c = event.TargetId; // Este será el cliente potencial, el contacto, la identificación de la cuenta de la persona cadenceEvent.StepTitle__c = event.StepTitle; cadenceEvents.add (cadenceEvent); } } // Consulta de los rastreadores de pasos if (stepTrackerIdsToQuery.size ()> 0) { Lista <ActionCadenceStepTracker> stepTrackers = [SELECT ID, ActionCadenceId, ActionCadenceStepId, State, StepTitle, StepType, TargetId de ActionCadenceStepTracker DONDE ID en: stepTrackerIdsToQuery]; para (ActionCadenceStepTracker stepTracker: stepTrackers) { SalesCadenceStepTrackerEvent__e cadenceEvent = new SalesCadenceStepTrackerEvent__e (); cadenceEvent.StepTrackerId__c = stepTracker.Id; cadenceEvent.CadenceId__c = stepTracker.ActionCadenceId; cadenceEvent.CadenceStepId__c = stepTracker.ActionCadenceStepId; cadenceEvent.State__c = stepTracker.State; // Esto será 'Completado' cadenceEvent.StepType__c = stepTracker.StepType; // Este será SendAnEmail, MakeACall, etc. cadenceEvent.TargetId__c = stepTracker.TargetId; // Este será el cliente potencial, el contacto, la identificación de la cuenta de la persona cadenceEvent.StepTitle__c = stepTracker.StepTitle; cadenceEvents.add (cadenceEvent); } } // Publique los eventos para que Flow o Process Builder los escuchen EventBus.publish (cadenceEvents); }
Tenga en cuenta que el código anterior solo lanza el evento cuando el rastreador de pasos de cadencia se crea por primera vez (estado = Activo) o cuando se completa (estado = Completado).
Aquí tienes otro diagrama que representa uno de los posibles flujos en esta automatización:
Eche un vistazo a este otro documento para leer instrucciones detalladas sobre cómo implementar esta automatización.
Próximos pasos
En esta publicación de blog, hemos cubierto los puntos más importantes para implementar con éxito automatizaciones para cadencias de ventas en ventas de alta velocidad.
Si desea ver más ejemplos, eche un vistazo a esta página de documentación en la que se explican algunas ideas de automatización más. También hemos subido todos los ejemplos de código a este repositorio de GitHub , para un consumo más fácil.
Finalmente, recomiendo abordar este sendero Trailhead , en el que podrá aprender los conceptos funcionales de HVS más importantes para mejorar sus implementaciones.
Sobre el Autor
Alba Rivas trabaja como defensora principal de desarrolladores en Salesforce. Se centra en los componentes web Lightning y la estrategia de adopción de Lightning. Puedes seguirla en Twitter @AlbaSFDC .
…
Esta es una traducción realizada por EGA Futura, y este es el link a la publicación original: https://developer.salesforce.com/blogs/2021/10/automations-for-sales-cadences-in-high-velocity-sales.html