All RPGs and Storygames by Tod Foley are now available at DrivethruRPG and RPGnow. Bring these games to your table!
Last year, the Drupal Association committed to not only providing more transparency into our financials, but also more clarity about where our funds come from and what they fund.
We completed our 2016 Audit and official financial reporting at the end of 2017. This post gives insight into 1) the audit 2) the 990s (our official financial report for the year) and 3) a new financial report called the “Weather Report”. 990s provide a one-year snapshot of program financials, but some of our programs have two years of expenses, like DrupalCon, so just looking at the 990s never gives the exact insight into how our events perform. The weather report provides this clarity. It will expand over time to provide clarity for more of our programs as well.We did a financial audit for 2016
Audits are a good thing. In fact, our operations department welcomes them and appreciates the feedback.
To assist our board in their fiduciary obligations, we strive to conduct audits every other year. In the years that we don’t do an audit, we contract with our CPA firm, McDonald Jacobs, to do a financial review.
We conduct an audit for several reasons:
- to demonstrate our commitment to financial transparency.
- to assure our community that we follow appropriate procedures to ensure that the community funds are being handled with care.
- to give our board of directors outside assurance that the financial statements are free of material misstatements.
For our 2016 audit, our auditors focused on three points:
- Proper recording of income and expense: our auditors ensure that our financial statements are an accurate representation of the business we have conducted. Did we record transactions on the right date, to the right account, and the right class? In other words, if we said that 2016 revenue was a certain amount, is that really true?
- Financial controls: preventing fraud is an important part of the audit. It is important to put the kinds of controls in place that can prevent common types of fraud, such as forged checks and payroll changes. Our auditors looked to see that there are two sets of eyes on every transaction, and that documentation is provided to verify expenses and check requests.
- Policies and procedures: there are laws and regulations that require we have certain policies in place at our organization. Our auditors looked at our current policies to ensure they were in place and, in some cases, had been reviewed by the board and staff.
The primary goal of this audit is for our auditor to express an opinion on two aspects of the financial statements of the Association: the financial statements are fairly presented, and they are in accordance with generally accepted accounting principles (GAAP). Generally accepted accounting principles are the accepted body of accounting rules and policies established by the accounting profession. The purpose of these rules is to promote consistency and fairness in financial reporting throughout the business community. These principles provide comparability of financial information.
Our audit for 2016 is complete and has been reviewed and approved by the board. The results of our audit can be found here.
In short, we received a clean bill of health with one recommendation from our Auditors (which is VERY good). It is in how we open and deposit incoming checks:
"Controls over Checks Received
With the elimination of our physical office during 2016, the control of segregating certain duties has been eliminated. The Accountant now processes checks received in the mail. In this situation where the Accountant has access to the physical asset and the accounting records, there is an opportunity to misappropriate a check and void or delete the invoice billing in the accounting system. To mitigate the risk of this occurring without detection, the following recommendations can provide additional control:
- As part of the monthly reconciliation process performed by the outside CPA firm, a review of voided and/or deleted invoices can be done with appropriate follow up and resolution.
- Consider using a lockbox with your bank."
While our security checks are tight, adding the bank lock box process was suggested by our auditors to add an additional layer of security to prevent potential fraudulent activity.
A lockbox is a physical post office box controlled by the bank. Checks are directed to this post office box, or “lockbox”, and checks are opened and scanned by bank employees. Those checks are deposited into our account, and scans of the checks are uploaded and recorded in our banking portal. This can be accessed and seen by all members of our accounting team. Checks are now recorded into our accounting system by a different team member, since checks are now digitized and deposited by the bank - and are no longer physically deposited by only one team member.Tax filing: The IRS Form 990
Once the audit is finished, our CPA can complete the 990 tax return for the year.
All U.S.-based 501c3 exempt organizations are required to file a 990 each year. Additionally, this form is also filed with state tax departments as well. The 990 is used by the IRS and state regulators to ensure that non-profits continue to serve their stated charitable activities. The 990 can be helpful when you are reviewing our programs and finances, but know this is only a “snapshot” of our year.
Here are some general points, when reviewing our 990:FORM 990, PART I—REVENUES, EXPENSES, AND CHANGES IN NET ASSETS OR FUND BALANCES
Lines 8-12 indicates our yearly revenue. Not only how much total revenue (line 12), but also where we have earned our income, broken out into four groups. Line 12 is the most important: total income for the year which ended at $5.1 million.
Lines 13-18 shows expenses for the year which totaled $6.1 million for the year.
Cash Reserves are noted on line 20 of page 1. Our year ended with 186k in net assets. The 990 has a comparison of the net assets from last year (or the beginning of the year) and the end of the current year, as well as illustrates the total assets and liabilities of the Association. We ended 2015 with -$92K, and with our refocus in 2016 we closed the year up, at $185k in net assets.FORM 990, PART II—SIGNATURE BLOCK
Sign off on our 990 by our Treasurer Tiffany Farriss & CPA Representative McDonald Jacobs partner Sang Ahn.FORM 990, PART III—STATEMENT OF PROGRAM SERVICE ACCOMPLISHMENTS
In Part III, we describe the activities performed in the previous year that adhere to our 501c3 designation. You can see here that Drupal.org, DrupalCon and our Fiscal Sponsorship programs are highlighted noting the expenses and income for each program. Keep in mind that this is only a year snapshot, as DrupalCons span a couple of years, ramping up and winding down.FORM 990, PART IV - CHECKLIST OF REQUIRED SCHEDULES
This is a checklist of schedules that must be completed and accompany the 990 filing. Any “yes” answers checked here will produce a schedule to explain the “yes” answer in detail.FORM 990, PART V - STATEMENTS REGARDING OTHER IRS FILINGS AND TAX COMPLIANCE
This is a place for statements about other IRS filings and tax compliance such as receiving tax deductible contributions, and noting that we have provided donors with required substantiation for their donations.FORM 990, PART VI - GOVERNANCE, MANAGEMENT AND DISCLOSURE
This is for us to note detailed information regarding our governing body, management, and policies of our organization.FORM 990, PART VII - LIST OF OFFICERS, DIRECTORS, TRUSTEES AND KEY EMPLOYEES
Part VII lists our board and staff who are responsible in whole or in part for the operations of an organization. These entries do include titles and compensation of key employees.
Section B—Compensation of the Five Highest Paid Independent Contractors for Professional Services
We list any of our contractors, if we have paid them more than $50,000, on this schedule.
This is a snapshot of where our revenue comes from, what is exempt or not exempt as taxable income. For 2016, $573,247 was considered taxable.FORM 990, Part IX Statement of Functional Expenses
This section classifies the total amount earned for the year into three different buckets; fundraising, general, and program expense. These are expenses related to running those three different types of programs.FORM 990, Part X, XI and XII Balance Sheet
This is a comparison of our 2016 balance sheet from beginning of the year to the end of the year, along with notes about the account method we use (accrual) and independent auditor and who is responsible for oversight.
Additional Filing to the 990, Schedule A — Public Charity Status and Public Support
A tax exempt organization must meet certain public support tests in order to maintain its status as a public charity. Schedule A provides an opportunity to see the various sources of revenue have increased or declined over the last four or five years. Please be aware that the definitions of revenue for the purposes of the support schedule are not directly comparable to Part I of the Form 990.
Additional various schedules following the 990, show large contributions (5k +), activities outside of the United States (ie grants given outside of the US), assets depreciation and other various activities.
Now that our 2016 990 has been reviewed by the board and approved, we have filed it. From there we are required to post the return publicly, which we do here on our website.Weather Report — Review of 2016
As part of our work to ensure financial health, our virtual CPA firm Summit compiles a “weather report” monthly so we can compare particular data points and see if we are reaching to our set KPIs.
In closing the year 2016, Summit prepared this report for the year.
Revenue —the Drupal Association creates income in four different ways:
- Advertising, which consists of ad sales on Drupal.org.
- Events - DrupalCon income
- Fundraising consisting of any donations or membership sales
- Other Income, which comprises income from digital sponsors, Supporting Partner sales and time and material projects.
The graph below shows the breakdown of revenue for 2016.
Expenses — The Drupal Association has expenses which are categorized in the following ways:
- Production Expense:These are the costs associated directly with earning revenue (for example: paying employees who work directly with the revenue streams described above, direct event costs, marketing event costs, IT costs, etc.)
- Administrative Costs: These are general costs associated with running the organization (for example: administrative employees, accounting fees, insurance, professional fees, etc)
- Sales and Marketing Costs: These are costs for marketing the Drupal organization (mostly Marketing employees)
- Facility Costs: These are costs associated with the physical office space employees work. (Drupal moved a distributed workforce in the end of 2016, so these costs will be minimal going forward.)
KPI Goals — Moving into 2017, we set the following goals for Drupal.org.
- Cash Reserve – Have 30% of forecasted YTD revenue in the bank. As of the end of 2016 we have $397K (27% of the goal) in the bank.
- Net Income – Have a Year End Net Income greater than 10%. In 2016 we achieved a Net Income margin of -1%.
Event Summary — The graphs below present the 2016 and 2015 DrupalCon events
2016 results show us in the middle of our financial recovery. As we moved into 2017, we took deep looks into our operations and programs to ensure financial health and growth. We will have a 2017 update after we close our financial review and 990 filing for the year.
We are thankful for the great team work that went into new financial reporting process and the resulting data to help us push towards our financial goals. Additionally, and as always, we are truly thankful to our financial contributors who provide the financial fuel for us to do our mission work.
A common set of utilities that are often reused for building Drupal sites.
Toolshed sets conventions for handling:
In the help of simplenews letter advance plugins user can manage our Newsletter subscription on account configure time and user registration page.
Today, the final blocker for Migrate Drupal UI was committed. That leaves only a series of complicated internationalization (i18n) issues to get resolved for Migrate Drupal before all of migrate in all of Drupal core can be considered stable. Lots of effort by lots of people have gone into the UI. Thanks to each one of them.
If you have been on the fence, waiting to upgrade, now is the time to do that. 80 percent of all Drupal 6 and Drupal 7 sites do not use i18n features. If you are in that large camp, just waiting to upgrade, then the upgrade path for you is fully stable NOW.Lucas Hedding Mon, 01/29/2018 - 10:02
Allows the developer to ignore particular keys in the configuration and not whole configuration files.
This module provides a solution to the fact that by default, interface translations are overwritten by config imports if the imported config contains a translation (or misses a translation) of a given string in translate interface.
The following changes to this behaviour are supplied by this module:
Dreditor is a beloved and indispensable tool, in the form of a browser extension, that enhances project issue pages on Drupal.org. When it comes to reviewing patches, it turns what would just be a plain text file into a feature rich interface for reviewing patches, allowing users to easily select and comment on lines of code, which then get pasted into the comment form, as properly formatted HTML.
I've been lucky to have some extra community time here at Chapter Three over the past couple of weeks. While perusing the core issue queue, I decided to resurrect an old User Style I created for Dreditor back in 2009, and give Dreditor a little refresh. You can install the Dreditor Refresh style with Stylish here. Make sure you also have Dreditor installed, and have logged into Drupal.org.
This module provides a way to define dynamic lists of entities using a simple interface. The list definition is stored in a custom field, which can be attached to any fieldable content entity.
The field widget allows editors to enrich their list definitions with filters based upon taxonomy terms and provides a live preview within the edit form on the list result. This result is not static, so every time content matching the list criteria gets entered in the system the output of the list adapts subsequently.
Tim Lehnen, (hestenet), Director of Engineering for the Drupal Association and Neil Drumm (Drumm, Senior Technologist at the Drupal Association join Mike Anello to take a bit of a deep dive into the continuing evolution of Drupal.org tooling - specifically the modernization of the issue queue, patch process, code reviews, and more. Along the way, we try to figure out where (when?) the phrase "feather in your cap" comes from, exactly what Neil does in his free time, and why Mike isn't nearly as cool as he thinks.Interview
- Tim's monthly What new on Drupal.org? blog posts.
- Contribute module
- Developer Tools Initiative - Part 1: An update, and where we stand
- Developer Tools Initiative - Part 2: Comparing our options
- Developer Tools Initiative - Part 3: Illustrating modular integration for Developer Tooling on Drupal.org
- Developer Tools Initiative - Part 4: What's next?
- Mastering Drupal Development Workflows with Pantheon - begins February 27, 2018.
- Drupal Career Online - begins March 26, 2017.
- Drupal Aid - Drupal support and maintenance services. Get unlimited support, monthly maintenance, and unlimited small jobs starting at $99/mo.
- WebEnabled.com - devPanel.
If you'd like to leave us a voicemail, call 321-396-2340. Please keep in mind that we might play your voicemail during one of our future podcasts. Feel free to call in with suggestions, rants, questions, or corrections. If you'd rather just send us an email, please use our contact page.
This module is an extension for Isotope Views module (part of Isotope module) and provides new Isotope Bootstrap Grid' format that allows to have bootstrap-native grid instead of 'item list' grid (ul li) that is provided by default 'Isotope Grid' format.Dependencies
Isotope (Isotope and Isotope Views)
GraphQL is becoming more and more popular every day. Now that we have a beta release of the GraphQL module (mainly sponsored and developed by Amazee Labs) it's easy to turn Drupal into a first-class GraphQL server. In this series, we'll try to provide an overview of its features and see how they translate to Drupal.Blazej Owczarczyk Mon, 01/29/2018 - 10:47
In the last post we talked about the basic building blocks of every GraphQL query - the fields. We've discussed their types and traits as well as described the rules according to which Drupal fields turn into GraphQL fields. This week we were going to expand the topic further and cover field creation, but Daniel Noyola asked an interesting question in the comment below one of the recent articles:
How can I filter the results in a nodeQuery? Like I would in a normal View or with the "where" clause in a SQL Statement. I noticed that it receives a NodeQueryFilterInput but I don't see how to use it.
Fetching entities based on a filter or a set of filters is a common use case, so let's focus on that first.TL;DR
There are two ways to query the entity repository. First one would be through the entityQuery fields which are shipped with the core module but are limited in functionality. They only allow us to filter by base fields and there's no way to use an operator other than equals to. The other approach is much more powerful, as it's based on Views. It requires an additional module - graphql_views - to be installed though. Let's start with the built-in way.The nodeQuery
Each entity type in the system gets its own query field. Let's see in the explorer how it looks like for nodes:
So it's a field (blue) with 3 arguments: offset, limit and filter (purple) which returns a value of type EntityQueryResult (all types are in yellow).
The first two arguments, offset and limit, are for paging and they work the same way as in SQL. Both are integers and both have default values of 0 and 10 respectively (green). Arguments that have default values can be omitted. We'll use this feature in a while.
The last argument - filter - is of a complex type NodeQueryFilterInput. Let's click it:
So it comprises all the base fields of the entity type that is being queried. It's not enough to issue arbitrary queries but it will suffice for a simple use case. This is how we could fetch a list of articles created by a given user:
We haven't specified the offset nor the limit, so they'll get their default values. It means that the output will contain at most 10 results, starting from the result number 0.
That's cool, but what if we wanted to order the articles by node id (nid) to only show the latest articles? Or filter by tags? Or fetch the title text of an image that is attached to a media entity that is connected with the first event that starts after the article's release date?Use The Views
The answer is: we can do it like we'd normally do it in Drupal - with a view. Views integration has been moved to a separate project, so it has to be downloaded with composer (composer require drupal/graphql_views), from drupal.org or from github.
With graphql_views enabled we can add a GraphQL display to any view in the system.
Now we can sort the results, filter based on content fields and add relationships. We also have the option to return either the full entities, just a selection of fields, or even search results taken straight from a search server.
Contextual filters set in the view will automatically turn into the arguments of the GraphQL field. Let's see an example:
This field represents a simple view showing nodes. It has one contextual filter - Content: Authored by - so the corresponding input type consists of just one field:
and its row type is set to Entity (as pictured on the screenshot above), so the result will be of type NodeArticle:
We can use the filed like this:
Views integration is a pretty broad topic, so in the next post we might try to cover it in more detail. There are quite a few more interesting aspects like sorting, exposed filters, and attaching views to entities, so we'll focus on that in an attempt to fully answer Daniel's question. For those interested in the back-end side of things I'd recommend the great Extending GraphQL series by Philipp Melab. The first post that explains how to create fields is here: Extending GraphQL: Part 1 - Fields.
P.S. GraphQL Views is not stable yet. In fact, two issues were spotted and fixed in the process of writing this article. If you spot a bug please report it on github or let us know in the #graphql channel at Drupal slack.Other posts in the series
Integrating UberCart with Klaviyo. Here's the data we sync from UberCart after checkout completion.
- Customer information: First name, Last name, Email
- Viewed products
- Add to Cart
- Started Checkout
- Purchased Products
Amitai and Adam discuss a 1.6 million dollar stamp sale, skill set mastery and technological decision making, and the value of slowing down. Along the way Amitai explains his indifference to Drupal 8 and why Gizra’s Drupal-Elm Starter Kit uses Drupal 7 and Restful 1.x.
A boxout is a design element used mainly in magazines to enclose related information to the main article while retaining some type of connection. You can use it to add extra links related to your content or a small bio.
The "Boxout" contrib module helps you add this design element to your content directly in CKEditor. In this tutorial, you will learn how to do just that. Let’s start!