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)
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.
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.
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.
Company Credit Cards
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 should be sent to Finance.
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. Of course, it is important to remember to attach all of the necessary receipts. If you have any questions on this policy, please don't hesitate to reach out to the Finance team.
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.
Employees 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.
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)
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). 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 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.
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.
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