Public Issue Tracker; please use confidential issues for topics that should only be visible to team members at GitLab.
Chat channel; please use the #finance chat channel in Slack for questions that don't seem appropriate for the issue tracker or internal email correspondence.
Accounts Payable; inquiries which relate to vendor, merchant, and contractor invoices should be sent to our Accounts Payable mailbox - firstname.lastname@example.org. Of course, electronic copies of all invoices should be sent to this address upon receipt.
Accounts Receivable; customer billing inquiries should be sent to our Accounts Receivable mailbox – email@example.com.
We track a wide range of metrics on our corporate dashboard. Many definitions are self evident but some arent.
Annual Recurring Revenue (ARR) - Recurring revenue recognized in current month multiplied by 12. (Source data from Zuora)
Bookings Total Contract Value (TCV) - All bookings in period (including multiyear); bookings is equal to billings with standard payment terms. (Source data from Salesforce reconciled to Zuora)
Bookings Annual Contract Value (ACV) - Current Period subscription bookings which will result in revenue over next 12 months. (Source data from Salesforce reconciled to Zuora)
Bookings Incremental Annual Contract Value (IACV) - Value of new bookings from new and existing customers that will result in revenue of next 12 months. Also equals ACV less renewals. (Source data from Salesforce reconciled to Zuora)
Churn, Net - Current period revenue from customers present 12 months prior divided by revenue from 12 months prior. (Source data from excel; Zuora expected 2017-07-01)
Churn, Gross (Dollar weighted) - Remaining cohorts from Actual Subscription customers active as of 12 months ago multiplied by revenue from 12 months ago divided by actual Subscription customers as of date 12 months prior multiplied by revenue from 12 months ago. (Source data from excel; Zuora expected 2017-07-01)
Customer Acquisition Cost (CAC) - Total Sales & Marketing Expense/Number of New Customers Acquired (Source Zuora and Salesforce)
Rep Productivity - Current Month [Metric] /# of Reps on board for at least 90 days prior to start of period. (Source data bamboo HR)
Magic Number - IACV for trailing three months/Sales & Marketing Spend over trailing six months. (Source data Salesforce/Zuora and Netsuite)
MQL - Marketing Qualified Lead (Source data Salesforce)
SQL - Sales Qualified Lead (Source data Salesforce)
Cost per MQL - Marketing expense divided by # MQLs (Source data Salesforce and Netsuite)
Login information for the following accounts can be found in the Secretarial vault on 1Password:
IND (Immigratie en Naturalisatie Dienst, in the Netherlands) company number
If you need this information but cannot find it in your shared vaults, check with PeopleOps to get access.
Finance Technology Stack
The finance and accounting tech stack includes the following applications:
NetSuite; The company Enterprise Resource Planning (ERP) system. The application is cloud based and allows enhanced dimensional reporting as well as multi-currency/multi-entity reporting. This is where the General Ledger resides and all financial activity is ultimately recorded, which is critical to reporting the financial health of the company.
Zuora; Customer billing is processed using Zuora, a cloud based subscription management platform. All invoicing, both recurring and non-recurring, is managed in Zuora.
Stripe; Stripe is a software application that enables GitLab customers to make online payments. Finance uses this system to collect information pertaining to payments made online.
Expensify; The company travel and expense management application. The platform provides employees a simple tool to create expense reports, which can then be managed from approval workflow through the final stage of reimbursement. Expensify is integrated with NetSuite, which further automates the processing of employee expenses by the Finance team.
eShares; Stock option administration, capitalization table and equity management are all managed using the eShares software platform.
GitLab Inc. Payroll Procedures
You will receive a reminder from TriNet the week before payroll closes for each pay period.
If you are handling payroll changes- the email will let you know by what date you must submit those changes.
Enter the dates into your calendar with a reminder for the day before the deadline.
Log into TriNet Passport
My Company=>My Workplace=>Payroll Entry & Admin
You are now on the payroll dashboard
Select the current pay period from the calendar screen in the middle of the page.
Each employee will have a row with the information necessary to document hours (if hourly) and other earnings (this can be commission, reimbursement, etc. There is a drop down menu of options and codes from which to choose).
After you have updated each employee, select the save button.
Do not use the Submit button. It will make adding last minute changes difficult and TriNet will take your last save when processing payroll.
Make sure that you calculate the hours based on the pay days (count them) for each pay period.
Additional Begin/End Payment (for adding payment to payroll)
In HR Passport click Find
Select find by Name
Click on Add’l Begin/End Payment
Select Action Type
Select Begin & End date (End date is optional. Note: The Begin date needs to be the start of a pay period, it cannot be in the middle or end of a pay period)
All GitLab BV employees receive their payslips within their personal portal of Savvy. They can login and download their payslip to their computer if needed.
UK, Belgium, & India Monthly Payroll Process
Payroll cut off for sending changes is usually the middle of the month (15th-17th). The payroll provider will send a report for approval to the People Operations email address and copy in the Financial Controller. The Financial Controller will approve the payroll by sending a confirmation email back to the payroll provider. Once processed the payslips are sent electronically directly to the team members for them to access via a password protected system.
Invoice template and where to send
NOTE: Vendor and contractor invoices are to be sent to firstname.lastname@example.org. An invoice template can be found in Google Docs by the name of "Invoice Template".
A note on VAT for transactions between GitLab BV and EU-based vendors
In many cases, VAT will not be payable on transactions between GitLab BV and EU-based vendors/contractors, thanks to "Shifted VAT". To make use of this shifted VAT:
The vendor/contractor writes the phrase "VAT shifted to recipient according to article 44 and 196 of the European VAT Directive" on the invoice along with the VAT-number of GitLab BV (NL853740343B01).
On the vendor's VAT return the revenue from GitLab BV goes to the rubric "Revenue within the EU". It goes without saying that vendors are responsible for their own correct and timely filings.
GitLab BV files the VAT on the VAT return, and is generally able to deduct this VAT all as part of the same return.
Processing payment for invoices
Upon receipt of vendor invoices:
File a .pdf copy of the invoice to dropbox\For Approval.
Notify manager of new invoices to be approved by forwarding the email from the vendor.
Invoices are to be approved based on signed agreements, contract terms, and or purchase orders.
After review, manager to reply to email with “Approved”. An audit trail is required and this email will serve this purpose.
On approval, move the invoice from dropbox\For Approval to dropbox\Inbox
Post the invoice through accounting system. Before paying any vendor (for Inc. only), be sure there is a W-9 on file for them.
On a daily basis, generate an AP aging summary from the accounting system and identify invoices to be paid.
Initiate payment(s) through the bank (Comerica/Rabobank) and notify management that there is a pending payment. Include a summary of invoices being paid.
Verify the payment has cleared the bank.
Upon verified payment of the invoice move the .pdf copy of the invoice from dropbox\Inbox to folder inbox\”vendor name”.
Post the payment through the accounting system.
Invoices will arrive by email to email@example.com.
Forward email to Sytse, or the appropriate GitLab team member, for approval.
Create a PDF copy of the email containing the approval response.
File the invoice and approval in the "Invoices" folder in Google Drive.
Enter invoice in NetSuite. Step by step instructions for this process are below.
Entering a Bill (invoice) in NetSuite
On the home page, click the “+” icon near the global search bar at the top of the screen and select “Bill."
Select the appropriate vendor record. If adding a new vendor, follow the bullets below before proceeding, otherwise skip to step 3.
Enter the company name, email address, applicable subsidiary, physical address, payment terms, primary currency, and Tax ID. (Note that the address field is located under the "Address" tab, while the Tax ID, primary currency, and payment terms fields are located under the "Financial" tab)
Enter the banking information in the "Comments" field then click “Save.”
Go to the "+" icon at the top of the vendor record and select "Bill" from the dropdown box.
Enter Bill date. The due date should auto-fill based on payment terms entered during vendor setup. If not, select the correct due date and update the vendor record after the bill has been entered and saved.
Enter Bill number.
Go to the "Expense and Items" tab below to enter the expense details.
Select appropriate GL-account under the "Account" dropdown box. (Be sure to check whether the invoice represents a prepaid expense, fixed asset, etc.)
Enter Bill amount.
Select tax code, if applicable.
Enter department. (This must be entered if the account you selected in step 6 is an expense account)
Add attachments: Go to the "Communication" tab and find the "Files" subtab.
Click "New File.” A new window will appear, allowing you to select the file you wish to attach.
In the new window, select the "Attachments Received" folder in the dropdown box, then click "Choose File" to attach both a copy of the vendor bill and email approval. (The supporting email approval must be attached along with a copy of the invoice)
In Google Drive, file invoice in the “Unpaid” folder.
Commission Payment Process
Each sales person will receive their own calculation template.
Salesperson is to complete their monthly template four days (payroll will send reminder) prior to first payroll of the month. Upon completion, salesperson will ping a manager for review and approval.
Approving manager will ping accounting upon approval.
Accounting will review and reconcile paid vs unpaid invoices.
Accounting will note in calculation template the amounts to be paid in commission.
Accounting will ping payroll that commission calculation is complete.
Payroll will enter commission into TriNet.
Company Credit Cards
All team members that regularly make company purchases may request a company credit card.
You are personally responsible to make sure that the charges on the card are for GitLab business only.
Please file your expense report on time (i.e. once a month).
Those who need a company credit card will be provided with additional directions for card management and reporting.
If you request a company credit card for yourself or a direct report, please make sure that you are added to Expensify for monthly reporting by sending an email to firstname.lastname@example.org
In Recurly, export the "Invoices All" Report. For time period, set the end date to the day prior to the current date. Download the .CSV File.
Open the "Revenue-Inc" Excel file found in Dropbox\GitLab Inc\Revenue. This workbook contains all the orders already invoiced in NetSuite to date. In the workbook go to worksheet named “Amortization”
Go back to the "Invoices All" report you just downloaded from Recurly. This is a month to date report so it will contain orders which have already been invoiced in Netsuite. Column "L" indicates the date the Recurly invoice was created. We want to select the orders which have not been invoiced in Netsuite, which would be any orders after the last Netsuite invoice batch. Copy the rows for the uninvoiced orders and "insert copied cells" to the next row after the last transaction of the "Revenue -Inc" report.
Open NetSuite. Click on the "+" sign at the top middle of the screen. Under "Customers" click on "Invoice"
In the "Revenue-Inc" workbook, locate the first invoice # to be invoiced (Column D).
Open the invoice in Recurly.
Refer to the Recurly invoice you opened in step 6.
Choose the customer. If new, add new customer.
Choose the Terms – Credit Card = Due on Receipt.
Choose the Invoice Date - Use the same invoice date as the Recurly invoice.
The Due date will auto-fill depending on the terms you selected.
Input the invoice number to match the Recurly invoice number.
Choose the Product/Service from the dropdown menu. If you need to add a product, click add new. If adding a new license product be sure the Income Account you select is "Deferred License Revenue".
Enter the description if necessary. This field auto populates, however it may not match the description of the Recurly invoice and this is what we want. Cut and paste the description from the Recurly invoice if necessary.
Additionally, add the subscription period after the description. The period is found under the Date field on the Recurly invoice.
Enter the QTY from the Recurly invoice.
Enter the RATE from the Recurly invoice.
The Amount will auto-populate but ensure that it matches with Recurly.
CLASS field can be left blank.
If applicable, enter the PO number to field “Message displayed on invoice”.
If this is a credit card order, the Amount Due on the Recurly invoice will show $0.00. The Netsuite invoice will show a Balance Due. This is correct as it will not show as paid until a payment is posted in the cash receipts process.
Save and close the invoice. You may get a warning about a missing Class field. Click yes to proceed.
Proceed to invoice the remainder of new orders. Do not invoice transactions marked “Failed”
In NetSuite, export an invoice report for the batch you just invoiced.
Under the transactions tab on the left, select Sales
Click on Filter
Type = Invoices
Status = All statuses
Delivery Methond = Any
Date = Custom
From To = The date range for the invoice batch.
Customer = All
Export the report to excel.
Sum up column "G" and compare to the sum of column "Q" of the Recurly "invoices all" report. If the totals match, the invoicing cycle is complete. If the totals do not match, reconcile between the two reports and find the variance. You may have missed an invoice or made a data entry error.
At this point the invoicing process is complete. Now, continue on to the Cash Receipt posting process for those invoices that were paid by credit card.
Credit card customer
Follow this procedure if the customer paid by credit card. You may recall from the invoicing process that there was still a balance due when saving the invoice. The following steps will record the payment and remove the balance due.
Login to Stripe dashboard and click on Payments under Transactions (left hand side). You will see a listing of the latest Stripe transactions listed by amount, Recurly transaction, name, date, and time. There is also an option to filter the report by clicking on XXX at the top left. Click on XXX to export to excel. This will give you a workbook area and also a breakdown of the fees which we will work on later.
In NetSuite, click on the "Transactions" tab on the left.
Click on the orange "OPEN INVOICES " tab. This will bring up all open invoices listed by date, invoice #, customer, etc.
Match invoice #s between the Stripe dashboard and NetSuite. If you click on a transaction in the Stripe dashboard, it will take you to a screen that shows more detail, including the invoice # being paid. You can work your way from the bottom up.
In NetSuite, click "Receive Payment" on the matched payment and invoice.
Receiving the payment
Enter the payment date, which is the payment date from Stripe dashboard.
Payment method = Credit Card.
Reference no. = "Recurly Transaction ID:" found under Metadata in Stripe dashboard.
Deposit to = Stripe.
NetSuite will auto-fill the payment amount with the entire balance due. No need to change this unless the payment amount from Stripe is different.
Click on "Save and Close".
Repeat the above for all the remaining invoices that were paid by credit card.
Post a journal entry to record Stripe Fees.
In NetSuite, click on the "+" sign. Under "Other", select "Journal Entry".
It is okay to leave the journal date as long as it is within the month the fees were incurred. If not, change it to the last day of the month.
NetSuite will auto fill the journal number. Do not change.
Account #1 Entry
Fill the "Account #1" entry with "Credit Card Transaction fees".
Fill the "Debits" entry with the value from the Stripe report that was exported. The value will be the sum of "Column I" in the Stripe report, which is the fee amount. Be sure to only sum the rows which you just posted payments for.
Leave the "Credits" entry empty.
Fill the "Description" entry with "To record credit card transaction fees for period (enter the date range for the transactions posted)".
Leave the "Name" entry empty.
Fill the "Class" entry with "Sales".
Account #2 Entry
Fill the "Account #2" entry with "Stripe".
Leave the "Debits" entry empty.
The "Credits" entry will autofill. This should be the same amount as the "Debits" entry for Account #1.
The "Description" entry will autofill. This should be the same as the "Description" entry for Account #1.
Leave the "Name" entry blank.
Leave the "Class" entry blank.
This transaction transfers the payment obligation from the customer to Stripe. The payment obligation from Stripe is removed when Stripe transfers the funds to GitLab's bank account.
Posting a payment from Stripe when a transfer is received from Stripe.
Post a journal entry:
Fill the "Journal Date" with the date that payment was received in the bank.
Fill the "Credit Account" with Stripe.
Fill the "Debit Account" with "Comerica Checking - GitLab Inc."
Leave "Name" blank.
Leave "Class" blank.
Fill the "Description" with "To record Stripe transfer (date of transfer)".
Posting a payment from a “bank customer”
Click on the “+” sign.
Click on “Receive Payment” under Customers.
Fill the "Payment Date" with the date payment was received.
Fill the "Payment Method" choose from the dropdown menu.
Fill the "Reference No." with the check # or bank reference # from incoming wire.
Fill the "Deposit to" with "Comerica Checking".
Fill the "Amount Received" with the amount received from the incoming wire.
When reducing spend, we'll not take the easy route of (temporarily) reducing discretionary spending. Discretionary spending includes expenses like travel, conferences, gifts, bonuses, merit pay increases and summits. By reducing in these areas we put ourselves at risk of increasing voluntary turnover among the people we need most. Discretionary spending is always subject to questioning, we are frugal and all spending needs to contribute to our goals. But we should not make cuts in reaction to the need to reduce spend; that would create a mediocre company with mediocre team members. Instead, we should do the hard work of identifying positions and costs that are not contributing to our goals. Even if this causes a bit more disruption in the short term, it will help us ensure we stay a great place to work for the people who are here.