Product Qualified Lead (PQL) development guidelines
The Product Qualified Lead (PQL) funnel connects our users with our team members. Read more about PQL product principles.
A hand-raise PQL is a user who requests to speak to sales from within the product.
Set up your development environment
Set up GDK with a connection to your local CustomersDot instance.
Set up CustomersDot to talk to a staging instance of Workato.
Set up CustomersDot using the standard install instructions.
Set the
CUSTOMER_PORTAL_URL
environment variable to your local URL of your CustomersDot instance.Place
export CUSTOMER_PORTAL_URL=http://localhost:5000/
in your shellrc
script (~/.zshrc
or~/.bash_profile
or~/.bashrc
) and restart GDK.Enter the credentials on CustomersDot development to Workato in your
/config/secrets.yml
and restart. Credentials for the Workato Staging are in the 1Password Subscription portal vault. The URL for staging ishttps://apim.workato.com/gitlab-dev/services/marketo/lead
.
workato_url: "<%= ENV['WORKATO_URL'] %>"
workato_client_id: "<%= ENV['WORKATO_CLIENT_ID'] %>"
workato_client_secret: "<%= ENV['WORKATO_CLIENT_SECRET'] %>"
Set up lead monitoring
- Set up access for the Marketo sandbox, similar to this example request.
Manually test leads
- Register a new user with a unique email on your local GitLab instance.
- Send the PQL lead by submitting your new form or creating a new trial or a new hand raise lead.
- Use easily identifiable values that can be easily seen in Workato staging.
- Observe the entry in the staging instance of Workato and paste in the merge request comment and mention.
Troubleshooting
- Check the application and Sidekiq logs on
gitlab.com
and CustomersDot to monitor leads. - Check the
leads
table in CustomersDot. - Ask for access to the Marketo Sandbox and validate the leads there, to this example request.
Embed a hand-raise lead form
HandRaiseLeadButton is a reusable component that adds a button and a hand-raise modal to any screen.
You can import a hand-raise lead button in the following ways:
For Haml:
.js-hand-raise-lead-trigger{ data: discover_page_hand_raise_lead_data(group) }
For Vue:
<script>
import HandRaiseLeadButton from 'ee/hand_raise_leads/hand_raise_lead/components/hand_raise_lead_button.vue';
export default {
handRaiseLeadAttributes: {
variant: 'confirm',
category: 'tertiary',
class: 'gl-sm-w-auto gl-w-full gl-sm-ml-3 gl-sm-mt-0 gl-mt-3',
'data-testid': 'some-unique-hand-raise-lead-button',
},
ctaTracking: {
action: 'click_button',
},
components: {
HandRaiseLeadButton,
...
</script>
<template>
<hand-raise-lead-button
:button-attributes="$options.handRaiseLeadAttributes"
glm-content="some-unique-glm-content"
:cta-tracking="$options.ctaTracking"
/>
...
</template>
The hand-raise lead form submission can send unique data on modal submission and customize the button by providing the following props to the button:
props: {
ctaTracking: {
type: Object,
required: false,
default: () => ({}),
},
buttonText: {
type: String,
required: false,
default: PQL_BUTTON_TEXT,
},
buttonAttributes: {
type: Object,
required: true,
},
glmContent: {
type: String,
required: true,
},
productInteraction: {
type: String,
required: false,
default: PQL_PRODUCT_INTERACTION,
},
},
The ctaTracking
parameters follow the data-track
attributes for implementing Snowplow tracking.
The provided tracking attributes are attached to the button inside the HandRaiseLeadButton
component,
which triggers the hand-raise lead modal when selected.
Monitor the lead location
When embedding a new hand raise form, use a unique glmContent
or glm_content
field that is different to any existing values.
PQL lead flow
The flow of a PQL lead is as follows:
- A user triggers a
HandRaiseLeadButton
component ongitlab.com
. - The
HandRaiseLeadButton
submits any information to the following API endpoint:/-/gitlab_subscriptions/hand_raise_leads
. - That endpoint reposts the form to the CustomersDot
trials/create_hand_raise_lead
endpoint. - CustomersDot records the form data to the
leads
table and posts the form to Workato. - Workato sends the form to Marketo.
- Marketo does scoring and sends the form to Salesforce.
- Our Sales team uses Salesforce to connect to the leads.
Trial lead flow
Trial lead flow on GitLab.com
sequenceDiagram Trial Frontend Forms ->>TrialsController#create_lead: GitLab.com frontend sends [lead] to backend TrialsController#create->>CreateLeadService: [lead] TrialsController#create->>ApplyTrialService: [lead] Apply the trial CreateLeadService->>SubscriptionPortalClient#generate_trial(sync_to_gl#61;false): [lead] Creates customer account on CustomersDot ApplyTrialService->>SubscriptionPortalClient#generate_trial(sync_to_gl#61;true): [lead] Asks CustomersDot to apply the trial on namespace SubscriptionPortalClient#generate_trial(sync_to_gl#61;false)->>CustomersDot|TrialsController#create(sync_to_gl#61;false): GitLab.com sends [lead] to CustomersDot SubscriptionPortalClient#generate_trial(sync_to_gl#61;true)->>CustomersDot|TrialsController#create(sync_to_gl#61;true): GitLab.com asks CustomersDot to apply the trial
Trial lead flow on CustomersDot (sync_to_gl
)
sequenceDiagram CustomersDot|TrialsController#create->>HostedPlans|CreateTrialService#execute: Save [lead] to leads table for monitoring purposes HostedPlans|CreateTrialService#execute->>BaseTrialService#create_account: Creates a customer record in customers table HostedPlans|CreateTrialService#create_lead->>CreateLeadService: Creates a lead record in customers table HostedPlans|CreateTrialService#create_lead->>Workato|CreateLeadWorker: Async worker to submit [lead] to Workato Workato|CreateLeadWorker->>Workato|CreateLeadService: [lead] Workato|CreateLeadService->>WorkatoApp#create_lead: [lead] WorkatoApp#create_lead->>Workato: [lead] is sent to Workato
Applying the trial to a namespace on CustomersDot
sequenceDiagram HostedPlans|CreateTrialService->load_namespace#Gitlab api/namespaces: Load namespace details HostedPlans|CreateTrialService->create_order#: Creates an order in orders table HostedPlans|CreateTrialService->create_trial_history#: Creates a record in trial_histories table
Hand raise lead flow
Hand raise flow on GitLab.com
sequenceDiagram HandRaiseForm Vue Component->>HandRaiseLeadsController#create: GitLab.com frontend sends [lead] to backend HandRaiseLeadsController#create->>CreateHandRaiseLeadService: [lead] CreateHandRaiseLeadService->>SubscriptionPortalClient: [lead] SubscriptionPortalClient->>CustomersDot|TrialsController#create_hand_raise_lead: GitLab.com sends [lead] to CustomersDot
Hand raise flow on CustomersDot
sequenceDiagram CustomersDot|TrialsController#create_hand_raise_lead->>CreateLeadService: Save [lead] to leads table for monitoring purposes CustomersDot|TrialsController#create_hand_raise_lead->>Workato|CreateLeadWorker: Async worker to submit [lead] to Workato Workato|CreateLeadWorker->>Workato|CreateLeadService: [lead] Workato|CreateLeadService->>WorkatoApp#create_lead: [lead] WorkatoApp#create_lead->>Workato: [lead] is sent to Workato
PQL flow after Workato for all lead types
sequenceDiagram Workato->>Marketo: [lead] Marketo->>Salesforce(SFDC): [lead]