This is a cross-functional page which is meant to be the source of truth for our Quote to Cash (Q2C) teams, project management process, and system architecture.
Person | Role |
---|---|
Jesse Rabbits | Sr. Manager, Deal Desk |
Person | Role |
---|---|
Jack Brennan | Director, Sales Systems |
Jessica Salcido | Finance Systems Administrator |
Santhosh Baranidharan | Senior Business Systems Analyst |
Person | Role |
---|---|
Israel Weeks | Senior Manager, Data |
To be added
The Fulfillment Team is re-architecting our Quote 2 Cash Systems, in particular CustomersDot, in a way that promotes more reliability, sustainability, and flexibility. This handbook page serves as the SSOT for the Q2C systems with links back to functional department pages and artifacts.
Cross-Functional SSOT Architecture Plans:
Zuora serves as the source of truth for Zuora Account
and Zuora Contact
data once a Subscription is purchased. Prior to a purchase, a user can register for CDot which creates a CustomersDot User
record that isn't associated with an CustomersDot BillingAccount
(because it doesn't exist yet). Once purchased, the CustomersDot BillingAccount
record is created along with the related CustomersDot BillingAccountMembership
.
Given that CustomersDot User
/Zuora Contact
and CustomersDot BillingAccount
/Zuora Account
information can be edited by users directly in CDot or directly in Zuora (or indirectly via SFDC), we need to be mindful of syncing this data between CDot and Zuora. In particular, if we can't use Zuora callouts to keep the CustomersDot BillingAccount
and CustomersDot User
records in sync, we will explore Zuora Custom Events.
A CustomersDot User
record in CDot is tied to one email address. This email address can be associated with multiple Zuora Account
s, and therefore have multiple Zuora Contact
s. Each of these Zuora Contact
s could be modified independently. For instance, a billing admin may choose to change the address for Contact A for the billing entity in the US, but not choose to change the address for Contact B (associated with the same email address) for the billing entity in Europe. For this reason, contact metadata could eventually be stored on the CustomersDot BillingAccountMembership
model, but we are choosing to keep this lightweight to begin with to reduce scope. We will start by fetching this data from Zuora.
This table shows the equivalent data objects across systems:
GitLab | CustomersDot | Zuora | SFDC |
---|---|---|---|
Organization | BillingAccount | Account | BillingAccount |
User | User | Contact | Contact |
- | Order | Order | Opportunity & primary quote |
- | Subscription | Subscription | TBD Quote Amendment |
License | License | - | - |
- | Cloud Activation | - | - |
Note: In SFDC, a SFDC BillingAccount is not the same as a SFDC Account. A SFDC Account can have many BillingAccounts.
Note: The Order object in CustomersDot is not the same as the Order object in Zuora, they have different definitions. Orders in CustomerDot are more like subscriptions in Zuora than they are Orders in Zuora. More architecture and definition work needs to be done on the Order object in CustomersDot.
More information about the User and Contact objects shown in the table above, and how they interact together, can be found in this workflow documentation.
The following is a focused view of the database ERD for the newly proposed data architecture.
Zuora provides a diagram of the relationships of Zuora's Billing Object Model
To reduce the amount of data issues across our systems, our goal is to try to ensure we have a 1:1 mapping between Zuora Billing Object Model and CustomersDot.
Zuora CPQ is used to connect Zuora with Salesforce.
CustomersDot BillingAccount management
First, we want to focus on improving the data architecture alignment with Zuora Billing Accounts. The Customer
model in CDot has known design flaws as it represents a combination of both a Contact (individual user) and an Account (organization). Research for this epic can be found in this Spike issue.
In this epic, the focus is on improving the data architecture of CustomersDot to better align with Zuora Billing Accounts. The Customer
model in CDot has known design flaws as it represents a combination of both a Zuora Contact (individual user) and a Zuora Account (organization).
Currently CustomersDot (CDot) has a data object for Customer
(e.g. customers
DB table) which serves a few different functions:
It is important to note that a Zuora Account maps to a company/customer account which can have many users or contacts. It should not map to one user in particular. In the current architecture, a zuora_account_id
can be shared with more than one Customer but this isn't ideal. We need to have an architecture that accurately reflects the data structure from Zuora and our business model. In CustomersDot, we need to have a data architecture that accurately reflects Zuora's Billing Objects Model).
We recommend adding a few new models to the CustomersDot data architecture to better reflect the Zuora data structure.
Most importantly, CDot lacks a model for the CustomersDot BillingAccount
(aka. "Company" / "Billing Entity"). Adding this model will allow us to separate the data currently in the CustomersDot Customer
model that belongs at a BillingAccount level (see below for an example). We will also be renaming CustomersDot Customer
model to CustomersDot User
as the current naming is a bit confusing due to Salesforce having a different definition for what a Salesforce Customer is.
zuora_account_id
company_name
vat_code
salesforce_account_id
Additionally, we can add a join table (e.g. billing_account_memberships
table) between the CustomersDot BillingAccount
and CustomersDot User
models which will allow a CustomersDot BillingAccount
to have multiple CustomersDot User
s. Likewise, a CustomersDot User
could be associated to many CustomersDot BillingAccount
s.
With this data structure, CDot should consider the data structure of CustomersDot BillingAccount
and CustomersDot User
as a way of determining which users of CDot should have access to view / manage subscriptions for a Zuora Account
. CDot could rely on Zuora for providing the source of truth for who the contacts are for the Zuora Account
and likely their metadata (e.g. name, address).
Currently, CDot creates a CustomersDot User
record for the SoldTo contact associated with the Subscription Account. In this epic, we could also create a CustomersDot User
record for the BillTo contact as well for the same Subscription Account, but this isn't a requirement. This will effectively allow both types of contacts to login to CDot and manage the Account's subscriptions.
We considered only allowing a CustomersDot User
to be associated with a single CustomersDot BillingAccount
, however, we determined that we should build a many-to-many mapping capability because:
Enabling this will bring parity between CustomersDot and Zuora.
Zuora serves as the source of truth for Zuora Account
and Zuora Contact
data once a Subscription is purchased. Prior to a purchase, a user can register for CDot which creates a CustomersDot User
record that isn't associated with an CustomersDot BillingAccount
(because it doesn't exist yet). Once purchased, the CustomersDot BillingAccount
record is created along with the related CustomersDot BillingAccountMembership
.
Given that CustomersDot User
/Zuora Contact
and CustomersDot BillingAccount
/Zuora Account
information can be edited by users directly in CDot or directly in Zuora (or indirectly via SFDC), we need to be mindful of syncing this data between CDot and Zuora. In particular, if we can't use Zuora callouts to keep the CustomersDot BillingAccount
and CustomersDot User
records in sync, we will explore Zuora Custom Events.
A CustomersDot User
record in CDot is tied to one email address. This email address can be associated with multiple Zuora Account
s, and therefore have multiple Zuora Contact
s. Each of these Zuora Contact
s could be modified independently. For instance, a billing admin may choose to change the address for Contact A for the billing entity in the US, but not choose to change the address for Contact B (associated with the same email address) for the billing entity in Europe. For this reason, contact metadata could eventually be stored on the CustomersDot BillingAccountMembership
model, but we are choosing to keep this lightweight to begin with to reduce scope. We will start by fetching this data from Zuora.
With GitLab.com SSO as the only sign in option for Customers Portal, we can eliminate the legacy sign up (email and password) and prepare CDot for future integration with a third party e-commerce provider. Our goal is to streamline the experience between SaaS/self-managed and web direct/sales-assisted customers in how they access their subscription information.
Overall, this will lead to a more secure environment for our customers in CDot and allows us to establish a 1:1 relationship between a CDot customer and a GitLab.com account.
GitLab.com SSO as the only sign up option for CustomersDot
Align CustomersDot Orders to Zuora subscriptions and trials
This iteration focuses on breaking apart the CustomersDot Order
table to more accurately reflect its representation of Zuora Subscriptions + Trials
. In the future, we could explore moving the reference for GitLab Namespace from being stored on the Subscription (and Order) to a Zuora Account
. See this LucidChart for more details.
We extract data from the Quote to Cash systems towards Snowflake and use dbt to transform the data into data models for reporting and analysis.
The Fulfillment Team is re-architecting our Quote 2 Cash Systems, in particular CustomersDot, in a way that promotes more reliability, sustainability, and flexibility. The plan is described in this data_architecture.md file. A significant result of the new architecture will be to have the same customer definition in CustomerDot, Zuora, and Salesforce. This definition is based on the Billing Account in Zuora and the key for the customer is the billing_account_id. It is necessary to re-architect the data model in Snowflake and dbt in order to align the customer definition to CustomersDot data tables. The data models built that model the Zuora and Salesforce systems have the correct customer definition and no rearchitecting needs to happen for those models at this time.
Important Callouts for the Customer Definition in the Unified Q2C data model:
Zuora.Account.Account_Id
CustomersDot.Billing_Accounts.Billing_Account_Id
Salesforce.Billing_Account.Billing_Account_Id
DRAFT: GitLab_Dotcom.Organization.Billing_Account_Id
The Organization Entity Object has not been created yet in GitLab_Dotcom and is still in the validation process. The Billing Account Id Foreign key needs to be determined.Below is the Entity Relationship Diagram for the Re-architected data model in Snowflake. The Target State tab shows how the business entities we extract from the CustomersDot, Zuora, Salesforce, and GitLab.com source systems connect with each other.
These ERDs illustrate how we model data from the Quote to Cash Systems in the Snowflake Enterprise Dimensional Model.
Quote to Cash Data Lineage Diagrams illustrate how the data from critical Quote to Cash source tables flow through the Snowflake data models.
Quote to Cash Data Dictionaries provide definitions for the Quote to Cash fields used in the Snowflake Enterprise Dimensional Data Model.
Our Data Catalog provides access to Analytics Hubs, Data Guides, ERDs, and Analytics projects relating to the Quote to Cash business processes.