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=false): [lead] Creates customer account on CustomersDot ApplyTrialService->>SubscriptionPortalClient#generate_trial(sync_to_gl=true): [lead] Asks CustomersDot to apply the trial on namespace SubscriptionPortalClient#generate_trial(sync_to_gl=false)->>CustomersDot|TrialsController#create(sync_to_gl=false): GitLab.com sends [lead] to CustomersDot SubscriptionPortalClient#generate_trial(sync_to_gl=true)->>CustomersDot|TrialsController#create(sync_to_gl=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]
Docs
Edit this page to fix an error or add an improvement in a merge request.
Create an issue to suggest an improvement to this page.
Product
Create an issue if there's something you don't like about this feature.
Propose functionality by submitting a feature request.
Feature availability and product trials
View pricing to see all GitLab tiers and features, or to upgrade.
Try GitLab for free with access to all features for 30 days.
Get help
If you didn't find what you were looking for, search the docs.
If you want help with something specific and could use community support, post on the GitLab forum.
For problems setting up or using this feature (depending on your GitLab subscription).
Request support