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 are not.
Annual Recurring Revenue (ARR) - Recurring revenue recognized in current month multiplied by 12. (Source data from Zuora)
Average Sales Price (ASP) - IACV per won
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)
Sales efficiency ratio - IACV / sales (and marketing) spend
Marketing efficiency ratio - IACV / marketing spend
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.
The procedure by which reimbursable expenses are processed varies and is dependent on contributor legal status (e.g. independent contractor, employee, etc.) and subsidiary assignment (Inc, LTD, BV). Check with PeopleOps if you are unsure about either of these. For information regarding the company expense policy, check out the section of our team handbook on Spending Company Money. The accounting team will review the expenses for compliance with the company travel policy. Exceptions will be escalated to the manager for review and approval. The CEO will review selected escalations at least annually.
Independent Contractors– Contributors who are legally classified as independent contractors should include reimbursable expenses on the invoices they submit to the company through our Accounts Payable mailbox (firstname.lastname@example.org). These team members should also consider the terms and conditions of their respective contractor agreements, when submitting invoices to the company.
Employees– Contributors who are on GitLab’s payroll are legally classified as employees. These team members will submit expenses in the Expensify application. Expense reports are to be submitted once a month, at the least. If you were not assigned a user license as part of the onboarding process, you can request one by contacting PeopleOps. Additional information on getting started with Expensify and creating/submitting expense reports can be found here and here.
Purchases of goods and services on behalf of the company can be facilitated by sending requests to our Accounts Payable mailbox (email@example.com). Note that this does not include travel expenses and other incidentals. These expenses should be self-funded then submitted for reimbursement within Expensify, or for independent contractors, included in invoices to the company (per the guidelines above). Once a request is made, Finance will reach out to coordinate payment setup. Most importantly, the team member making the purchase request is ultimately responsible for reviewing and approving the expenses, on a regular basis. All original invoices and payment receipts must be sent to AP (firstname.lastname@example.org).
Company Credit Cards
Team members carrying company cards in their name should submit the expenses within Expensify, on a monthly basis. These expense reports should tie to your monthly account statement which can be accessed in the American Express online portal. The statement cutoff is the 29th of each month. Of course, it is important to remember to attach all of the necessary receipts. If you have any questions on this policy, don't hesitate to reach out to the Finance team.
Although we have worked to reduce the number of outstanding company credit cards in an effort to centralize corporate purchasing, there are still certain situations where it may be more practical to issue additional corporate cards. Please contact the Finance team if you would like further information on this.
If possible, team members carrying company cards should link their cards to Expensify. To do so, follow the below steps:
Log into Expensify and click on your picture in the top right corner. Choose "Account Settings".
On the left panel, choose the option for "Credit Cards".
Choose "Import Card/Bank".
Choose "American Express US (Business)".
Provide your log-in credentials that you created when you registered with American Express.
Enter in your card details. It will take a few minutes for the card to import, so do not click away from this page.
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.
Renting Cars in the United States and Canada
Third Party Liability
Purchase the liability insurance that is excess of the standard inclusion of State minimum coverage in the rental agreement at the rental agency. GitLab’s insurance policy provides liability insurance for rental cars while conducting company business, but it may be excess over any underlying liability coverage through the driver or credit card company used to purchase the rental.
Purchase the liability offered at the rental counter if there are foreign employees renting autos in the USA or Canada. While workers' compensation would protect an injured US employee, other passengers may have the right to sue. To ensure that Gitlab has protection when a foreign employee invites another person into the car we recommend the purchase of this insurance when offered at the rental counter.
Physical Damage – Collision Damage Waiver
Do not purchase the Collision Damage Waiver offered at the rental counter. GitLab purchases coverage for damage to rented vehicles. If travel to Mexico is required, purchase the liability insurance for Mexico offered at the rental counter. You should verify that the rental agreement clearly states that the vehicle may be driven into Mexico and liability coverage will apply.
Renting Cars- Countries other than the U.S.A. and Canada
Third Party Liability
Purchase the liability insurance offered at the rental counter when traveling outside the USA and Canada. Automobile Bodily Injury and Property Damage Liability insurance are required by law in almost every country. Please verify this coverage is included with the rental agreement.
Physical Damage – Collision Damage Waiver
Purchase the Collision Damage Waiver or Physical Damage Coverage offered by the rental agency when traveling outside the USA and Canada.
In the event of an accident resulting in damage to the rental car, the foreign rental agency will charge the credit card used to make the reservation with an estimated amount of repair costs if insurance is not purchased. If this happens, GitLab does not purchase Foreign Corporate Hired Auto Physical Damage Coverage to reimburse for damages.
Personal Use by Employee or Family Members of Business Auto Rentals
Coverage is not provided for personal use of automobiles or when family members are driving. Please evaluate whether your own personal automobile insurance provides an extension for this coverage. If it does not, or you are renting a vehicle outside the U.S.A. or Canada or taking a USA rented vehicle into Mexico, we recommend that you purchase the liability and physical damage coverage offered by the rental agency to protect your personal liability when not engaged in company business. GitLab will not pay for liability or damage to the rental vehicle resulting from personal use or use by non-employees.
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.
Salesforce- Salesforce is the company CRM platform. This application primarily functions under Sales and Marketing, but inevitably, contains information that is also used by the Finance team.
Month-End Close Checklist
This link will take you the check list used by Finance to track the month-end close process. This is updated regularly to reflect our progress in closing the books for any given month.
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.
All hourly time sheets are kept on the Google Drive and shared with Finance. Each employee will populate the time sheet before the end of the pay cycle.
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)
People Ops and Finance will share a private Google Sheet with you where you will log your hours for each day in the “hours” column.
There is a dropdown in the “pay type” column, with the default being Regular. There are also options for Overtime, Vacation, Sick, and Bereavement. Choose the appropriate pay type for your time.
If you work overtime or more hours than agreed upon in your contract, please obtain approval from your manager and forward to Finance before payroll cutoff.
Your timesheet is due one day prior to the submit payroll date, which is outlined for the calendar year on your timesheet.
GitLab BV Pay Slip Distribution Process
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), in addition, expenses for the UK should also be submitted at this time as they are paid via the payroll.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 email@example.com. 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 firstname.lastname@example.org.
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 the 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.
Processing Expensify Reports (Finance Team)
In Expensify, go to the “Reports” tab.
Filter the listed reports and narrow the results to reports that are marked as “Reimbursed.”
Click the checkbox next to each report that you wish to export to NetSuite.
Once the reports have been selected, go to the “Export to” dropdown menu near the top of the page and click “NetSuite.”
A box will appear showing the real-time status of the export. The process is complete once this box confirms a successful export. If you receive an error message, see the information below and follow the remaining steps.
Unsuccessful exports typically result from an error related to NetSuite records. Each Expensify user must have a corresponding NetSuite Employee record and Vendor record.
Check NetSuite to verify if the employee in question has both a Vendor and Employee record.
If the records exist, add the employee’s email address to both records. In order for the export to work, this must be the same email address that is assigned to the employee within Expensify.
If the records do not exist, create both an Employee and Vendor record in NetSuite, complete with email addresses. Expensify uses the employee email address when mapping its records to that of NetSuite. The export will not work without proper alignment of email addresses in the NetSuite and Expensify records.
Log in to Zuora and Salesforce.
In Salesforce, click the "+" icon and select "Z-Quotes".
Subscriptions to be invoiced are sorted by date. Choose a subscription from today's date and proceed.
Still in Salesforce, check the customer account for a current PO number under the notes and attachments.
Then in Zuora, search for the corresponding customer subscription and open the record.
Check to see if the PO from the file in Salesforce matches that of Zuora. If not, update the record in Zuora with the latest PO number.
Verify that the "Bill to" and "Sold to" contacts listed in the Zuora customer record match the related record in Salesforce. If not, update Zuora.
Verify that the payment terms and method listed in Zuora match the related record in Salesforce. If not, update Zuora.
In Zuora, scroll down to transactions and click "Create Bill Run."
It is important to find the subscription start date in Salesforce and enter it in the "Target Date for this bill run" field in Zuora. The invoice date should be today's date.
Once these dates agree, click "Create Bill Run."
On the following screen, select the bill run that was just created (the bill run files begin with BR- followed by a set of numbers).
Scroll down and click on the invoice that was just generated. The PDF file will be at the bottom of the page.
Open the PDF file and review every field of the invoice for accuracy.
Once the review is complete, close the invoice and click “Post Invoice.”
Proceed to bill the remaining subscriptions.
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.
Posting Swag Shop transactions in NetSuite
Transactions from the Swag Shop are remitted to the Comerica money market account daily and should be booked in NetSuite at the end of each month, per the guidelines below.
In Shopify, download the transaction report in CSV format (found under Orders, then Export).
This report contains swag shop revenue and tax data to be recorded in NetSuite.
In Printfection, download the orders report (found under Reports, then Run a Report).
This report will be used to allocate transaction cost data between promotional, shipping, and merchandise.
In the Shopify transaction report, the amounts in column L reflect the total funds received from each order.
The total tax collected per transaction can be found in column K, with the supporting details found in columns BE-BH.
Create a journal entry in NetSuite under the GitLab Inc subsidiary, using the last day of the month as the entry date.
This journal entry has two parts- One to record the revenues and taxes, which are reported in Shopify, and the second part which includes shipping and merchandise cost information reported in Printfection.
Using the transaction report from Shopify, create line items for the revenue and various tax liabilities.
Carefully review your entries for tax liabilities to ensure they are accurately recorded under the appropriate GL accounts. * Using the orders report from Printfection, create line items for the costs of shipping and merchandise.
Click Save then proceed to final review of the entry.
The journal entry can be tested for accuracy by comparing the balances of the journal entry lines to the balances in the two reports.
Importing Swag Shop data to Avalara
Click on "Orders" in the left-hand toolbar.
Select "Export" and the desired transaction history period.
Download the report in CSV format.
Copy the required transaction data to the Avalara-Shopify template located in the Google Drive.
Save file for the remaining steps below.
Click on "Reports".
Select the "Import Data" option.
When prompted, choose the CSV import option.
Check the import status report to ensure all transactions are successfully imported.
Items paid for by the company are property of the company.
Assets with purchasing value in excess of $1000 USD are tracked in BambooHR, for assets of lower value we rely on the honor system. These assets come to People Ops attention by one of two ways: 1. People Ops makes the purchase on behalf of the team member, or 2. the Finance team notices the line items on expense reports / invoices and passes this along to People Ops.
The information is then entered into BambooHR (to track who has which piece of equipment) by People Ops, and it is included in the Fixed Asset Schedule by Finance (to track asset value and depreciation).
Go to the team member in BambooHR.
Click on the Assets Tab.
Click Update Assets.
Enter Asset Category, Asset Description, Serial Number, Asset Cost, and Date Loaned.
This process is repeated for each asset purchased.
If a team member would like to purchase an asset from the company (i.e. a laptop), please email People Operations to obtain the amount to be paid. This is derived from original cost less accumulated depreciation.