In our society, those who have the best knowledge of what is happening are also those who are furthest from seeing the world as it is. In general, the greater the understanding, the greater the delusion; the more intelligent, the less sane.
It’s such a basic question, I’d hesitate to posit it – if it weren’t so fundamental to the work of making the world, and the Web, a better place.
If your first thought was something along the lines of “To support our work, of course”, note that the question is not “Why should people visit” but “Why do they”.
Nonprofit organizations often approach communications and outreach assuming that everyone should just get it. Because you spend so much time organizing around complex issues, you may assume a shared vocabulary with the broader world when that vocabulary really only resonates within your organization.
This is further complicated because nonprofit departments often have competing priorities: Development wants donors, Program wants event participants, Communications wants names for the email marketing list.
I can pretty much guarantee that very few people arrive at your website thinking, “You know what would be great? Giving you my email address.”
The truth is, the motivations of your visitors are often very different from your organizational goals. This is further complicated because, to paraphrase Jeanne Bliss from Chief Customer Officer, “The nonprofit often does not live in rapport with its constituents because they don’t experience the nonprofit through its departments. The constituent experiences a nonprofit horizontally, across its departmental silos.”
To improve the efficacy of your website by making your users happy, you must resolve the dichotomy between “Desire Paths” and “the desired path.”
“Desire path” is a term of art in the urban planning world describing the shortest path between an origin and a destination, particularly those that weren’t planned. You’ve seen them: a dirt trail between two sidewalks, a cut corner, a hole in the fence. Desire paths exist in defiance of all the thought that goes into a made environment, the creation of what planners consider the right way to move through a space. An architect might think, “The staircase will give this hill some gravitas.” The college students may think, “Ehn, I’d rather just walk up the hill,” the resulting path eroding that gravitas.
You can see the parallels to your website, I’m sure. We spend hours thinking about the information architecture most likely to move visitors into a funnel that will lead them to donate or volunteer – only for them to pop up on that blog post mentioning Channing Tatum, liking it, and closing the tab.
If Channing Tatum resonates with a core audience segment, you need to find a way to tap into that. The magic of the Internet, the work of the user experience engineer, is to find the intersection of the desire path – the motivation driving someone to visit your site – with the desired path, or any of the potential actions you hope a visitor will take to support your organizational goals.
To begin, understanding how they arrive at your website will give you clues about what motivated them to check you out.Search
As much as we may complain about web search being the ultimate conversation killer, these people are coming to your site driven by the desire to know something. Is your website prepared not only to answer the question, but to redirect that motivation into greater engagement?
In a recent audit of some of ThinkShout’s great clients – with monthly traffic ranging from a couple of thousand visits on up to hundreds of thousands – we found:
Homepage traffic accounted for less than 20% of the total for 7 of 9 organizations; for 2 of the 9, it’s less than 10%.
The percentage of traffic driven by search was more than 40% for 7 of 9; for 5 of them, it’s significantly more than half.
The bounce rate for search traffic for 6 of the 9 was significantly worse than for the site as a whole.
I do need to toot a little horn for the team here at ThinkShout, because for the 4 sites we can compare year over year, we’ve seen improvements of between 6% and 20% in the bounce rate for search traffic post-redesign. That’s because, as part of our discovery process, we put user motivations first – and you can, too.
Tip: Know Your “Search Terms”
Search traffic is probably the easiest to get real, actionable data for, even if all you have is Google Analytics.
This is advice that has been repeated almost endlessly, but Google made it more complicated a few years ago by filtering out search results for anybody logged in to one of their products. (You know, almost everybody.) Fortunately, there’s an easy way to approximate that data.
Go to the organic search terms report at “Acquisition” -> “Keywords” -> “Organic.” You’ll see most of the terms are “not provided."
Set the “Secondary Dimension” to “Behavior” -> “Landing Page.” This will show you where that “not provided” traffic is going, which can give you a clue as to the search terms.
Click the “advanced” link next to the search box and change it to “Include” “Landing Page” “Containing” and the URL of one of your landing pages, then click “Apply.” This will align the “not provided” landing page with all of the returned search terms for that page. Extrapolate from there for each of your highest traffic landing pages to build your list of important search terms.
Social media traffic is generally some of the worst quality, in terms of meeting your organizational goals.
The metrics for bounce rate, visit duration, and pages per session were significantly worse for social referrals compared to the site as a whole for 6 of the 9 organizations we reviewed. (Interestingly, the redesigned ThinkShout.com showed significant improvement across the board.) For the most part, they come, they spend a moment, they go back to Facebook.
Social traffic can be driven by all sorts of user motivations, from links posted in your own social channels – “I want to keep up with the latest news from one of my favorite organizations” – to something posted on your Wall by your mom – “I’d better know what that is so I can talk about it at our next dinner.” You’re not likely to meet all of them, so your analysis should focus on the highest value interactions. What are the outliers? If you have a few pages that outperform the majority, try to figure out what’s unique about them.
Again, pay special attention to landing pages. High bounce rates from a news article about your latest initiative probably won’t be of much concern. Bounces from your donation page should be: what drove traffic there in the first place, if it wasn’t you? Find those influencers!
Tip: Set up a special Analytics dashboard for social media.
Even if you can’t afford something like Radian6, you can use Google Analytics to do some pretty good analysis of traffic being driven to you by social channels. I find that the default reports provided are actually harder to use than they used to be, but you can aggregate the information most important to your team on a custom dashboard.
Start with a premade dashboard. Go to “Dashboards” -> “New Dashboard” and click “Import from Gallery.”
Justin Cutroni’s “Social Media Dashboard” is a great starting point. Click “Import”.
“Social Media Dashboard” will now be listed as an option under your Dashboards. Modify it to meet your needs!
If somebody likes your content enough to post it on their own website, you need to be aware of that, not just because you may have found a new partner, but because analyzing the pages sending traffic to you can tell you more about your own (potential) audience.
One of ThinkShout’s clients got significant traffic – roughly 3% of the site total in the first quarter of this year – from a regional magazine, mostly from a single article in which they were mentioned only tangentially; 90% of the visits are new to them. Knowing this opens the opportunity to think about user motivations from several angles:
What is it about our services that prompted the magazine to mention us? What do they know about their own audience that caused them to try to match them to our own? Are there other opportunities to engage that audience? Could what became a major landing page have been structured better?
What is it about the service described that prompted all the clickthroughs? These folks had a particular motivation for engaging with the content on the magazine’s site in the first place, which triggered the motivation to look at our offerings. How can we tap into that?
Was there any difference in behavior between the new visitors and repeat visitors?
Tip: Look at the actual sites and pages that are referring traffic your way.
Go to the basic Referrals report in Google Analytics: “Acquisition” -> “All Referrals.”
Click the domain name of the “Source” that interests you. This will bring up a list of the pages on that site that have referred visitors to you.
Combine one of the referral pages with the domain of the source. (Side note: I’m sure Google used to provide a direct link to this, but doesn’t seem to anymore. Boo.)
Spend some time poking around the site. Think about their audiences and what may have sparked the interest in your own content.
You’re probably running campaigns to drive your current supporters to your website through email, social channels, and web advertising – maybe even billboard, radio, and TV, if you’re blessed with a large advertising budget.
If you’re not already using tracking codes to better quantify the success of your campaigns, you should be. The desire paths here will be much more evident – and likely in line with your organizational goals: you send out a Call to Action (CTA), they respond. The key thing to watch for here is when the CTA doesn’t lead them to take desired action.
Tip: Track your non-digital campaigns.
Just because you’re not sending a URL to your supporters directly doesn’t mean you can’t put some basic campaign tracking in place.
First, set up the campaign URL, complete with codes.
Then, redirect to that URL, which Google will pick up.
- For print, you can embed the long campaign URL in a QR code.
- If you don’t expect your users to have a QR reader, create a simple landing page with a redirect to the tracked URL: your.org/campaignname is reasonable for somebody to type into a browser, so hit it with a 301.
- Or, use an URL shortener like bit.ly to create the redirect to the campaign URL for you.
Uh-oh, I was afraid you were going to stick around this long. There’s not much to say about “Direct” traffic, in terms of quantifiable user motivations. Maybe they typed your URL directly into their browser. Maybe somebody chatted the URL to them (the so-called “dark social” network). Maybe your mom’s proud of your work and mentioned it to a friend. Maybe they’ve bookmarked your site. Maybe you sent out an email campaign without a tracking code. Maybe… well, you get the picture.
Direct traffic does not have a lot of data attached to it that will enable you to figure out why a user arrived at your site beyond examining their landing pages.
This is, however, very important traffic: for some reason, almost unbidden, they showed up at your site. We can still apply the concept of desire paths to this segment, we just need to do it a bit differently: by taking a look at how they move through your site itself.
Determining “how” users arrive at your site is just the beginning of understanding the “why.” The next question to answer is “what”, as in “What are they doing on our site now?” By combining “how” with “what”, we can build models of behavior that will help us understand what motivates our audiences to seek us out online.
And once we get to the “why”, we be able to create structures that tap into the identified desire paths and subtly redirect them in ways that will help you meet your organizational goals.
So, if you’re so motivated, add to ThinkShout’s “direct traffic” report by bookmarking this page and we’ll point you to the next part when it’s available.
If you couldn't make the (nearly) back-to-back sprints on beta-blocking issues at Drupal DevDays Szeged and NYC Camp, don't worry! We still have some leftover sprint tasks that will help with the first Drupal 8 beta release. Many of the 27 remaining beta blockers require deep knowledge of the problem space; however, the tasks listed here (while not necessarily quick or easy) are more approachable and self-contained. Some of these issues are beta-blocking in their own right; others are "beta target" issues that would ideally be done for a beta release even if they aren't critical enough to block it.
If you're new to core contribution or Drupal 8, check out the Core Contribution Mentoring program instead.Documenting Critical Drupal 8 APIs #1988612: Change record: Apply formatters and widgets to rendered entity base fields
Entities in Drupal 7 and 8 have two kinds of field data: base fields (or properties in Drupal 7), like the node author field or the taxonomy term description, and configurable field instances, which can be attached to a given fieldable entity type's bundles through the user interface. Previously, it was not possible to use widgets or formatters for base fields, so they typically use custom form elements and rendering code that are not compatible with Drupal 8's in-place editing functionality. Since December, however, it is possible to use widgets and formatters on base fields -- but there is no change record yet for this improvement.#2244777: Document in WSCCI change notice or handbook all the menu changes (tasks, actions, contextual links, menu links) from 7 to 8
In order for contrib developers to make good use of our first beta release, we need good documentation of the new Drupal 8 routing and menu systems. The first step is to thoroughly document exactly how a Drupal 7 module's hook_menu() is upgraded to Drupal 8, and the exisitng change record is only partially complete. Join the discussion on this issue and help us complete this critical documentation.#2046367: Document the internals of the router
While not explicitly beta-blocking at this point, more complete API documentation for the routing system overall will be very valuable to contributed module developers using the first beta release. Help improve the routing documentation both in the Drupal.org handbook and in the Druapl 8 codebase.#2235363: Document how plugin definitions should declare config dependencies
This is a documentation followup for one small API change that supports the new configuration dependency system. It sits at the intersection of two new (and complicated) Drupal 8 APIs: plugin derivatives and the configuration entity system. Most of the confusing work for this issue is done, and it has resulted in a new handbook page on configuration entity dependencies. The remaining task is to add documentation of the config_dependencies key in plugin derivative definitions to the API documentation in the codebase. (See under "Calculating dependencies in plugins and their derivatives" on the handbook page.) The handbook page, which is about configuration dependencies generally, also needs further work, but that is not blocking for this issue.Configuration system #2224761: Translation sync should be stored in own storage instead of injected in field instance settings
This issue for the content translation module changes the way some of the module's configuration is stored. It's an easier change to implement compared to other deep architectural beta blockers for the Configuration system and the Entity Field API, but it still needs some work to resolve. The next step is to incorporate the latest feedback in comments #24 through #27 on the issue. This is also a great spot for multilingual initiative contributors to help with the beta.#2140511: Configuration file name collisions silently ignored for default configuration
This critical configuration system bug isn't a hard blocker for the beta release, but it can cause significant problems. An in-progress patch on the issue needs test failures resolved, updates for the latest changes in the configuration system, and other improvements.Entity Field API #2016679: [Meta] Expand Entity Type interfaces to provide methods
Drupal 8 core provides numerous entity types, but the full API for each type is not easily documented or discoverable, since the entity's properties are accessed through magic getters. To improve the developer experience, each entity type interface is being expanded with relevant methods for the specific entity. (For example, NodeInterface now has methods like isPromoted(), isPublished(), getTitle(), and setTitle().) All the methods for content entity types have been added, but only 1/4 of the configuration entity type interfaces are complete. Most issues have a submitted patch, and what is most needed is architectural review of the proposed interface methods. (For example, see comment #19 on the FieldConfig issue.) If you have experience with one of the subsystems that still has an open child issue, or if you have a sound grasp on OO design generally, we could use your help to thoroughly review these patches so that the completed APIs are available for contributed module developers in a beta release.#2190313: Add $EntityType::load() and loadMultiple() to simplify loading entities
In a similar vein of improving the entity system's developer experience by making the API more discoverable and removing exposure to internal concepts, this issue adds static methods for loading the entities of each type. The patch needs to be rerolled to apply to HEAD, and then needs architectural review.#2010930: [META] Apply formatters and widgets to rendered entity base fields
Remember that issue above about widgets and formatters for base fields? We also need to convert base fields other than the node title to also use widgets and formatters rather than custom code. This isn't considered beta-blocking, but it will change how contributed module developers interact with these entity types (plus make it so that in-place editing behaves in a more expected fashion). The several child issues of this meta (one per entity type) need either further work on the patch or code review. If you're somewhat familiar with entities and fields in Drupal 8, this is a good place to help.Views conversions #1823450: [Meta] Convert core listings to Views
One of the major benefits of having Views in core is that legacy one-off listings in core can be replaced with user-configurable views. Views is used in numerous places in core already, for example, the user and content administration screens, the promoted node frontpage and RSS feed, and numerous blocks like the "Recent content" and "Who's online" blocks. A handful of more complicated legacy core listings still need to be converted to views. These conversions don't block a beta release, but are targeted for the beta since adding them involves removing legacy API functions. In particular, it would be valuable to complete the conversions of the comment admin page and the taxonomy term pages to views for a beta release. Additionally, replacing the content revision table with a view is blocked on a major views bug related to content revisions.
The Hook 42 team had a great time at Stanford Drupal Camp this weekend. Kristen and Aimee presented two sessions each and four other members of our team attended, Lindsay, K2 (Kristin), Marc, and Marc's 15 year old son Dean. It was the first Drupal camp experience for the extended team and they enjoyed the great topics, beautiful facilities, and the welcoming community. Many thanks to the Stanford Drupal community for hosting such a great event!
Kristen and Aimee presented four sessions. We normally cover a bunch of detail so we've attached our slides for your reference:
- Site Tune-up, Vroom Vroom! by Kristen Pol (DrupalCon session!) - Session Overview
- Migrating from Drupal to Drupal: Using migrate and migrate_d2d by Kristen Pol - Session Overview
- Zicasso Case Study: The Million Node Migration (Business Emphasis) by Aimee Degnan - Session Overview
- (Don't Fear) The Features, Now With More Cowbell by Aimee Degnan - Session Overview
If you have any questions, contact us!
Other interesting links:
- Reusable features by Stanford's Zach Chandler: https://swsblog.stanford.edu/blog/3-tips-making-your-drupal-features-highly-reusable
When it comes to Drupal base themes, it seems the conversation is often limited to which one you should choose, rather than discussing whether you should be using one at all. As someone who has spent a lot of time extolling the virtues of base themes, I thought I'd share the other side of the argument and ask if we should we use contributed base themes in our projects.
This discussion is really part of a larger debate that front-end developers are having about CSS and grid frameworks in general (see here and here), but it seems particularly relevant when discussing Drupal base themes because all of the issues are magnified due to added complexity.Why We Use Base Themes
Why do so many of us use base themes? The easy answer is that they can save us time and potentially make us more efficient. Sometimes they can also act as common ground for development teams. But I think a more complete answer is that they act as a useful crutch, particularly when first learning Drupal theming or responsive design.
At some point we all had to build our first Drupal site or our first responsive site - probably under deadline - and we looked to a base theme or framework for help. It allowed us to get the job done on time and within budget, but perhaps without fully understanding everything that was going on under the hood.
Over time we probably learned most of the base theme and developed a deeper understanding of responsive design, but the framework eventually became a comfortable place. We stuck with it, happily soldiering on until one day...When the Shortcut Becomes the Long Way
If you've been working with base themes for a while, the moment has certainly come when you have found yourself fighting with it. By design, base themes and other frameworks are opinionated - they make decisions about how to solve certain problems. Most of the time this is a good thing. It can help you accomplish things more quickly. Until it doesn't, and then your base theme is actually slowing you down and causing problems.
Part of the reason why this happens is that the developer doesn't have full mastery of the base theme - or underlying concepts - and therefore doesn't know why something is happening. This is bound to happen with base themes like Omega and Zen that are complex and have a very granular file structure, lots of hooks, etc. It can take some effort to track issues down.
Other times it's not mastery as much as the choices being made by the base theme don't match up with the project at hand. You find yourself at cross purposes with the base theme, possibly even trying to sort out incompatibilities between the base theme and a module you want to use.
And all the hacks you add to sort things out? More kilobytes that have to be downloaded by a user on a mobile device.Fast Sites Win the Day
This leads us to another reason you might not want to use a base theme - it will probably slow down your site vs a theme that is tailored for a specific project. The case has been definitively made that faster sites are more successful sites (see here and here). In most cases, base themes are going to include a lot of stuff that you are not going to need on a given project. The 'extra' stuff is bloat that will end up slowing your site down.
This isn't a slam on base themes. Most of them are akin to a Swiss army knife. They have things in them that help accomodate a lot of different scenarios - they're flexible. This can be a big help if you're a beginner, but what if you're a seasoned front-end developer tasked with building a high performance site?
In that case, maybe a base theme isn't the way to go.The Role for Base Themes
Some will sing the praises of Mothership or Tao or their favorite lean base theme of choice, insisting it solves all of the issues I've mentioned. I certainly have no quarrel with using those base themes on projects if you've mastered them and find them useful. It can also be helpful to employ Zen or Omega. It really depends on the specific project. This isn't a post bashing base themes.
My own thinking on the topic, however, has shifted. I've decided to move away from base themes whenever possible. My decision stems from wanting lean code that helps me build fast, mobile-first sites. It also allows me to understand exactly what is happening with the code because I'm the one who wrote it. Ultimately, I think this practice makes me better at my job as a front-end developer, and importantly, I'm also delivering a better product to my clients. I came to this place after spending so much time hacking apart base themes that they were no longer recognizable. It made more sense to just chuck them entirely and start fresh.
Of course, I haven't thrown efficiency considerations aside. I have my own starter theme to make my work easier, and this is what I would advise others who are considering a base theme to do as well. Create your own bag of tricks. If there ends up being things in it that don't fit a particular project, you'll know exactly where they are so that you can easily discard them.
One last tangential thought on this topic - a fantastic development for Drupal 8 would be for core to add no CSS whatsoever, minimal markup and then let themes in contrib add commonly requested bells and whistles. This is a philosophical approach that would be hugely positive for Drupal as a mobile-first approach takes hold as the standard for front-end development.
If you have any comments on this post, you may politely leave them below.
RockYou is taking over Digital Chocolate and Playdom titles in two separate deals that bring 3 to 4 million players -- and some of the games' developers -- into its direct purview. ...
There's a lot of great educational resources out there that can help you refine your game development skills -- the trouble is knowing where to look. ...
"There are a host of technical issues that can -- and will -- undermine the player experience, even in the best-designed games." ...
Don't miss the April 21 deadline to submit proposals for talks, roundtables and panel sessions at GDC Europe 2014, which will be held in Cologne, Germany August 11-13. ...
This screencast introduces you to another one of the most important OSF for Drupal connector: the OSF FieldStorage module. What this module does is to create a new FieldStorage type for Drupal7. It enables Drupal7 to save the values of its Content Types fields into another storage system than the default one (i.e MySQL in most of the cases).
Because of the way that the Field system has been designed in Drupal7, it is possible to save the values of different fields that compose the same Content Type bundle into different field storage system. For example, if your Content Type bundle is composed of 10 fields, then 4 of them could be saved into MySQL and 6 of them into OSF.
The main purpose of the OSF FieldStorage module is to be able to save Drupal local Content Type information into OSF. What that means is that all your Drupal7 local content then become accessible, manageable and manipulatable using the 27 Open Semantic Framework (OSF) web services endpoints. Your local Drupal content can then be shared with other Drupal instances that could use OSF for Drupal to connect to that same OSF instance and seamlessly republish/re-purpose that local content from the other Drupal portal.
Here is the documentation of the architecture of this connector module.
This is the power of the OSF FieldStorage connector module. It supports the following Drupal features:
- Full FieldStorage API
- Entities caching
- 29 field widgets
- Export feature in 6 formats
In this screencast, you will be introduced to Drupal7′s Field system. Then you will see how the OSF FieldStorage module creates a new FieldStorage type for Drupal7 and how it can be used. Then you will see how to configure the OSF FieldStorage module: to creating new Content Type fields that uses this osf_fieldstorage type, how to map these fields to RDF, how to use one of the 29 supported field widgets, etc.
Finally, you will see how you can synchronize existing Content Type pages (that was created before OSF for Drupal was installed on your Drupal instance) into a OSF instance.
If you have worked with the Field UI in Drupal 7 you will know that you are able to prevent fields from being displayed when viewing entities (e.g. content, users etc). It was fairly simple, you would go to the Manage Display tab of an entity and move the field to the ‘Hidden’ region as shown in the screenshot below.
So you could hide a fields output from being displayed when viewing that entity. But what about when editing that entity? There was no way in the Drupal 7 Field UI to hide a field on a form. You would have to write some form of hook_form_alter() in a custom module and manually force the field to be hidden, like shown in this example.