

<?xml version="1.0"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>Good Work</title>
        <link>https://simplygoodwork.com/</link>
        <atom:link href="https://simplygoodwork.com/blog/feed.rss" rel="self" type="application/rss+xml" />
        <description>For people who make and manage websites.</description>
        <language>en-us</language>
        <pubDate>Thu, 12 Jan 2023 23:41:03 -0600</pubDate>
        <lastBuildDate>Thu, 12 Jan 2023 23:41:03 -0600</lastBuildDate>

                                            <item>
                <title>3 reasons most digital projects get derailed (and why yours doesn&#039;t have to)</title>
                <link>https://simplygoodwork.com/blog/3-reasons-most-digital-projects-get-derailed</link>
                <pubDate>Tue, 03 Jan 2023 13:27:00 -0600</pubDate>
                <author>Garrett Winder</author>
                <guid>https://simplygoodwork.com/blog/3-reasons-most-digital-projects-get-derailed</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/3-reasons-most-digital-projects-get-derailed.png?w=1600&amp;h=900&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1672773103&amp;s=c531091992be7a5d7172f8dd7753ecd7" alt="3 reasons most digital projects get derailed">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p class="callout-blurb text-[1.075rem] leading-[27px] font-bold tracking-[.15px] md:text-[1.3375rem] md:tracking-[.25px] md:leading-[32px]">How many times have your digital projects gone off the rails?</p>
<p>If you’ve organized digital projects for long, you’ve probably seen your fair share of projects that fly off the rails. However, most of them start well. Things move nicely, everyone’s communicating, and you’re meeting stakeholder expectations.</p>
<p><strong>But somewhere along the line, roadblocks start to pop up.</strong></p>
<p>Scope creep, late-in-the-game additions, and secret leaders who need approval power at the last minute.</p>
<p>Managing digital projects is hard work. And when they fly off the rails, it impacts every person involved, from stakeholders to the teams themselves. Without a predictable, repeatable process, team trust and morale head into the pits. Not to mention, it runs up your tab and impacts your ROI on what was <strong>supposed</strong> to be a money-making mission.</p>
<p>To us, mismanaged projects are the ninth circle of hell. They zap the energy from your people and burn out your developers <em>fast</em>. But it doesn’t have to be this way.</p>
<p>You can run projects with precision and efficiently launch your digital product when you make the right moves.</p>
<p>After hundreds of projects, we’ve found our bulletproof process, and we’re here to help you identify the top 3 reasons why most digital projects get derailed – so that yours doesn’t have to.</p>
<h2>1. Not doing discovery</h2>
<p>We get it: starting something new is exciting. But wishful thinking is the worst way to begin a digital project. Best way to avoid roadblocks? Being well-prepared. And a detailed project discovery will do just that for you.</p>
<p>No matter the complexity, there are always nuances and integrations that should be identified, researched, and thought through from the very start. <strong>Ideally, these nuances would be documented, along with mapped-out approaches.</strong></p>
<p>If you’re facing a particularly complicated project, we highly recommend these points even be tested and prototyped before the project kickoff. Testing the potential roadblocks ensures you can more accurately assess the time and effort included in the overall scope, cost, and impact.</p>
<p>Take it from us. <strong>Don’t let your development team step on countless unnecessary landmines halfway through a project.</strong> Instead, make your developers happy by giving them all the information upfront, so they can know what to expect and do their best work.</p>
<h2>2. A poor design handover</h2>
<p>“This looks nothing like I expected.”</p>
<p>“How was I supposed to know the hover should perform that way?”</p>
<p><strong>Designers and developers aren’t mind-readers.</strong> But how do you put an end to the disagreements and assumptions on either side? A well-documented design.</p>
<p>An excellent digital designer thinks through creating a cohesive look and feel throughout a website and considers the system as a whole. The best digital designers take it a step further by creating thorough documentation that demonstrates how they expect the features and content to work.</p>
<p>Going the extra mile ensures that everything looks and performs as expected when the staging link is handed over to the project stakeholders. <strong>Leaving anything up to assumptions in design will only lead to a disappointed design team and a frustrated development team.</strong></p>
<p class="callout-blurb text-[1.075rem] leading-[27px] font-bold tracking-[.15px] md:text-[1.3375rem] md:tracking-[.25px] md:leading-[32px]">Most modern design platforms like Figma and XD create a seamless language between designers and developers if used correctly.</p>
<p>Here’s our simple checklist to make sure your design handover goes off without a hitch:</p>
<ul><li>Sitemap</li><li>Digital Style Guide</li><li>Organized designs in a modern platform using digital measurements that stick to a consistent grid and document all required expectations, such as hovers and animations. Most modern design platforms like Figma and XD create a seamless language between designers and developers if used correctly!</li><li>Content Management System (CMS) Requirements – map out all expected options/iterations of the design that should be available in the CMS.</li><li>Naming guide in a modular design system so that all teams can align around a single nomenclature.</li></ul>
<p>The art of digital design is in the details. When those details are documented and communicated, it will ensure your project will flow even more smoothly.</p>
<h2>3. Not sticking to the plan</h2>
<p>What’s worse than a last-minute addition to a digital project? Two. Or 10! Once you let one change through, it could open the floodgates – and lead to many more headaches for the whole team.</p>
<p>When you allow for more ideas to be introduced to a plan that’s already in motion, you’re potentially hopping onto a runaway train of iterations. All these unplanned changes in scope lead to an unhappy team, frustrated developers, and stakeholders that assume all of these changes are “no big deal.”</p>
<p><strong>Let’s be clear: they are a very big deal.</strong></p>
<p>Even if the changes are simple, sticking to the original plan is critical. By saying yes and introducing new things, you risk:</p>
<ul><li>A domino effect of issues that stem from the requested changes</li><li>Impacted timeline and budget</li><li>Burnt-out teams due to constantly moving milestones and goalposts</li></ul>
<p>Iterations are normal for well-built websites. It’s how we improve upon them! If in the middle of a build or during Quality Assurance testing, new design or feature ideas come to the table, it’s ok to say, “not right now, but let’s start a future phase list!” That way, everyone involved can know what to expect for this project and create a priorities plan for the next iteration!</p>
<p>Launching big digital projects is exciting for you and your business, but it shouldn’t have you pulling out your hair. By implementing the right project management strategies from the start, you’ll be able to consistently meet and exceed your stakeholder’s expectations and launch bullet-proof projects.</p>
<p><strong>Tired of managing this all by yourself?</strong> Ready to gain a straightforward process where you know what to expect?</p>
<p>At Good Work, we are web development experts who are obsessed with the process - not just the result. We specialize in Craft CMS development for agencies and brands with a project management team and process that won’t let you down.</p>
<p>Simply schedule a call with us. We’ll discuss your project and give you a realistic picture of the time and budget. With our team on the job, you’ll never have to worry about getting stuck in development limbo. Instead, imagine the relief you’ll feel when you have a trustworthy web partner who knows their craft and can bring your design to life.</p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>Good Work Leads to a Good Life</title>
                <link>https://simplygoodwork.com/blog/good-work-leads-to-a-good-life</link>
                <pubDate>Wed, 07 Dec 2022 10:28:00 -0600</pubDate>
                <author>Katie Goldberg</author>
                <guid>https://simplygoodwork.com/blog/good-work-leads-to-a-good-life</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/grant_blog_image.jpg?w=1600&amp;h=900&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1670430118&amp;s=4b98fa95836a62aaa433887852386957" alt="Grant Abston Good Work Interview">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>How does someone with a master’s in journalism end up as the head of sales and client services at a web development agency? For Grant Abston, the path wasn’t exactly linear. But looking back on it, somehow it just makes sense.</p>
<p>Before it became a trend, he was letting the balance he desired shape his career. “What is the job that can foster the life that I want to live? Flexibility and freedom have been really important to me, and every job has reinforced that.”</p>
<p>His innate curiosity and desire to grow has kept him open to new opportunities and allowed him to carefully choose roles where he worked with the right people in the right environment.</p>
<h2>All Roads Led to ACU</h2>
<p>Grant never really thought too much about where he would go to college. His entire family went to Abilene Christian University (ACU), making the choice as easy as <a href="https://www.ispot.tv/ad/t1g9/capital-one-banking-barkley" target="_blank" rel="noreferrer noopener">picking Charles Barkley</a> for a game of pickup basketball.</p>
<p>It was a good choice. He met his wife there, and his roommate owns the company he now works for (more on that later). ACU was a formative time that he cherished, and he wanted to offer that same experience to others.</p>
<p>After finishing graduate school at The University of Texas, he was primed for an entry-level sports information position. But as he looked for a job, he started with his network – the people he would want to work alongside. It opened the door to a job in admissions at ACU.</p>
<p>As Grant describes it, “I wasn’t necessarily passionate about admissions. But I was passionate about ACU and I loved the thought of passing along my experience to others.”</p>
<p>The experience there was formative in shaping his view on work, and understanding just how important being in a positive, collaborative environment was to him.</p>
<p>After 3 years of “selling” prospective students on a college experience in Abilene, Grant took those skills to a formal sales role. He moved 2 hours west and spent a season at Industrial Outfitters selling oil and gas supplies.</p>
<p>Another opportunity arose, combining Grant’s experience in admissions with his athletics background and education. ACU had completed the transition to a Division I school, and they were looking to fill a newly created position of Assistant Director of Athletics for Recruiting. And just like that, he was back in Abilene.</p>
<p>His wife, Shealynn, also works at ACU as part of the clinical faculty team for speech pathology. With ties this strong, you’d think Grant would never leave. But sometimes, you don’t choose a career - it chooses you.</p>
<h2>Finding More Good People</h2>
<p>Grant and <a href="https://simplygoodwork.com/blog/when-good-is-actually-exceptional">Garrett</a> were college roommates, which meant that Grant had a front-row seat for every stage of the Good Work journey. He was going through the journalism program, seemingly unrelated to the computer science courses his good friend was taking.</p>
<p>In a sense, Grant has been invested in the company from day one. But not everyone can work with one of their closest friends. And even fewer people can work for one of their closest friends. Let’s be honest, the same things that bond people over spontaneous road trips or late-night pizza while “studying” don’t always translate to the workplace.</p>
<p>But then again, not everyone has the ease in their relationship that Grant and Garrett do. Garrett approached Grant to join the team and hit on all the things Grant wanted from a job. Work with people you enjoy. Be in a family-focused, laid-back atmosphere, but do really good work.</p>
<p>Sure the industry was very different from where he had been. But Grant leaned on the skills that would easily transfer. “I knew that I could form relationships and talk with people, and do it in an environment that I enjoy. It’s been 3 years and I haven’t looked back.”</p>
<p>Grant’s days are focused on business development at Good Work, which can mean a lot of things at a small business. Essentially, he is tasked with developing relationships with other agencies and maintaining relationships with current partners. He fields all incoming leads and helps to define each project as estimates are created.</p>
<p>“I’m very goal-oriented and am always looking for new ways to get Good Work in front of the right people. Whether it’s a process to improve or problem to solve, I love to see if I can figure it out. Sometimes the answer is yes, but sometimes the answer is no. Either way, my curiosity pushes me to dig.”</p>
<h2>Living the Good Life</h2>
<p>Grant’s curiosity and ability to dig deep serve him outside of work, as well. He and Shealynn have three kids ranging from 1st grade to celebrating a 1st birthday. In other words, they’re on the go a lot. </p>
<p>And with three little ones running around, a live-in DIY renovation isn’t something he would recommend, but is figuring out how to survive. Grant’s best advice if you find yourself in a situation like this? “Until you’re an expert on something, don’t make any promises on the timeline of projects. Every time I’ve told Shealynn ‘this will be done by June 1st’ or ‘I think I need about 2 more hours’ – I’m always wrong.”</p>
<p>Having played nearly every sport growing up, Grant still enjoys having a physical outlet. He’s working on his golf game when he can, but the more consistent activity starts at home. As of 2022, Grant is now part of the Peleton cult community. You can find him on a 90s country or alternative rock ride most days of the week.</p>
<p>“At this point, I couldn’t ask for much more. I’m working at a job that is fulfilling with people I both respect and enjoy. We have a great <a href="https://simplygoodwork.com/blog/creating-a-culture-of-balance">culture</a> that encourages balance. My wife and I are raising our kids in a city that means a lot to us. There’s nothing flashy about it, but this is the good life.”</p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>Update Craft CMS 3 to 4</title>
                <link>https://simplygoodwork.com/blog/update-craft-cms-3-to-4</link>
                <pubDate>Thu, 03 Nov 2022 11:16:00 -0500</pubDate>
                <author>Chris Rowe</author>
                <guid>https://simplygoodwork.com/blog/update-craft-cms-3-to-4</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/goodwork-article-image-craft3update.jpg?w=1600&amp;h=900&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1667491915&amp;s=e0e770602b490e99c9f5043a78fddc70" alt="Update Craft CMS">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>Since 2012 Craft CMS has continued to increase in popularity and has been adopted by an ever-growing list of brands like PBS, Tito’s and Netflix. Craft's modern approach to content management, and extreme design flexibility, has garnered <a href="https://craftcms.com/blog/new-awards-and-recognition">high praise</a> from both developers and website owners. It offers users an expanding roadmap of modern features and has a thriving community of developers.</p>
<p>Rapid growth in popularity also means rapid growth in product maturity. On May 4th, 2022 (May the 4th Be With You!) <a href="https://craftcms.com/blog/craft-4">Craft launched version 4</a> and recently announced the <a href="https://craftcms.com/knowledge-base/supported-versions">end-of-life dates for Craft 3</a>. It is important to update your Craft CMS website from 3 to 4 now rather than waiting, so much so that we decided to post about it!</p>
<h2>What does Craft 3 end-of-life really mean?</h2>
<p>Beginning in May 2023 Craft 3 will no longer be marketed, sold, or maintained by its creators. Craft 4 is already on the market, so continuing to maintain an old version doesn’t make sense. So, straight from the horse’s mouth:</p>
<ul><li><strong>Craft 3 bug fixes will be supported through April 30, 2023.</strong> After April 30, 2023 Craft will no longer fix issues that creep into the software.</li><li><strong>Important Craft 3 security fixes will be supported through April 30, 2024.</strong> After April 30, 2024 Craft will no longer address security issues that creep into the software.</li></ul>
<h2>New features and benefits of Craft 4</h2>
<p>Craft 4 is packed with new features and benefits that can be easily introduced into your website once the upgrade is complete. Outside of the increased security of being on the latest version of Craft, below are some of our favorite features that both content editors and website owners love.</p>
<h3>Performance and Accessibility</h3>
<p>Speed and accessibility are a top priority with every new release of Craft, and Craft 4 is no different. Saving entries and drafts are substantially faster, especially on pages with complex modules using Matrix and Neo.</p>
<h3>Conditional Fields</h3>
<p>In Craft 4 you can show and hide fields based on the contents of another field, making your entries smarter and easier to maintain.</p>
<h3>Element Slideouts</h3>
<p>The element slideout has been significantly upgraded in Craft 4 to allow you to fully edit related entries within entries.</p>
<h3>Category Drafts</h3>
<p>Category drafts now work the same as entry drafts, allowing more flexibility with content authoring on websites with more complex category fields and functionality.</p>
<h2>Third-party Craft plugin updates</h2>
<p>Craft has committed to supporting bug and security fixes through May 2023 and 2024, but third-party plugin developers will decide their own end-of-life policies. Most plugin developers have begun moving to Craft 4, although some will continue to provide minimal support for existing Craft 3 plugins. Our team of developers at Good Work believes this is the most important reason to upgrade to Craft 4 sooner than later, and have already <a href="https://plugins.craftcms.com/donkeytail">updated our plugins to Craft 4</a>.</p>
<h2>How to update Craft CMS 3 to 4</h2>
<p>Now that the end-of-life date for Craft 3 has been announced, and depending on the size and complexity of your website it’s good practice to start planning the upgrade process as soon as possible. Below are some helpful items to think through before you update Craft:</p>
<ul><li>Make sure your server meets the <a href="https://craftcms.com/docs/4.x/requirements.html">Craft 4 requirements</a>, which are slightly different than Craft 3.</li><li>Upgrade your website and plugins to Craft 3.7.40 or newer before moving to Craft 4. This adds the Craft 4 Plugin Utility to provide an overview of plugins’ readiness.</li><li>Audit all third-party plugins to make sure they have a Craft 4 version available. If there is not a Craft 4 version available, contact the plugin developer to see if and when their plugins will be available for Craft 4. If the developer does not plan to upgrade their plugins, you'll need to decide on a different upgrade path for that particular feature of your website.</li><li>Check to see if you have any custom plugin(s) created specifically for your website. If so you'll need to update those custom plugin(s) with either the team who built the plugin for you or another reliable development team.</li><li>Review the instructions on Craft's website for <a href="https://craftcms.com/docs/4.x/upgrade.html">performing the Craft 4 upgrade</a>.</li><li>Once you have a good idea of the time and effort it will take to upgrade your website be sure to schedule the upgrade as soon as possible now that the Craft 3 end-of-life date is only a few months away.</li></ul>
<p>Further details can be found in the <a href="https://craftcms.com/docs/4.x/upgrade.html">Upgrading from Craft 3</a> section of the Craft 4 Documentation. Reach out to Good Work if you would like to work with us on this process or have any questions with how to update Craft from 3 to 4.</p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>3 things your project manager should be doing for you (but probably isn’t)</title>
                <link>https://simplygoodwork.com/blog/3-things-your-project-manager-should-be-doing-for-you</link>
                <pubDate>Thu, 06 Oct 2022 08:00:00 -0500</pubDate>
                <author>Garrett Winder</author>
                <guid>https://simplygoodwork.com/blog/3-things-your-project-manager-should-be-doing-for-you</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/gwblog_3things_projectmanagers.png?w=1600&amp;h=900&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666733373&amp;s=39e6c39a5d1941975f33e6c1ba7a37da" alt="3 things your project manager should be doing for you">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>Too often web development teams let you down. Good project management is the exception, not the rule. Clients have become conditioned to believe that sub-par systems and broken processes are the cost of doing business.</p>
<p>At Good Work, we’ve got your back. We are web development experts who are obsessed with the process - not just the end result. We have a bullet-proof web development process you can trust.</p>
<p>Project management is not just about beautiful – but unrealistic – spreadsheets, or nagging reminders of deadlines. We believe you should expect more from your project manager (PM). In fact, we think your PM should be exceptional in three key areas: Communication, Documentation, and Philosophy.</p>
<h2>Communication: Project Status Updates on a Weekly Basis</h2>
<p>One of the easiest things that PMs can do for clients is provide a weekly project status update. The goal is to provide a high-level overview of the project's health, an update on key milestones, and call out any issues or concerns that would prevent things from moving forward as expected.</p>
<p>An important element of this communication is that it is proactive, not reactive. This isn’t simply a report on what happened last week. This is also forecasting ahead. At Good Work, we share potential issues or concerns as soon as we see them. This gives our clients a head’s up even if now is not the time to react. This way they are not caught off-guard when a decision is needed.</p>
<h3>Why is Poor Communication an Issue?</h3>
<p>Projects are constantly evolving, and most PMs are working on anywhere from 5-20 projects at any given time. There are so many moving parts and things to do. Why take the time out to proactively communicate?</p>
<p>Consider this: it is the PM’s responsibility to communicate with the client, not the client’s responsibility to track down the PM. Without the communication, clients don't even know they are on the PM’s radar. Silence opens the door for assumptions. It erodes trust in the project.</p>
<p>With communication coming at least weekly, the client has confidence that the project is moving forward. They can trust that the PM isn’t just hiding things and hoping they will go away. They have assurance the process is transparent.</p>
<h2>Documentation: Creating a Shared System for Project Details</h2>
<p>Agencies have a way of documenting projects. And clients often have their own – very different – system for keeping track of things. By creating a shared system for all the project details, your PM is creating documentation around the shared relationship.</p>
<p>It’s too easy to get bogged down in which system to use. The more important details are who has access and what gets put into the system. (<a href="https://simplygoodwork.com/blog/the-5-tools-we-use-for-our-bulletproof-project-management-process">But if you’re curious, here are the tools we use for our project management process.</a>)</p>
<p>At Good Work, the project plan is the most important piece of the puzzle. This includes all the assumptions, the moving parts, the timeline, and expectations. The scope and contract are also included.</p>
<p>Shared documentation provides a historical account of the project, and helps with people coming in and out. Whether employees leave the company or there is an internal reassignment, someone often needs to get caught up to speed mid-project. This shared documentation makes the onboarding process much smoother.</p>
<h3>What are the Risks of NOT Having Shared Documentation?</h3>
<p>The biggest risk of not having shared documentation is related to any shifts in the project. Consider big things like scope addendums or smaller things like deciding between A and B.</p>
<p>At Good Work, every decision made lives in a shared document, so that if there is a question about something, there is a quick reference. (Pro tip: pivot tables are especially good here.)</p>
<p>This all needs to be captured in the project plan, showing how these shifts impact time and cost. This way the client never feels like the agency pulled a fast one on them. Without this documentation, it’s all left up to memory and conjecture. Our goal is to leave zero room for ambiguity. Everything is written down – if it’s not in the shared documentation, it doesn’t exist.</p>
<h2>Philosophy: Be the PROJECT’S Biggest Advocate (don’t choose sides)</h2>
<p>Different PMs and companies tend to have a culture that leans one way or the other – either being internally focused (keep employees happy) or client-service oriented (the client is always right).</p>
<p>But the role of a good PM is to be Switzerland. Keep the 30-thousand-foot view. Manage everyone’s expectations. Don’t take sides.</p>
<p>This means they need to be willing and able to have hard conversations with their team or the client. As an objective third party, their role is to keep people accountable. Of course, being as diplomatic and human as possible.</p>
<p>Another way that our PMs work as a project advocate is to equip our clients with the verbiage or level of detail needed to bring the leadership along. At Good Work, we join calls to help sell an idea, or draft emails to communicate to the leadership team on behalf of our client.</p>
<h3>What is the Goal of Having a “Project Advocate” Philosophy?</h3>
<p>When the client knows that the project success is the whole point, we increase the trust factor. Our clients know that we aren’t just people pleasers, which means we’ll say yes when it’s right for the project, and no when it doesn’t. We’re looking out for both our team and for them.</p>
<h2>It’s Time to Expect More from Your PM</h2>
<p>You shouldn’t have to settle for a project management process that lets you down. It’s ok to expect more from your PM and your web development agency. You deserve to launch your projects on time, on budget, and with confidence.</p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>Eight Lessons Learned From Eight Years of Good Work</title>
                <link>https://simplygoodwork.com/blog/eight-lessons-learned-from-eight-years-of-good-work</link>
                <pubDate>Mon, 29 Aug 2022 08:00:00 -0500</pubDate>
                <author>Garrett Winder</author>
                <guid>https://simplygoodwork.com/blog/eight-lessons-learned-from-eight-years-of-good-work</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/gw_blog_8founders.png?w=1600&amp;h=900&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666733408&amp;s=3bc4a20193fa37ba8c75ae853642e0de" alt="Eight lessons learned from eight years of Good Work">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <h2>Lesson 1: Don’t rush into specialization</h2>
<p>As I reflect back on our very first year of business, we avoided niching down. Or, as I said when we celebrated <a href="https://simplygoodwork.com/blog/1-year-of-good-work">1 year of Good Work</a>, “the focus was to have no focus.” I wanted our specialization to happen organically, as we discovered what projects were the most enjoyable and where we were doing our best work.</p>
<p>We said yes to anything with a reasonable budget, which gave us the ability to experiment and have a strong opinion about what type of work we were best suited for. This helped us be more confident when we did specialize.</p>
<h2>Lesson 2: Don't be scared to take on money</h2>
<p>Business growth isn’t always linear. There are certain times when growth would mean a very costly or unprofitable season. Not all businesses can afford to ride out that season without help.</p>
<p>We took advantage of a bridge loan early on to help with cash flow as we made investments for the future of the company. It was a bit scary to commit to a loan, but we ran the numbers (a few times!) to ensure the ROI was worth it.</p>
<p>Don’t feel like you always have to bootstrap the hard parts. A strategic loan can be a really great way to get to the next level of business. </p>
<h2>Lesson 3: Stay flexible</h2>
<p>There is always a tension in business between focus and flexibility. At Good Work, I have loved our ability to evolve quickly and efficiently without getting distracted by shiny objects. We have continued to learn from both our wins and failures, and adjust accordingly.</p>
<p>A one-time example of this was the decision to hire all developers as full-time employees. We used contractors early on to help meet the “less predictable” client needs. But it quickly became clear that to serve clients with <a href="/blog?page=1&amp;category=process" target="_blank" rel="noreferrer noopener">the Good Work Way</a>, we needed to have everyone in-house.</p>
<p>A more on-going example is how we approach goals. We set goals each year, but evaluate along the way. We flex with the twists and turns on the road that come along.</p>
<h2>Lesson 4: Delegate early and often</h2>
<p>As many founders know, just because you have the vision and leadership, doesn’t mean that you will be good at all the things in a business. The sooner you practice delegating, the better off you’ll be.</p>
<p>You can easily be busy all day without doing any of the right stuff. You only have so much time in a day, so make sure you’re prioritizing everything that you need to do. What are the things that only you can do for your business? If it’s not something you need to do, hand it off.</p>
<h2>Lesson 5: Hire smart</h2>
<p>Of course, to be able to delegate a task, you need people to delegate to. I see too many founders who falsely believe that they need to be the smartest person in the room. I hired for my areas of weakness, ensuring that I was not the smartest person in many areas. Everyone on the team is better at their jobs than I would be at them. And Good Work is better for that.</p>
<h2>Lesson 6: Be generous with your trust</h2>
<p>Once you have good people to delegate aspects of the business, make sure you actually trust them to do it. Letting go of control is a big deal, but it’s necessary for growth. And unless you enjoy working 80-100 hours a week, it’s necessary for your sanity.</p>
<p>Be generous with your trust. Let your team try things (and maybe even fail a few times). We have high standards for our work, and being excellent at our <a href="https://simplygoodwork.com/craft-cms">Craft</a> is a must. But what we do and how we get there is not life or death. We let people experiment and grow.</p>
<h2>Lesson 7: Document everything</h2>
<p>In the early days, I knew that it would be faster to just do things myself than to teach others or document processes. I also knew that I couldn’t keep everything in my head. I knew that if I wanted to grow and scale, documentation was non-negotiable.</p>
<p>Before we could document our process, we had <a href="https://simplygoodwork.com/blog/a-personal-connection-and-bulletproof-project-management">to actually learn what our process was</a>. Now it’s almost effortless as it is maintained by our team. In fact, it saves us time and effort and prevents mistakes.</p>
<p>Bonus: it has become a major differentiator for us in the business, and does not rely on any one person to make happen.</p>
<h2>Lesson 8: Embrace new skills</h2>
<p>There are a lot of uncomfortable things about being “in charge.” I have to regularly practice developing skills that are not part of my personality for the good of the company.</p>
<p>For instance, I’m wired to run away in the face of conflict. But as the leader of a company, that’s just not an option. I don’t have the luxury of hiding from difficult situations or hard conversations. If I don’t address things head on, they won’t simply go away. They will fester.</p>
<p>Left to my own tendencies, my communication skills would be a hindrance to the company. At my core, I’m the opposite of the Good Work Way. But I’ve put in the work to become a better leader and communicator.</p>
<h2>BONUS: Have fun on the ride</h2>
<p><a href="https://simplygoodwork.com/blog/creating-a-culture-of-balance">We’re serious about work but we’re also serious about keeping it light</a>. Even with good boundaries, work is a large chunk of life. We spend a lot of time together as the Good Work team, and we think that time should be as enjoyable as possible.</p>
<p> </p>
<p>One small example from our development team. After their weekly team meetings, they play one round of <a href="https://store.steampowered.com/app/1308380/Super_Bomberman_R_Online/">Bomberman</a> on Zoom. They love it, and I think it’s great.</p>
<p>Of course not every day is a party, but I really believe that if you’re not having fun, you’re not doing it right.</p>
<p>(This article was originally posted on <a href="https://www.linkedin.com/feed/update/urn:li:ugcPost:6967508765092794368?updateEntityUrn=urn%3Ali%3Afs_updateV2%3A%28urn%3Ali%3AugcPost%3A6967508765092794368%2CFEED_DETAIL%2CEMPTY%2CDEFAULT%2Cfalse%29" target="_blank" rel="noreferrer noopener">LinkedIn</a>.)</p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>Putting the Puzzle Pieces Together</title>
                <link>https://simplygoodwork.com/blog/putting-the-puzzle-pieces-together</link>
                <pubDate>Fri, 19 Aug 2022 08:30:00 -0500</pubDate>
                <author>Katie Goldberg</author>
                <guid>https://simplygoodwork.com/blog/putting-the-puzzle-pieces-together</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/Chris_Spotlight.PNG?w=2112&amp;h=1188&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666733440&amp;s=eaef57899e601f48bf98e8cadc58e874" alt="Putting the Puzzle Pieces Together">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>If you’ve been around Good Work for any amount of time, odds are you know Chris and his work. He was the first employee that <a href="https://simplygoodwork.com/blog/when-good-is-actually-exceptional">Garrett</a> hired (more on that later), and has been instrumental in forming our team of web developers.</p>
<h2>Being in the Right Place at the Right Time</h2>
<p>Like many students, Chris worked retail during <del>college</del> uni. As a salesperson at IKEA, he was paid to help customers in the store. But his computer science classes brought value to the team, as well. He saw that they were spending too much time and energy doing things manually in spreadsheets, and ended up creating new systems for them (using Visual Basic and lots of macros) to improve efficiency.</p>
<p>This made it easy for him to go back after graduation and ask management for an opportunity. He was brought on to help develop the internal content management system (CMS). <em>Spoiler alert: This isn’t the last time Chris will pitch himself and land a job.</em></p>
<p>IKEA was a great training ground, and the first time he got paid to actually do development work. But Chris saw himself as a small fish in a big sea, and eventually wanted to look for something different.</p>
<p>After IKEA he moved to Concept2, where he joined a manager who had lots of real-world experience but no formal training. Chris brought the cutting-edge tools and knowledge, and together they made a great team. He speaks of that time fondly, recognizing the sweet spot of growth and potential that existed when he started. </p>
<p>“What a time to be in web development. Twitter had just started, and website conferences were becoming a thing. The industry wasn’t simply kids working in their parent’s basement – it was becoming something that ‘real people’ did. I was doing cool stuff, and I was one of the few people out there doing it,” he reflects. </p>
<p>Next, Chris joined the Wattbike team, which was actually a side project of Concept2 that grew into its own (very successful) company. The fun of working with Wattbike was the blank slate – creating something out of nothing and choosing the tools along the way is a developer's dream. But once the site was in a good place and stable, he was hungry for new problems and new companies. </p>
<h2>The Road to Good Work</h2>
<p>That meant going to an agency where there would constantly be new projects and clients. Chris had tried a few times over the years to join a local agency Erskine, and as it turns out – the third time <em>is</em> the charm.</p>
<p>It was there at Erskine that Chris met Garrett. From the beginning, he saw something in Garrett worth following. “He hit the ground running when he joined, and really made a name for himself. I was intrigued.”</p>
<p>A few years later when Garrett left and <a href="https://simplygoodwork.com/blog/an-introduction-to-good-work">started Good Work</a>, Chris stayed in touch. When Garrett posted a job on Twitter for a web developer, he was ready. Chris jokes “I didn’t interview or even ask about the job. I just sort of took it. I replied on Twitter, ‘the job is mine, you can take down the post.’” He was right.</p>
<h2>Fitting the Puzzle Pieces Together</h2>
<p>“What we do [at Good Work] is not <em>just</em> websites. It’s about solving a problem – a puzzle. There’s usually only one good way to solve it, and I enjoy getting to figure it out. I love the variety of projects. We have a diverse range of clients that makes this work really fun.”</p>
<p>It’s this diversity of clients and problem solving that keeps Chris excited about Good Work. About 7 years in, and he still loves what he’s doing.</p>
<p>As he describes it, each web project is actually three distinct “puzzles” to solve: </p>
<ul><li>Meeting the client’s needs (and wants)</li><li>Creating an excellent experience for the end user</li><li>Finding the right tools for the job</li></ul>
<p>Take e-commerce sites for example. </p>
<p>On the surface, they are a normal, everyday experience for customers (end users). They expect it to be very simple and intuitive.</p>
<p>Meeting the client’s needs – and wants – requires much more sophistication on the backend. There are so many factors that come into play to ensure their desires are met.</p>
<ul><li>How is inventory managed in the backend?</li><li>What kind of payment options are available?</li><li>Does the company collect taxes?</li><li>How do sales, discounts, and promo codes work? </li><li>What about shipping integrations, returns, reviews?</li></ul>
<p>Choosing the right tech stack is important, and every client has slightly different requirements and order of operations so no two e-commerce clients are the same. There’s a lot going on and getting everything working correctly and elegantly is a challenging but rewarding task.</p>
<h2>Beyond the Nine to Five</h2>
<p>To say that Chris Rowe likes solving puzzles is like saying that the summer here in Texas is “warm.” Close, but lacking some intensity. He will eagerly suggest playing a board game with his wife after their son is asleep and “I would live in an escape room if I could,” he said.</p>
<p>The passion you hear from Chris about puzzles pales in comparison to the passion when he speaks about his family. Chris and his wife welcomed a son into their family during the pandemic. “Being a dad is the hardest and easiest and best thing ever. It changed me completely.”</p>
<p>Chris is also quick to tell you about his love for Back to the Future – or, as he calls it, “the best film ever made.” His passion goes far beyond repetitive viewings. Met Michael J Fox and Christopher LLoyd? Check. Driven a DeLorean? Check. Seen the musical? Check. Not to mention all the signed memorabilia that you’ll see in Chris’ Zoom background.</p>
<p>“I actually wanted to name our son Marty, but my wife vetoed that. Turns out now he goes to nursery with a boy named <a href="https://backtothefuture.fandom.com/wiki/Emmett_Brown">Emmett Brown</a>. Can you imagine how cool that would have been?” </p>
<p>Talk about all the pieces coming together…</p>
<p><em>Chris is a sprightly chap with a hawk eye for the smallest of details, and keeps our team up-to-date with our development processes and workflows. Spending most of his time beavering away in semantic markup and super organized stylesheets - Chris likes to use every keyboard shortcut known to man. He’s a pro <a href="https://simplygoodwork.com/craft-cms">Craft CMS developer</a> and will definitely buy a DeLorean someday. Chris lives in Nottingham, England - and the tree in his garden is a direct descendant of the Major Oak.</em></p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>Using Formie to Create Forms on Craft CMS Websites</title>
                <link>https://simplygoodwork.com/blog/using-formie-to-create-forms-on-craft-cms-websites</link>
                <pubDate>Thu, 28 Jul 2022 08:00:00 -0500</pubDate>
                <author>Gavin Platt</author>
                <guid>https://simplygoodwork.com/blog/using-formie-to-create-forms-on-craft-cms-websites</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/goodwork-article-image-formie.png?w=1600&amp;h=900&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666733304&amp;s=7f044376be1b66c03b7cbe532ecb4fc7" alt="Using Formie to Create Forms on Craft CMS Websites">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>Forms! Nearly every website requires forms for something – whether it’s lead capture, feedback surveys, newsletter signups, or booking requests.</p>
<p>At Good Work, our go-to option for forms on Craft websites is Formie. It allows you to build pretty much any form you could need, without resorting to another third-party subscription service.</p>
<h2>Why We ❤️ Formie</h2>
<ul>
 <li><strong>Easy-to-use.</strong> The drag and drop form builder has 30+ fields to choose from. Fields range from basic (like name, email address, and checkbox) to fancy (like predictive address lookup and Stripe-powered payment details).</li>
 <li><strong>Email notifications.</strong> You can configure multiple notifications per form, e.g. sending the submission to your email address and emailing the submitter to confirm receipt. It’s easy to include data from the form in the notifications, and you can also set up conditional rules to determine when and how notifications should be sent. <em>(Note: This does require using an email delivery tool that's usually $10/mo. or less.)</em></li>
 <li><strong>Totally bespoke styling.</strong> You aren’t tied to any awkward third-party styles. While Formie has great out-of-the-box, time-saving templates, forms can be customized to be cohesive with your brand. </li>
 <li><strong>Integrations.</strong> Chances are Formie offers an integration for your email marketing or CRM tool. Mailchimp, Constant Contact, Klaviyo, Pipedrive, Zoho, and dozens more are all supported. Formie also offers webhooks, so you can easily integrate with Zapier.</li><li><strong>Solid spam protection.</strong></li>
</ul>
<h2>Quick Guide to Creating a New Form in Formie</h2>
<h3>1. Create the form</h3>
<p>Log in to Craft and click <code>Formie</code> in the sidebar, then <code>New Form</code> in the top right. Give your form a name. This is when you could also choose a stencil * but we’ll start with a blank form and click <code>Next</code>. Now you’ll see the form screen. There are tabs along the top which we’ll walk through below. The first tab, <code>Fields</code>, is where most of the action is.</p>
<figure><img src="https://optimise2.assets-servd.host/good-work/production/blog/2022-07-19-how-to-use-forms-on-your-craft-cms-website/formie-blog-post-2.png?w=1536&h=1180&auto=compress%2Cformat&fit=crop&dm=1658239605&s=62c8a5143232e58f23e22e6151d1080e" alt="" /></figure>
<p><strong><em>*Note:</em></strong><em> Stencils are form templates with fields and behavior already set up. If you regularly create similar forms, your web team can set up <code>stencils</code> for you – which can be used exactly as they are or with some small changes made before publishing the form.</em></p>
<h3>2. Add form fields</h3>
<figure><img src="https://optimise2.assets-servd.host/good-work/production/blog/2022-07-19-how-to-use-forms-on-your-craft-cms-website/formie-blog-post-3.png?w=1536&h=1180&auto=compress%2Cformat&fit=crop&dm=1658239619&s=4fda97c6af3a1839b52a4abc76ca7112" alt="" /></figure>
<p>The <code>Fields</code> tab is where you’ll build out your form. Drag and drop a field from the list on the right into the “form area” on the left.</p>
<figure><img src="https://optimise2.assets-servd.host/good-work/production/blog/2022-07-19-how-to-use-forms-on-your-craft-cms-website/formie-blog-post-4.png?w=1536&h=1180&auto=compress%2Cformat&fit=crop&dm=1658239634&s=550468246626ff27f0a8163ca2e57ef4" alt="" /></figure>
<p>Once you drop the field into the form, a popup will appear with field options. All that’s required is a label, but most fields have other options, including making a field required. In the field options popup, click the <code>Settings</code> tab then switch on the <code>Required field</code> toggle. Click <code>Apply</code> to save changes to the field.</p>
<p>Field options can be very simple as above, but can also get complex. E.g. in the <code>Conditions</code> tab, you can set up logic to determine if/when this field should be shown.</p>
<p>If you need to access the field options popup again, hover over the field then click on the cog icon → Edit.</p>
<p>Repeat this process for all your fields. You can drag &amp; drop fields within the form area on the left to rearrange them if needed. (For this example we’ve added fields for name, email address, and inquiry topic.)</p>
<h3>3. Edit form appearance</h3>
<p>Click on the <code>Appearance</code> tab. These fields are all self-explanatory, and we find you rarely need to make any changes here.</p>
<h3>4. Configure form behavior</h3>
<figure><img src="https://optimise2.assets-servd.host/good-work/production/blog/2022-07-19-how-to-use-forms-on-your-craft-cms-website/formie-blog-post-9.png?w=1536&h=1180&auto=compress%2Cformat&fit=crop&dm=1658239704&s=93348e1722917222ffb15c2bbd7297ea" alt="" /></figure>
<p>On the <code>Behavior</code> tab, you can control what happens when a user submits a form. This includes what happens on a successful submission – you can display a confirmation message, or redirect to another entry or URL. The latter can be very useful, e.g. you might create a “thank you” page that has additional information/calls to action (which you can also add to Google Analytics as a successful “conversion goal”).</p>
<p>You can also configure validation, including what error messages should say and where they should be displayed. Again, the defaults usually work well here – we definitely recommend keeping <code>Validate Form on Submit</code> enabled.</p>
<h3>5. Set up email notifications</h3>
<p>Let’s send a confirmation email to a user when they submit the form:</p>
<figure><img src="https://optimise2.assets-servd.host/good-work/production/blog/2022-07-19-how-to-use-forms-on-your-craft-cms-website/formie-blog-post-13.png?w=1536&h=1252&auto=compress%2Cformat&fit=crop&dm=1658239769&s=81b3ea8f11dc6b27db15cec480e280c8" alt="" /></figure>
<ol>
 <li>In the <code>Email Notifications</code> tab click <code>New Notification</code>.</li>
 <li>Set <code>Recipients</code> to <code>Email Addresses</code>.</li>
 <li>In this case, we want to send the email to the email address of whoever submitted the form. Formie makes this easy with <code>variables</code>. Click the plus icon in the right of the field. This lists all available fields from the form. Choose <code>Email</code> and you’ll see it appear in the field.</li>
 <li>Enter the email content. We can use fields from the form submission by clicking the plus icon – in this case, <code>Full Name</code> is being used to personalize the email.</li>
 <li>Click <code>Apply</code> to save the email notification.</li>
</ol>
<p>Let’s also send a notification to someone within our company. We’ll use a conditional to make sure the notification is sent to the right person, in this case, billing@website.com if the inquiry relates to billing:</p>
<figure><img src="https://optimise2.assets-servd.host/good-work/production/blog/2022-07-19-how-to-use-forms-on-your-craft-cms-website/formie-blog-post-16.png?w=1536&h=1252&auto=compress%2Cformat&fit=crop&dm=1658239814&s=26b76b38c9b99987432cdf9ac145985e" alt="" /></figure>
<ol>
 <li>Back in the <code>Email Notification</code> tab click <code>New Notification</code> again.</li>
 <li>This time, we know the email we want to send, so we type <code>billing@website.com</code> in the <code>Recipient Emails</code> field.</li>
 <li>On the <code>Conditions</code> tab set up a condition that says “I want to send this notification if the value of the <code>What can we help you with?</code> field is <code>Billing</code>”</li>
 <li>Click <code>Apply</code> to save.</li>
</ol>
<p>You can click on either of these notifications to make further changes – Formie gives you a lot of power here, e.g. configuring who the email should be sent from, adding CC addresses, using custom branded email templates, and more.</p>
<p><strong><em>Pro tip:</em></strong> <em>to ensure email notifications get delivered and are not marked as spam, we highly recommend using a transactional email provider like <a href="https://postmarkapp.com/">Postmark</a>, Elastic Email, or <a href="http://sendgrid.com/">Sendgrid</a>. For most use cases they’re free, and we can set this up for you.</em></p>
<h3>6. Set up integrations</h3>
<p>As above, Formie supports lots of integrations. Your web team will need to help you set up the integrations initially. Once this is done, you’ll see any available integrations listed in the <code>Integrations</code> tab and it’s easy for you to add them to your form. Just click on the integration name, turn on the <code>Enabled</code> toggle and fill out the relevant fields.</p>
<figure><img src="https://optimise2.assets-servd.host/good-work/production/blog/2022-07-19-how-to-use-forms-on-your-craft-cms-website/formie-blog-post-18.png?w=1536&h=1252&auto=compress%2Cformat&fit=crop&dm=1658239849&s=3954ea243c57dc86c5b9e227ac0fb5db" alt="" /></figure>
<p>A common use case is adding users who submit a form to a Mailchimp list. Here we’ve selected which list to add them to and mapped which Mailchimp fields (on the left) should receive the data from which form fields (on the right).</p>
<h3>7. Prevent spam</h3>
<p>If you don’t have spam protection set up, you will get spam submissions that can clog up your inbox and make it hard to find legitimate submissions.</p>
<figure><img src="https://optimise2.assets-servd.host/good-work/production/blog/2022-07-19-how-to-use-forms-on-your-craft-cms-website/formie-blog-post-19.png?w=1536&h=1252&auto=compress%2Cformat&fit=crop&dm=1658239864&s=157fd7c2283ae5f00e4f4a15b183faa6" alt="" /></figure>
<p>In the <code>Integrations</code> tab, you will see a “Captchas” heading. Any integrations available to you are listed here.* To enable one, just click on it and switch the <code>Enabled</code> light switch on.</p>
<p><strong><em>*Note:</em></strong><em> Your web team will need to initially configure spam protection for you. Basic solutions like Honeypot and Javascript only take a few minutes to set up. More complex solutions like Google’s reCAPTCHA take a little more work but are more robust.</em></p>
<h3>8. Last few settings</h3>
<figure><img src="https://optimise2.assets-servd.host/good-work/production/blog/2022-07-19-how-to-use-forms-on-your-craft-cms-website/formie-blog-post-20.png?w=1536&h=1252&auto=compress%2Cformat&fit=crop&dm=1658239879&s=c58e1778f65fb922f9450a69361e14ae" alt="" /></figure>
<p>In the <code>Settings</code> tab, it’s good to change the <code>Submission Title Format</code> to something more readable than the default “Timestamp.” Again Formie lets you add variables such as the form title and submission date to make this easy.</p>
<h3>9. Save and publish the form</h3>
<p>Now you’ve finished setting up your form, click <code>Save</code> in the top right.</p>
<p>The final step is to actually display the form somewhere. Forms can appear anywhere, e.g. you might have a <code>Global</code> set up for your site footer which could contain a newsletter signup form.</p>
<p>Let’s assume that you want to add a contact form to your contact page. Open up the contact form entry. Your web team should have set up a <code>Form</code> field. Click on this and select the form you just created. Save the entry. Done!*</p>
<p><strong><em>*Pro tip:</em></strong><em> It’s wise to save the entry as a draft first, preview it, and fill out the form to check it’s working as expected, including sending notifications.</em></p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>3 Tips to Improving Your Website (Without Starting Over)</title>
                <link>https://simplygoodwork.com/blog/3-tips-to-improving-your-website-without-starting-over</link>
                <pubDate>Tue, 19 Jul 2022 12:01:00 -0500</pubDate>
                <author>Garrett Winder</author>
                <guid>https://simplygoodwork.com/blog/3-tips-to-improving-your-website-without-starting-over</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/goodwork-3tipstoimprove.png?w=1600&amp;h=900&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1667239239&amp;s=c85185e9cdb146f7409d43cabc304587" alt="3 tips to improve your website without starting over">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>It used to be that a website was a static repository of anything and everything a company wanted to say about itself and its products or services. There was a set it and forget it mentality, with most updates being simply copy additions. After a while it would become clear that a change was needed, leading to a complete overhaul.<br /></p>
<p dir="ltr">But modern websites operate more like a living, breathing part of your sales and marketing ecosystem, which means they need to be given regular love and attention to ensure optimal performance and relevancy. The upside to this continuous nurturing is that you can make significant changes and improvements to your website – without starting over.<br /></p>
<h2>Tip #1: Continuous Improvements vs. Website Redesigns</h2>
<h3>Design with the Future in Mind</h3>
<p dir="ltr">When you create a website with a future-proof design system and architecture, it will expand and grow with your business without falling apart every few years. By designing with the future in mind using a systematic approach, you are set up to win in the long term.<br /></p>
<h3>Build a Support Team</h3>
<p dir="ltr">Once your site launches, you want to keep your design, development, and marketing teams in close contact. Your business is ever-changing. The way customers use your site evolves, as does how you stay relevant in a digital space. To get the most value out of your website and remain relevant, you need to continually nurture your site after it goes live. You can use your existing team(s), or look to a business like <a href="https://simplygoodwork.com/services">Good Work that specializes in post-launch aftercare and long-term partnerships</a>.<br /></p>
<h3 dir="ltr">Examples of Continuous Improvements</h3>
<p dir="ltr">There are countless small updates that can be made through continuous improvements to your site. Some of the most common that we see (and recommend) include:</p>
<ul><li dir="ltr"><p dir="ltr">Plugin updates</p></li><li dir="ltr"><p dir="ltr">Copy updates</p></li><li dir="ltr"><p dir="ltr">Landing pages for current initiatives</p></li><li dir="ltr"><p dir="ltr">Design updates based on usage</p></li><li dir="ltr"><p dir="ltr">Provide new value (e.g., blog, resources, newsletter sign-up)</p></li></ul>
<p dir="ltr">At the end of the day, these updates should meet one of two goals. They should either make your site more relevant to the current state of your business, OR better support your marketing and sales efforts.<br /></p>
<h2 dir="ltr">Tip #2: Keep Craft Updated</h2>
<p dir="ltr">This might sound overly simple, but the importance of keeping your content management system (CMS) updated can’t be overstated.</p>
<p dir="ltr">Just because a new version is coming out doesn’t mean that you have to immediately make the switch. But remember that if you hold off through multiple versions, updating can become a major project.</p>
<p dir="ltr">Last year, we worked on updating a site for a client who had waited entirely too long to take action (think: months or years). Because of this, the scope of the project was much bigger than they anticipated and almost felt like starting over.<br /></p>
<h3 dir="ltr">Updating to Craft 4</h3>
<p dir="ltr">At the time of writing this, we are building sites on Craft 3. But after an initial beta launch, <a href="https://craftcms.com/blog/craft-4">Craft 4 was released this year</a>. This means we will be moving new builds to this platform and <a href="https://simplygoodwork.com/services">working with our maintenance clients</a> to discuss upgrades over the next few months.</p>
<p dir="ltr">While many updates are relatively simple, the update from Craft 3 to Craft 4 is a big one. For example, all 3rd party plugins need to be updated first. Sounds simple at first, but remember that sometimes plugins get abandoned. This means that just clicking “update” isn’t possible and you need to figure out an alternative upgrade path.</p>
<p dir="ltr">Whether you DIY or enlist the help of a web development team like Good Work, keeping your CMS updated in a timely fashion is key.<br /></p>
<h2 dir="ltr">Tip #3: Schedule Regular Website Audits</h2>
<p dir="ltr">When your website continually evolves and you’re doing regular updates to your CMS, you have to check in and ensure that everything is working in the background as it’s supposed to. In the fast-paced environment that is digital, regularly scheduled website audits are required to have a seat at the table.<br /></p>
<h3 dir="ltr">How Often Should Audits Occur?</h3>
<p dir="ltr">At a minimum, standard marketing websites should have an audit every 4-6 months, while websites that have a constant stream of new content and updates might need audits every month. <br /></p>
<h3 dir="ltr">What Are the Most Important Things to Audit?</h3>
<p dir="ltr">There is no one-size fits all answer to this, but website audits come in a variety of shapes and sizes. The ones we find most useful are geared toward (1) Accessibility, (2) Technical SEO and Speed, and (3) Design.</p>
<p dir="ltr">Testing the right blend of infrastructure updates, website audits, and continuous improvements is viable in ensuring our website brings the most value to our business at any given time. </p>
<h4>Accessibility</h4>
<p dir="ltr">Evaluating accessibility is not just an optional, nice-to-have aspect of your website. It is important to ensure that all potential users – including those with disabilities – have a decent user experience. But when you implement these accessibility best practices and ensure easy access to your information, you improve the usability for all site users. </p>
<p dir="ltr"><strong>DIY Accessibility Online Checkers We Recommend</strong>:</p>
<ul><li><a href="https://accessibe.com/">Accessibe</a></li><li><a href="https://wave.webaim.org">WAVE</a></li><li><a href="https://www.webaccessibility.com">Web Accessibility</a> by Level Access</li></ul>
<h4>Maintenance</h4>
<p dir="ltr">Site speed and SEO are two different things, but both play a significant role in how search engines like Google evaluate your site, and how they show up in search results.</p>
<p dir="ltr">Sometimes updates inadvertently slow down the site. Adding media is a common culprit to this.</p>
<p dir="ltr">Other times, it is inaction that can cause issues, in the case of things like broken links or meta information updates.</p>
<p dir="ltr"><strong>DIY Speed and SEO Tools We Recommend</strong>:</p>
<ul><li><a href="https://ahrefs.com">Ahrefs</a></li><li><a href="https://chrome.google.com/webstore/detail/lighthouse/blipmdconlkpinefehnmjammfjpmpbjk?hl=en">Google Lighthouse</a></li><li><a href="https://www.semrush.com/lp/sem-overview/en/?kw=sem+rush&amp;cmp=US_SRCH_Brand_Semrush_EN&amp;label=brand_semrush&amp;Network=g&amp;Device=c&amp;utm_content=523129198277&amp;kwid=kwd-12358836603&amp;cmpid=11915062068&amp;agpid=124220905837&amp;BU=Brand_Semrush&amp;extid=&amp;adpos=&amp;gclid=CjwKCAjwqauVBhBGEiwAXOepkQwTD6oZ5BD6Nah1S6Ba6VEARPg3ZO8n3-EmUCcVs57lg6tpZhnCZxoCFO0QAvD_BwE&amp;ex=1">SEMRUSH</a></li></ul><h4 dir="ltr">Design</h4>
<p dir="ltr">Finally, consider how design audits can play a role in improving your site. Your designer will often have suggestions on how to improve conversions without needing a total redo.</p>
<p dir="ltr">This is one area we recommend going straight to the professionals in the audit process. It is important to weigh the effort vs. outcomes in design work so that you don’t end up going down a rabbit trail that leaves your site pretty, but the update is neutral in terms of conversions.<br /></p>
<h2 dir="ltr">You Don’t Have to Go it Alone</h2>
<p dir="ltr">These three tips are a great way to implement continuous improvement to your website and can keep it fresh and relevant much longer without the need to start over.</p>
<p dir="ltr">But knowing what to do, and actually finding the time to do it are two different things. If you’re ready to hand the keys over to the experts, we’d love to help.</p>
<p dir="ltr">We offer <a href="https://simplygoodwork.com/services">maintenance plans</a> that provide relief. Have confidence you’ve got the support you need and get back to doing what you do best for your company.</p>
<p dir="ltr"><a href="https://simplygoodwork.com/contact">Schedule a call today</a>.<br /></p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>The 5 Tools We Use for Our Bulletproof Project Management Process</title>
                <link>https://simplygoodwork.com/blog/the-5-tools-we-use-for-our-bulletproof-project-management-process</link>
                <pubDate>Mon, 13 Jun 2022 09:50:00 -0500</pubDate>
                <author>Ariel Kidwell</author>
                <guid>https://simplygoodwork.com/blog/the-5-tools-we-use-for-our-bulletproof-project-management-process</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/goodwork-blog-projectmanagement.png?w=1600&amp;h=900&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666733508&amp;s=6c5b9080ee46945bebe16953a4401609" alt="The 5 Tools We Use for Our Bulletproof Project Management Process">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p dir="ltr" class="callout-blurb text-[1.075rem] leading-[27px] font-bold tracking-[.15px] md:text-[1.3375rem] md:tracking-[.25px] md:leading-[32px]">“Too often web development teams let you down. With Good Work, you can launch websites that wow, with a bullet-proof web development process you can trust.”</p>
<p dir="ltr">When we share about the tools that help us with project management, we’re not just sharing productivity hacks. We’re taking you behind the scenes to share a piece of the Good Work Way. Our project management process is one of the key differentiating factors of our agency.</p>
<p dir="ltr">With that said, here are the project management tools that keep our bullet-proof process running smoothly.</p>
<h2>Communication: Slack</h2>
<p dir="ltr">Like many companies, we prefer to put communication in Slack instead of email. This is the main hub of interaction throughout the day. We’ve had a <a href="https://simplygoodwork.com/blog/how-we-manage-a-remote-team-across-multiple-timezones">remote culture</a> before it was mandated by social realities, and this has helped us keep everyone on the same page with team-wide communication. </p>
<p dir="ltr">We use <strong>Slack Channels</strong> for individual projects, and also use <strong>Shared Channels</strong> for our retainer clients and big, high-touch projects. </p>
<p dir="ltr">The <strong>Huddle</strong> feature is great for quick chats that don’t require a full meeting, and for times when screen sharing is needed. In the developer world, that is an important feature.</p>
<p dir="ltr"><strong><em>Good Work Favorite Use</em></strong>: We are diligent to use the <strong>Schedule</strong> feature within Slack to respect boundaries and working hours. We ensure messages only show up for team members during work hours (most often that means at the beginning of the work day), regardless of time zone.</p>
<h2 dir="ltr">Scheduling / Resource Management: Forecast</h2>
<p dir="ltr">Forecast helps us understand how much capacity each person has, and when we can take on a new project as an agency. No tool is perfect, but it provides the most complete picture in a complicated system.</p>
<p dir="ltr">This provides the year-long roadmap for all of our projects, making it easy to plan our people and our finances. </p>
<p dir="ltr"><strong><em>Good Work Favorite Use</em></strong>: One of our favorite things about Forecast is the ability to shift projects if a client pivots. If deadlines aren’t met, we’re able to shift the entire timeline with the click of a button versus starting from scratch. This saves time on the front end, and reduces errors.</p>
<h2 dir="ltr">Project Management: Github Issues</h2>
<p dir="ltr">We started with Trello, but made the switch to Github Issues because it is geared specifically for developers. Github is where the code already lives, and so issues are tied directly to the work itself. This streamlines our work and process. We also love that clients can see all the historical data around their codebase. </p>
<p dir="ltr">Users can take advantage of either table-style organization or boards. Since we were previously on Trello, we are partial to the Kanban-style boards.</p>
<p dir="ltr"><strong><em>Good Work Favorite Use</em></strong>: Integrations! These allow us to tie cards to actual code, meaning it can update the board as things are ready for review and deployment. Keeps everything organized and easily accessible.</p>
<h2 dir="ltr">The Good Work Way: Notion</h2>
<p dir="ltr">The more Good Work grew, the more it became apparent that we needed a centralized “knowledge base” for both our process and our client's website details. We use Notion for all internal organization from process outlines to key details for every website and client we manage.</p>
<p dir="ltr">Basically, this is where all the secret sauce lives. We document everything so that if <a href="https://simplygoodwork.com/blog/a-personal-connection-and-bulletproof-project-management">Ariel</a> (or anyone on the team) was hit by a bus, someone else could step in and run things the Good Work Way.</p>
<p dir="ltr"><strong><em>Good Work Favorite Use</em></strong>: This has been a game-changer for onboarding new Good Workers. It’s a clean space to learn our process and reference our current clients while they get the lay of the land.</p>
<h2 dir="ltr">BONUS: Our People</h2>
<p dir="ltr">The tools that we use are great, but it’s also the thought process and the consistency in how we use them that brings it all together. We’ve spent over 8 years honing our project management system, and it’s something we take pretty seriously.</p>
<p dir="ltr">The most important part of any tool is actually using it well. Our team continues to bring new ideas and help us refine the process.</p>
<p dir="ltr">Our latest tool is actually just a Project Plan document. It’s a robust 8-tab spreadsheet that pulls it all together. We’ve shared some screenshots of the tool below to help you spark ideas for what would work best for <strong><em>your</em></strong> team.</p>
<figure><img src="https://optimise2.assets-servd.host/good-work/production/blog/5-Tools-Bulletproof-Project-Management/image1.png?w=828&h=749&auto=compress%2Cformat&fit=crop&dm=1655133480&s=80e9945abee6ee2b454f00c6a0832f54" alt="" /></figure>
<figure><img src="https://optimise2.assets-servd.host/good-work/production/blog/5-Tools-Bulletproof-Project-Management/image2.png?w=828&h=749&auto=compress%2Cformat&fit=crop&dm=1655133485&s=d1c6d7f77a39f36f6dca287c5eb88ad4" alt="" /></figure>
<figure><img src="https://optimise2.assets-servd.host/good-work/production/blog/5-Tools-Bulletproof-Project-Management/image3.png?w=828&h=749&auto=compress%2Cformat&fit=crop&dm=1655133486&s=1b7d152252ea40e0ae2636ef2852c772" alt="" /></figure>
<figure><img src="https://optimise2.assets-servd.host/good-work/production/blog/5-Tools-Bulletproof-Project-Management/image4.png?w=828&h=749&auto=compress%2Cformat&fit=crop&dm=1655133490&s=69df3f6c302bd43d2014a021f6964d0e" alt="" /></figure>
<figure><img src="https://optimise2.assets-servd.host/good-work/production/blog/5-Tools-Bulletproof-Project-Management/image5.png?w=828&h=749&auto=compress%2Cformat&fit=crop&dm=1655133493&s=c2b1d2b785e13f6648ce17515fa829ef" alt="" /></figure>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>A Personal Connection and Bulletproof Project Management</title>
                <link>https://simplygoodwork.com/blog/a-personal-connection-and-bulletproof-project-management</link>
                <pubDate>Mon, 25 Apr 2022 08:00:00 -0500</pubDate>
                <author>Katie Goldberg</author>
                <guid>https://simplygoodwork.com/blog/a-personal-connection-and-bulletproof-project-management</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/Ariel_GW_Blog.png?w=1152&amp;h=648&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666108577&amp;s=92ad1d761ee390640c02d75c9e6b87b9" alt="A personal connection and bulletproof project management">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>If you ask our clients about their experience with Ariel, you’ll get a flood of glowing reviews. As the one steering the ship for the client experience, she understands how pivotal her role is, and she always aims to over-deliver.</p>
<p>But this doesn’t necessarily mean extravagant measures. ​“I’ve learned that the power of a response is HUGE,” she says. ​“The simple act of being a responsive partner makes a big difference to our clients.”</p>
<p>This is part of ​“the Good Work Way” that has become the cornerstone of what makes Good Work such a unique web development company. A bulletproof project management process, with a personal connection at the center.</p>
<p>“It’s amazing how much people just want to be seen and heard. And if you can make just one thing easier in their day, it can change everything. We work with a variety of people who are responsible for things they are not experts in. And we get to make them look good in the process.”</p>
<h2>Rooted in Non-Profit Marketing</h2>
<p>Ariel came about that passion and vision for an exceptional client experience honestly. She started her career in nonprofit marketing, as the client. During this season, she worked for some of the best in the area when it comes to public-private partnerships. She got to see downtown Dallas come into its own and become a thriving economic center.</p>
<p>She thought she would be in nonprofit marketing forever, except that a friend saw a knack for organization and encouraged her to consider trying her hand at project management. She dabbled in agency life for about a year, but ultimately didn’t find the right fit. She went back to what she knew.</p>
<p>As much as she loved her new role, and being back in familiar territory, she also missed project management. ​“I loved the thought of waking up to different projects each day. And I was at the point in my career where I had to either take the leap, or let that door close.”</p>
<p>Lucky for us, she took the leap.</p>
<p>The power of networking and relationship-building paid off. As a client, Ariel had worked with Switch, who frequently partnered with Good Work on web development projects. <a href="https://simplygoodwork.com/blog/when-good-is-actually-exceptional">Garrett</a> got wind that Ariel was looking for project management work, and the rest – as they say – is history.</p>
<h2>Defining ​“The Good Work Way”</h2>
<p>Soon after Ariel joined Good Work, she had the opportunity to go through a Digital PM and Ops apprenticeship with <a href="https://louderthanten.com/why/case-studies/good-work">Louder Than Ten</a>. It was a relatively new program at the time, providing extensive hands-on training for digital project managers and agency owners.</p>
<p>“Garrett basically opened the conversation with, ​‘It’s going to be a lot of work, want to do it?’” she jokes. ​“But then he showed me he was serious about the investment by doing it with me. He said we could create a brain trust to implement something real and lasting.”</p>
<p>It was a crazy six months to hear her talk about it, filled with more coffee than she cares to admit. They were balancing online classes, client calls, and putting out the fires that inevitably pop up in this line of work. But thanks to some solid trial and error, they were able to implement the learnings in real-time, and within a year put together the foundational process that Good Work still uses today.</p>
<p>“We set the expectation for reasonable response times. Honestly, we are working with people who are in a vulnerable place [because they are not experts in what we do] and we make good on our promises. That is a big deal, and leads to deep trust.”</p>
<p>With that trust often comes long-term work, which is what gets Ariel most excited. These retainer clients are where the real relationships are built, and allow the strategic insights of the Good Work team to really shine.</p>
<h2>Offline and Outdoors</h2>
<p>While Ariel is quick to gush about the specifics of project management, she is quick to admit that talking about her personal life doesn’t come as easily. But a few pointed questions helped to uncover the passion and spark that keeps her going.</p>
<p>Like many Good Work-ers, Ariel spends her time away from the office outside. She and her husband Joe are outdoor enthusiasts. They can often be found walking around White Rock Lake or on a golf course. Sustaining outdoor spaces in Dallas is important to them, and Joe is even on the board of the White Rock Lake Foundation.</p>
<p>Joe and Ariel also own property in the French Quarter of New Orleans, and thanks in part to the culture of flexibility at Good Work, they spend as much time there as possible. They bring the same passion for preservation to The Big Easy, and love that they can help sustain a piece of the history and culture in the area.</p>
<p>With a job that is as dynamic and focused on others as client-forward project management, a robust stress management practice is not optional. In addition to pilates and golf, Ariel is a big believer in mindfulness, which she credits to keeping her from overreacting, and instead allows her to remain responsive and balanced.</p>
<p>After all, it is the responsiveness and personal connection built on trust that is the foundation of the bulletproof project management process. Good Work has people who are obsessed with the process, and believe that the process is just as important as the end result.</p>
<p><em>With over 15 years of experience in integrated marketing and project management for everything from tiny nonprofits to global agencies, Ariel understands our client’s needs because she has been in their shoes. She’s a graduate of the Louder Than Ten Project Management Apprenticeship, which basically makes her a black belt in project success. She oversees our project process from start to finish and ensures every client gets the Good Work experience they’re promised. Somehow she also finds time to </em><a href="https://simplygoodwork.com/blog/top-10-project-management-tips-web-development-projects"><em>write for our blog</em></a><em>. Outside of work, you can find her sitting in a courtyard somewhere in New Orleans where she lives part-time, or working on her slice on the golf course.</em></p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>How we manage a remote team across multiple timezones</title>
                <link>https://simplygoodwork.com/blog/how-we-manage-a-remote-team-across-multiple-timezones</link>
                <pubDate>Wed, 06 Apr 2022 08:00:00 -0500</pubDate>
                <author>Ariel Kidwell</author>
                <guid>https://simplygoodwork.com/blog/how-we-manage-a-remote-team-across-multiple-timezones</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/goodwork-article-image-remotework2.jpg?w=1600&amp;h=900&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666733534&amp;s=bc86e1196929e28c8f02a6fec8c59125" alt="How we manage a remote team across multiple timezones">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>Having team members scattered across the world is no longer an anomaly whether you’re a team of ten or ten thousand. Our small team of 11 spans three countries and four time zones, but we still feel connected - without feeling like we work around the clock. It isn’t easy, but it’s far from impossible.</p>
<p>This wouldn’t be possible without our communication tools:</p>
<ul>
 
 <li>Slack for casual conversation and project discussion</li>
 <li>Github Issues for detailed project discussion</li>
 <li>Forecast for scheduling and milestone management</li>
</ul>
<p>Together, these three tools allow our team to hit the ground running each morning with a full toolbox. Here’s how we do it:</p>
<ul>
 <li>Ensure Forecast is up to date so everyone knows exactly what is on their plate.</li>
 <li>Create a scheduled Slack message to be sent at 9 am local time to outline priorities for the day, ask any questions and provide feedback. The scheduling tool in Slack is key to ensuring we aren’t pinging our overseas team during their evening and interrupting their downtime.</li>
 <li>Use Github Issues to outline scope, provide necessary files and documentation, and deliver client feedback.</li>
 <li>We have a daily standup that’s the start of our United States team morning and end of our overseas team day, allowing for comradery, handovers, and project updates while not interrupting flow time.</li>
</ul>
<p>While this process works well for the daily flow, scheduling meetings with clients is a unique challenge. About a third of our team is 6+ hours ahead of the United States at any given time of the year. We encourage our development team to interact with our clients, whether it’s a project milestone meeting or retainer planning call, but aligning a Pacific Standard Time client with a Greenwich Mean Time developer is tricky.</p>
<p>We customize the solution to the situation, but we usually defer to one of these scenarios:</p>
<ul>
 <li>We offer our developer a late start to their morning in exchange for them working later to accommodate the time difference.</li>
 <li>We schedule our meetings as early in advance as possible when we know there is a large time zone gap in hopes of finding a happy compromise between both teams.</li>
 <li>We outline “preferred time windows” for meetings involving our overseas team that are fair to both parties and ensure we aren’t encroaching on our developer’s evening.</li>
</ul>
<p>One of our core values is proactive communication, and this is one of the ways we live that out. When both our developers and clients know what to expect, conversations around compromise are much easier.</p>
<p>We would be lying if we told you everyone worked a perfect 9-5 pm schedule every day across multiple time zones. That isn’t possible when you’re keeping as many projects a month afloat as we are. What is possible is ensuring open communication so the team can work together to make it as easy as possible for everyone involved.</p>
<p>Our project management team tends to start early (sometimes very early) to create as much overlap as possible with the overseas team for internal huddles, reviews, etc. Our development team sometimes has to work into their evening to accommodate a kickoff meeting or client meeting.</p>
<p>A key aspect of our culture is taking care of our people. So we make up for those accommodations people make by showing our appreciation - not only verbally but also through flexible schedules and additional vacation time. The goal is to show respect and appreciation for everyone - regardless of time zone - to make Good Work a place where people want to be.</p>
<p>(This article was originally posted on <a href="https://www.linkedin.com/feed/update/urn:li:ugcPost:6907799551101812736?updateEntityUrn=urn%3Ali%3Afs_updateV2%3A%28urn%3Ali%3AugcPost%3A6907799551101812736%2CFEED_DETAIL%2CEMPTY%2CDEFAULT%2Cfalse%29">LinkedIn</a>.)</p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>Optimizing your website’s speed</title>
                <link>https://simplygoodwork.com/blog/optimizing-website-speed</link>
                <pubDate>Fri, 18 Mar 2022 08:00:00 -0500</pubDate>
                <author>Andrew Menich</author>
                <guid>https://simplygoodwork.com/blog/optimizing-website-speed</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/goodwork-article-image-websitespeed2.jpg?w=1600&amp;h=900&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666733558&amp;s=f09067c2bab1d364fdae6a8a266912d6" alt="Optimizing your website’s speed">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>Websites are a lot like cars - if you take them into the shop for routine maintenance, they will last you a long time. Sometimes your car, like my trusty Honda Civic, runs like a champ, and you end up driving it for 15,000 miles before realizing you’re due for an oil change. It’s easy to let your website fall into this category of “if it's not broke, don’t fix it.” While your website can’t get a flat tire, it can sometimes start to slow down or feel sluggish, so let’s take it into the shop and see what we can do to bring it back to peak performance.</p>
<p>Does your entire website feel slow, or is it just slow on certain pages? Answering this question can help diagnose the problem and point to potential solutions. If it only feels slow when going to specific pages on your site, there’s likely something on that page that’s causing it to bog down. Maybe it’s the homepage with a flashy background video or many high-resolution product photos. Perhaps it’s a resource page with lots of filters and sorting options. Whatever the case may be, identifying that the problem is localized to specific pages is valuable information before getting it fixed.</p>
<h2>Only some of the pages on my site are slow</h2>
<p>Here are some of the common causes and potential solutions when only some of the pages on your website are slow.</p>
<h3>Images</h3>
<p>Images are one of the first places we look when doing a performance audit on a website. This is because they violate two of the core tenants of web performance: reducing the number of requests your site makes and reducing the size of said requests. On most sites, images are plentiful (i.e. generate lots of network requests) and they are large in file size. Fortunately, there are a lot of ways to reduce the impact that images may be having on your website:</p>
<ul>
 <li>Compress images to reduce file size. This can be done online with tools like <a href="https://squoosh.app/" target="_blank" rel="noreferrer noopener">Squoosh</a> or <a href="https://tinyjpg.com/" target="_blank" rel="noreferrer noopener">TinyJPG</a>.</li>
 <li>Use modern formats like WebP and AVIF. These modern formats are made specifically for the web and deliver your photos at near-lossless compression for significantly less bandwidth than a traditional JPG or PNG format.</li>
 <li>Serve responsive images. This optimization is particularly beneficial to mobile users who are often on a slower cellular network as it serves a smaller image intended specifically for mobile devices.</li>
 <li>Lazy load images where appropriate. Lazyloading waits until the image is about to be in view for the user before it makes the network request to download the image. This can make a big difference if your site has a lot of images.</li>
</ul>
<p>Some all-in-one solutions to the suggestions above include platforms like <a href="https://cloudinary.com/" target="_blank" rel="noreferrer noopener">Cloudinary</a> and <a href="https://imgix.com/" target="_blank" rel="noreferrer noopener">imgix</a>, both of which have a generous free tier to get started with. If you’re using Craft CMS, plugins like <a href="https://plugins.craftcms.com/image-optimize" target="_blank" rel="noreferrer noopener">ImageOptimize</a> take a lot of the guesswork out of generating and serving more efficient images.</p>
<h3>Background Videos</h3>
<p>Background videos at the top of a web page are a common design element and can look really impressive, but they come at a cost. They slow down the initial page load, can distract users from your actual content, and can also have negative impacts on your site's accessibility. The general consensus is that they probably aren't worth it, so consider removing them entirely. If you’d prefer to keep one, consider these adjustments to keep its performance impact to a minimum:</p>
<ul>
 <li>Compress the video as much as possible while maintaining reasonable quality (the smaller the file size, the better the performance)</li>
 <li>Use a static image on mobile devices and keep the videos just for desktop users. Even the smallest videos are much larger in file size than a properly sized image and that can really slow down your site for visitors on a mobile network</li>
</ul>
<h3>Complex Logic / Filters + Sort Options</h3>
<p>When we get reports of individual pages being slower, it is commonly on those that include large collections of data along with options to sort and filter that data. This includes pages like a blog/news landing page, a product gallery page, and so on.</p>
<p>Typically it's not the sorting/filtering options themselves that slow things down but rather misconfigured or inefficient template logic handling all of the data. It might have worked great when the site first launched and there was less data to handle. Now that it's matured and there are hundreds or even thousands of records to sort/filter, the underlying queries and template logic probably need to be reworked.</p>
<p>If you're using Craft CMS, one of the first places to start in optimizing pages like this is to use <a href="https://craftcms.com/docs/3.x/dev/eager-loading-elements.html" target="_blank" rel="noreferrer noopener">eager-loading</a>.</p>
<h3>Embeds / iFrames</h3>
<p>Embedded content exists in some form on just about every website. Typically it is used to add videos, maps, or content from other sites. While convenient, it also adds additional network requests that can slow a page down.</p>
<p>Most of the time these resources are not needed right away, so one solution to mitigate slow performance is to lazyload the embedded content. Lazyloading images works the same way it does for images as it simply waits until the embedded content is in view before downloading the resources required.</p>
<p>Another potential solution is to use facades. While facades are not practical in every circumstance, they can be a great option for the usual embed suspects like YouTube videos or Google Maps. Facades look just like a regular embed without the overhead. An example would be replacing a Google Maps embed with a static image of a map that when clicked, links to the Google Maps page itself with the appropriate coordinates. Tools like the official <a href="https://developers.google.com/maps/documentation/maps-static/overview" target="_blank" rel="noreferrer noopener">Maps Static API</a> or <a href="https://staticmapmaker.com/google/" target="_blank" rel="noreferrer noopener">this website</a> make it accurate and easy. For YouTube or Vimeo video embeds, consider using the <a href="https://github.com/paulirish/lite-youtube-embed" target="_blank" rel="noreferrer noopener">lite-youtube-embed</a> or <a href="https://github.com/luwes/lite-vimeo-embed" target="_blank" rel="noreferrer noopener">lite-vimeo-embed</a> packages. They look and behave just like the regular embeds, but are significantly faster.</p>
<h2>Nice try, but my whole site feels slow!</h2>
<p>If it feels like your whole site is not performing as it should, we should examine what resources and other data are being loaded on each page. Let's take a look at some of the most common causes and potential solutions for site-wide slowness. Typically, every page will load some amount of JavaScript, CSS, and fonts. All of these resources are capable of causing significant slowdowns to your site, so it's worth doing an audit to see what resources are being loaded, how they're being used, and if any can be eliminated.</p>
<h3>CSS</h3>
<p>For CSS stylesheets, purging unused styles and minifying the stylesheet is a good place to start. Shipping critical CSS first and deferring the rest of the stylesheet can have big performance benefits, but can be tricky to set up.</p>
<h3>JavaScript</h3>
<p>Optimizing JavaScript (JS) is largely similar. The goal is to remove any unused or unnecessary JS, load only the JS that is absolutely necessary for your site to function when it first loads, and then load additional JS as needed. Front-end build tools like webpack, Parcel, Rollup, and Vite all have the ability to code-split or dynamically import the code that is not essential right away.</p>
<h3>Fonts</h3>
<p>The biggest trap to avoid is loading too many fonts. Limiting your site to 2 or 3 custom fonts is good practice. Next, adding rel="preload" attribute to the tag where your font is requested will help it load earlier in the cycle. The font-display: swap property in your stylesheets @font-face declaration will ensure that the text on your site is present even if your custom font has not loaded yet. Lastly, having an efficient caching policy for the font files can be a huge boon for performance.</p>
<h3>Icon Fonts</h3>
<p>Icon font libraries like Font Awesome are convenient but can be costly from a performance perspective. Consider replacing these libraries with individual SVG icons for both improved rendering and faster page load speeds.</p>
<h3>Navigations / Other Global Site Elements</h3>
<p>Another place to look in the quest for optimal performance is the areas of your site that are the same on each page. This includes the header, often containing your site's navigation, and your footer, which sometimes includes a sitemap or similar list of content. Multi-level meganavs are common, especially on enterprise sites. It is crucial that these are set up properly. Just like the pages that have complicated logic or filtering options, it is easy for navigations to grow larger over time, eventually resulting in slow load times everywhere on your site. Ensuring that the template logic and underlying database queries are optimized will minimize performance issues.</p>
<h3>Caching</h3>
<p>Areas of your templates like the header that get loaded on each page are often good candidates for caching. I have intentionally avoided the topic of caching until now because it is often used inappropriately to mask the issues described above. Instead, I like to think of caching as the cherry on top – it's nice to have and fun to eat, but the ice cream sundae underneath wouldn't be ruined without it. Caching comes with its own tradeoffs and should be used with the mindset that the cache could be cleared at any moment. All that being said, it can make a huge difference in the performance of your site, especially in areas or sections that do not change frequently.</p>
<h3>Tracking Scripts</h3>
<p>Tracking scripts like Google Analytics, Facebook Pixel, and Hotjar can be detrimental to your site's performance. That's not to say that you shouldn't use them – responsibly-collected data about your website's traffic and users is totally valid – but you should proceed with caution. Having too many tracking scripts is not only redundant, as many do essentially the same thing, but also costly for the end-user. It's good practice to do a regular audit to see what analytics tools your team is actually using and remove the ones that are no longer being used. New tools like <a href="https://github.com/BuilderIO/partytown" target="_blank" rel="noreferrer noopener">Partytown</a> and <a href="https://blog.cloudflare.com/zaraz-use-workers-to-make-third-party-tools-secure-and-fast/" target="_blank" rel="noreferrer noopener">Zaraz</a> can mitigate the performance impacts of third-party tracking scripts by using web workers to run the scripts in a different thread.</p>
<h3>Managing long-running processes</h3>
<p>If the backend of your website has any kind of long-running task such as a report generator or product import, make sure that these tasks are not inhibiting the experience for front-end users. A common way to do this is to run tasks like this in a queue – a background process that only runs when the system has available resources. Depending on your situation, you could even offload these resource-intensive tasks to a serverless function or web worker.</p>
<h3>Web Server / Hosting</h3>
<p>One last piece of the puzzle is the infrastructure that hosts your site. Small sites can often get away with small servers, but as your site grows in size and popularity, it might be time to consider upgrading the server. Larger servers can handle more resource-intensive scripts/functionality and can also handle larger amounts of traffic.</p>
<h2>In Summary</h2>
<p>When it comes to optimizing your website’s speed, there are a lot of factors and no single solution. Fortunately, almost all of these factors adhere to the principle of reducing the number and size of requests made by your website. Reduce the number and size of requests your website makes using the strategies above and you will be well on your way to a fast website.</p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>Creating a Culture of Balance</title>
                <link>https://simplygoodwork.com/blog/creating-a-culture-of-balance</link>
                <pubDate>Mon, 28 Feb 2022 08:00:00 -0600</pubDate>
                <author>Garrett Winder</author>
                <guid>https://simplygoodwork.com/blog/creating-a-culture-of-balance</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/creating-a-culture-of-balance.jpg?w=1600&amp;h=900&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666733579&amp;s=f04af101f1abd00c3022cb21f7feaf06" alt="Creating a culture of balance">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <blockquote>
 <p>“I believe if you do good, quality work, communicate well and invest in an environment that people want to be a part of, all the rest will fall into place.”</p>
</blockquote>
<p>That’s the last sentence in “<a href="https://simplygoodwork.com/blog/an-introduction-to-good-work">An introduction to Good Work</a>”, a blog post I wrote about eight years ago, only a few months after making the jump to full-time self-employment.</p>
<p>At that point I was the sole web developer, and also admin, sales, project management, and accounting. I hadn’t seen it play out at all in the real world, it was just a visionary statement.</p>
<p>If I were given a second chance at that sentence, I think most of it is still true, but I’d simplify it even more:</p>
<blockquote>
 <p>“If you invest in an environment that people want to be a part of, all the rest will fall into place.”</p>
</blockquote>
<p>Over the years as we’ve grown to two, to four, to eight, to ten and more full time employees we haven’t given an inch to our culture. We haven’t stopped making sure that Good Work is a place where our employees, clients, and partners all want to belong.</p>
<p>Jumping into the digital service business is easy. Doing it while keeping reasonable hours, a healthy profit, a happy team, and continual growth without being labeled as “just another web development company” is hard.</p>
<p>We’ve done this for eight years.</p>
<p>We have a happy team.<br />
People rarely leave.<br />
We close our laptops before dinner.<br />
We continue to grow.<br />
We approach conflict head on.<br />
Our clients love us.<br />
We charge for our time.<br />
We launch projects when we say we will.<br /><em>
We’re funny!</em></p>
<p>Maybe I’m oversimplifying it, but I think that’s why it works so well. Advice doesn’t have to be complicated to change everything.</p>
<p>Here are ten examples of how we have intentionally invested in an environment that people want to be a part of and created a culture of balance:</p>
<ol>
 <li><strong>Work-life balance.</strong> Family needs and emergencies always come first.</li>
 <li>We couldn’t be (or do) Good Work without our team, so any chance we get to <strong>reward our people</strong> - we do it.</li>
 <li>We’re serious about work but we’re also <strong>serious about keeping it light</strong>. We spend a lot of time together so it needs to be enjoyable.</li>
 <li>We onboard clients with a <strong>clear understanding of our boundaries and schedule</strong> - and they all respect it.</li>
 <li><strong>We hire smart.</strong> We find people who not only don’t need to be micromanaged, but actually work better when given some autonomy.</li>
 <li>Everyone on our team has <strong>cool hobbies outside of work</strong>. We work to live and we don’t work during living time.</li>
 <li><strong>Location flexibility.</strong> If you can figure out how to work from a van in the woods, you can (it’s been done… twice).</li>
 <li><strong>We don’t send messages outside of work hours.</strong> If we do, we schedule them (Both Google and Slack allow for this).</li>
 <li><strong>Bullet-proof processes.</strong> We can foresee bumpy patches and create a solution that smooths the path before we get there.</li>
 <li><strong>Loyalty.</strong> We will walk into a fire for our employees and always have their back.</li>
</ol>
<p>It turns out that when you invest in an environment that people want to be part of, they work hard to maintain that culture with you. And that takes it from merely an optimistic vision to a lived out reality years down the road.</p>
<p>(This article was originally posted on <a href="https://www.linkedin.com/feed/update/urn:li:ugcPost:6900453398940827648?updateEntityUrn=urn%3Ali%3Afs_updateV2%3A%28urn%3Ali%3AugcPost%3A6900453398940827648%2CFEED_DETAIL%2CEMPTY%2CDEFAULT%2Cfalse%29">LinkedIn</a>.)</p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>WordPress vs Craft CMS: which should you choose?</title>
                <link>https://simplygoodwork.com/blog/should-you-choose-craft-cms-or-wordpress</link>
                <pubDate>Mon, 14 Feb 2022 08:00:00 -0600</pubDate>
                <author>Garrett Winder</author>
                <guid>https://simplygoodwork.com/blog/should-you-choose-craft-cms-or-wordpress</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/craft-cms-vs-wordpress.jpg?w=1600&amp;h=900&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666733608&amp;s=a8a2054576a76c544090055a721fa630" alt="Should you choose Craft CMS or WordPress?">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>Content management systems (CMSs) allow you to create, edit and manage pages and content on your website with little need for ongoing development support. There are hundreds of CMSs available to you, but this article will focus on the two that we talk to clients the most about: WordPress and Craft.</p>
<p>WordPress was one of the first CMSs. Initially, pre built as a blogging platform, it has evolved into a more traditional content management system over the last 20 years. With the all-inclusive evolution, the open source interface is known to feel clunky. But it’s free!</p>
<p>Craft solves common content management pain points out of the box without requiring complex workarounds or too many third-party plugins. It’s built for modern websites to be what you need and nothing more. Craft costs $299 upfront and then $59 per year after that. Craft shines in its ability to power custom websites with unique content needs and relationships.</p>
<p>Good Work is a Craft shop. We've been working with Craft since day one, we're a <a href="https://craftcms.com/partners/simplygoodwork" target="_blank" rel="noreferrer noopener">verified partner</a>, and it's the CMS platform we use to make 99.9% of our websites.</p>
<p>BUT... unless you’re coming to us with a preexisting Craft website or did your research and already want to build your website in Craft, nine times out of ten, you're probably much more familiar with WordPress. This is especially true for our design agency clients who may be hesitant to go all-in on a system that they've heard little to nothing about.</p>
<p>The questions I get about WordPress vs Craft CMS usually fall into the following four categories:</p>
<ol>
<li>Ease of Use</li>
<li>Website Security</li>
<li>Search Engine Optimization</li>
<li>Development Community</li>
</ol>
<p>Let’s get to it. For the purpose of this article, I’m going to assume you’re familiar with WordPress and are looking to learn more about Craft to decide if it’s suitable for you.</p>
<h2>Craft vs. WordPress Ease of Use</h2>
<p>As I mentioned earlier, WordPress tends to be bulkier because of how much is included, whereas Craft will feel more intuitive because it’s built to be just what you need and nothing more. To demonstrate, I set up fresh installations of both systems.</p>
<figure><img src="https://simplygoodwork.com/uploads/blog/Should-you-choose-Craft-CMS-v.s.-Wordpress.001.png" alt="Craft CMS and WordPress admin panels side by side" /></figure>
<p>Along the left-hand navigation in Craft, there are seven choices: Entries, Globals, Categories, Assets, Users, Utilities, and Plugin Store. More often than not, a typical website by Good Work will only show four of these: Entries, Globals, Assets, and Users. (Compare that to 15 or so for WordPress.)</p>
<h3>Entries</h3>
<p>There are three different types of entries in Craft: Singles, Channels, and Structures.</p>
<p><strong>Singles</strong></p>
<p>Singles are for one-off pages like a homepage or about page, and while it's a minor feature, it's a crowd favorite. Historically, content managing one-off pages can be slightly awkward, but with Craft, it is intuitive.</p>
<p><strong>Channels</strong></p>
<p>Channels are for repeatable content like news, blog posts, or even an A-Z dictionary. It includes content ordered chronologically or alphabetically.</p>
<p><strong>Structures</strong></p>
<p>Structures are for repeatable content that you control the order. Think employees on a team page or a list of services on your service page. Once you wrap your head around this, it’s a huge selling point for Craft CMS.</p>
<h3>Globals</h3>
<p>Within Globals, you’ll find a place to store content used throughout the site, not just within a specific entry. Use Globals for content like phone numbers, company addresses, or social media links. </p>
<h3>Assets</h3>
<p>Assets are just that. A place where all the files (images, videos, PDFs, etc.), whether assigned to an entry or not, can be organized and easily located.</p>
<h3>Users</h3>
<p>Lastly, users. This is where you manage user permissions and settings for the different content editors on your website.</p>
<p>Finally, Craft’s Live Preview feature is second to none. Content editors need to see the effects of their content changes before going live, and live preview allows you to do just that, in real-time, directly from Craft’s control panel.</p>
<h2>Website Security</h2>
<p>Internet security issues are only increasing, and this is an area where Craft shines. WordPress websites are most often hacked due to vulnerabilities in plugins and themes. Since it’s the most widely used content management system, it is more known and targeted for hackers. WordPress accounts for 35% of the internet, but in 2018 it accounted for <a href="https://www.zdnet.com/article/wordpress-accounted-for-90-percent-of-all-hacked-cms-sites-in-2018/" target="_blank" rel="noreferrer noopener">90% of CMS hacks</a>. No matter what CMS you choose, keeping the CMS and plugins updated is essential. This is true to Craft as well, though Craft is far less targeted (see: 90,000 sites vs. 30 million sites), and Craft does not have themes, one of the two main vulnerabilities in WordPress.</p>
<p>For more information on Craft’s Security, you can read the Security Guides on their websites: <a href="https://craftcms.com/knowledge-base/security" target="_blank" rel="noreferrer noopener">https://craftcms.com/knowledge-base/security</a>.</p>
<h2>Search Engine Optimization</h2>
<p>While technical SEO mainly falls to the developer and is rarely CMS-related, Craft and WordPress both have good solutions for managing SEO content. If you’ve worked with WordPress before, then you’re familiar with Yoast. The Craft alternative to Yoast is called SEOmatic. Luckily for you, we’ve already written extensively on the subject in our <a href="https://simplygoodwork.com/blog/how-to-setup-an-seo-friendly-craft-cms-website">How to set up an SEO-friendly Craft CMS website</a> article.</p>
<h2>Development Community</h2>
<p>On the one hand, we have WordPress, the most widely used content management system on earth. There are over 30 million WordPress sites, and it powers over 35% of the internet. StackExchange, where developers ask other developers questions, has 165,000 WordPress members (developers). It's not hard to find WordPress development.</p>
<p>Roughly 90,000 websites use Craft, which is A LOT. It’s easy to find Craft developers, too. As of this writing, there are 9,700 StackExchange members (developers) and 225 verified Craft Partner Companies. Needless to say, if your Craft developer gets hit by a bus, your website will be okay.</p>
<p>Both Craft and WordPress are far from proprietary. They have a large enough user base that you’ll never need to worry about finding future development resources or getting stuck with a development company that you’re unhappy with.</p>
<p>Does Craft power 35% of the internet? No. But it has a large (and growing) development community and has been adopted by big names like PBS, Tito’s, Canon, and AP.</p>
<h2>In Summary</h2>
<p>If you’re trying to decide whether to go with Craft vs. WordPress, always consider your website goals. Both systems can handle Search Engine Optimization and have thriving development communities. But if you want a modern website that’s a joy to use and <em>much</em> less likely to get hacked, that’s Craft CMS every time.</p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>When “Good” is Actually Exceptional</title>
                <link>https://simplygoodwork.com/blog/when-good-is-actually-exceptional</link>
                <pubDate>Tue, 25 Jan 2022 10:00:00 -0600</pubDate>
                <author>Katie Goldberg</author>
                <guid>https://simplygoodwork.com/blog/when-good-is-actually-exceptional</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/good-work-ceo-garrett-winder.jpg?w=1600&amp;h=900&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666733635&amp;s=0a47d5091686f10315185cf7894998b9" alt="When “Good” is Actually Exceptional">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>In many ways, Garrett Winder is quite ordinary. He is humble and self-deprecating. At the end of the day, he’s just trying to do good work.</p>
<p>“We weren’t trying to do anything crazy,” he says about the company he and a buddy started while still in college, during the recession. “The timing was right, we were at a stage in life where we didn’t need much money. We simply got an office in downtown Abilene [Texas], and got to work.”</p>
<h3>Are We Good Enough?</h3>
<p>The company was doing fine, but there was a nagging sense that they didn’t really know what they were doing. So the pair decided to go out and get “real jobs.” For Garrett, that meant working with Erskine, a company based in England, where he worked on large content websites for entities like magazines, newspapers, and cities.</p>
<p>The role gave him a lot of autonomy to do what he needed to do to get the job done. He found himself able to dream of creative or new ways of doing things. And then his position quickly morphed into an operations role, where he got to flex his business muscles. He enjoyed learning new parts of the company and figuring out how to make things work.</p>
<p>This is where some of the big learnings happened.</p>
<h3>Reflections from an Established Agency</h3>
<p>“I thought I needed real-world experience, but it turns out we were doing the same things on our own as these big agencies. I also learned that it was ok if I didn’t do development all the time. I actually liked building and developing a company as much as I liked building and developing websites.”</p>
<p>Ultimately, Garrett learned that he wanted to try doing it on his own again.</p>
<p>His dad owned a business when Garrett and his siblings were growing up, and he always imprinted it on him that being a business owner was a feasible option. Garrett didn’t necessarily have big dreams of “disrupting the industry” that you hear so many entrepreneurs talk about. He wasn’t trying to start a new way of doing business. He just wanted to have something of his own.</p>
<h3>Becoming Good Work</h3>
<p>When a friend from college brought him a project that could last a couple of months, Garrett knew it was the right time. To help ease the transition for everyone, he stayed on with Erskine part-time to help with operations. What started as one man freelancing has grown into a full-blown company over time.</p>
<p>“First, I started outsourcing development projects. When that grew to more than I could do, I brought on <a href="https://simplygoodwork.com/blog/putting-the-puzzle-pieces-together">Chris</a> full-time. Then I realized I couldn’t handle the project management side of it and we brought on <a href="https://simplygoodwork.com/blog/a-personal-connection-and-bulletproof-project-management">Ariel</a>. When I couldn’t handle the sales side, we brought in Grant.</p>
<p>We have always been focused on having a good process and good communication. We know our dev work is exceptional, but that isn’t that unique in our business. What is unique is speaking human, leading with personality, and a partnership with clients built on honesty and transparency. Simply being a good person - and a whole person - is sometimes too rare.”</p>
<h3>The Good Life</h3>
<p>Garrett’s life takes on rhythms (and even a sense of monotony) that you might not associate with a man who founded a web development company right out of college. </p>
<p>Every day is the same breakfast. For those wondering, it’s 2 eggs, bacon, and a piece of toast. Along with a pot of coffee. The Chemex process is systematic and meticulous, and scratches an itch for order.</p>
<p>“Before kids, I was an avid runner. I might get 15 miles in before making it to the office. Now I’m lucky to get in a few 5-mile runs per week.”</p>
<p>As his family has grown, it’s the two little boys who do all the running, gently mocking the idea of order (as all kids do). But like most dads, Garrett’s face lights up when he talks about the boys. They are joy and inspiration and levity - and make his “retirement” from competitive running a little easier to handle.</p>
<p>The boys love going to parks or the Arboretum, but their favorite thing is when dad takes them to the family ranch outside of Fort Worth and they can see the cows. On the weekends you can often find them out there for a night or two, taking in nature.</p>
<p>Garrett actually spends one day each week at the ranch, acting as a ranch manager. He goes from running a website development business four days per week to going completely off the grid on a regular basis.</p>
<p>This time away from work and technology is some of what fuels him, and what makes him so passionate about having a culture of balance at Good Work. </p>
<p>“We have developers working around the globe, so it would be easy to have our developers working all hours of the day and night. But we really emphasize shutting down for the evening to be with friends or family. Get outside and experience nature. Let the work week be good enough. It’s important that we don’t take ourselves or our work too seriously.”</p>
<p>Garrett even joked about using the word “good” too much to describe what he does. But it is that continuation of doing the good work that makes him and this company so exceptional.</p>
<p><em>Garrett leads the day-to-day operations for our company and has a proven track record for leading high-quality, large-scale web projects for clients like PBS, Frito-Lay and DPR as well as Texas-based icons like Tito’s Handmade Vodka and Criquet Shirts. He has extensive experience in the digital client services environment but is also a successful entrepreneur, having co-founded a social analytics platform that was acquired in 2010. He received his Bachelors of Business Administration in Accounting from Abilene Christian University and lives in Dallas, Texas.</em></p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>A practical example of using the Donkeytail plugin with Tailwind and Alpine JS</title>
                <link>https://simplygoodwork.com/blog/a-practical-example-of-using-the-donkeytail-plugin-with-tailwind-and-alpine-js</link>
                <pubDate>Wed, 19 Jan 2022 08:00:00 -0600</pubDate>
                <author>Robin Mannering</author>
                <guid>https://simplygoodwork.com/blog/a-practical-example-of-using-the-donkeytail-plugin-with-tailwind-and-alpine-js</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/goodwork-article-image-donkeytail-2022.jpg?w=1600&amp;h=900&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666108700&amp;s=c0bc8174fc1106a81afac2c1aadbe427" alt="A practical example of using the Donkeytail plugin with Tailwind and Alpine JS">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <h3>Overview</h3>
<p>In this article we'll explore a practical example of using the Donkeytail plugin to display points of interest (pins) on an image of a lounge, highlighting the different pieces of furniture for sale and labelling the name of each item with a short description and price.</p>
<p>We'll use <strong>Tailwind</strong> to style each Donkeytail pin, and <strong>Alpine JS</strong> to provide some interactivity that will open and close each pin to reveal the name, description and price.<br /></p>
<p><em>For the sake of brevity we'll assume you already have a preferred method of integrating both Tailwind and Alpine JS into your Craft project.</em></p>
<p>Here's what we are creating...<br /></p>
<figure><iframe style="width:100%;height:400px;margin:0 auto;" src="//player.vimeo.com/video/657069378" frameborder="0"></iframe></figure>
</div>

                                            <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <h3>Installation<br /></h3>
<p>Let's begin by installing the Donkeytail plugin.</p>
<ul><li>Open your terminal and go to your Craft project:</li></ul>
</div>

                                            

            

<div class="block max-w-2xl mx-auto">
  <pre class="language-javascript">
    <code class="prism language-javascript">
      cd /path/to/project
    </code>
  </pre>
</div>

                                            <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <ul><li>Then we'll use Composer and Craft to install the Donkeytail plugin:</li></ul>
</div>

                                            

            

<div class="block max-w-2xl mx-auto">
  <pre class="language-javascript">
    <code class="prism language-javascript">
      composer require simplygoodwork/craft-donkeytail
    </code>
  </pre>
</div>

                                            

            

<div class="block max-w-2xl mx-auto">
  <pre class="language-javascript">
    <code class="prism language-javascript">
      php craft plugin/install craft-donkeytail
    </code>
  </pre>
</div>

                                            <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <h3>Create a new channel<br /></h3>
<p>Now that we've installed the Donkeytail plugin we can begin the initial Craft configuration.</p>
<p>As mentioned earlier, for each Donkeytail pin we'd like to display the following:</p>
<ul><li>furniture name</li><li>short description</li><li>price</li></ul>
<p>We'll begin by setting up a new channel section, leaving both the Entry URI Format and Template empty.</p>
<p><em>For now we’ll assume that you’re using Donkeytail in a single site installation, so please ignore the French site.</em></p>
<figure><img src="https://optimise2.assets-servd.host/good-work/production/blog/donkeytail-pins-section.png?w=1536&h=1431&auto=compress%2Cformat&fit=crop&dm=1655239039&s=c3e3dc2ff49f5f170bc4fb93531185b9" alt="Donkeytail Pins Channel Section" /></figure>


<p>We'll setup the Entry type as shown below: </p>
<ul><li>Short description is a plain text field</li><li>Price is a number field</li></ul>
<p><em>Set these up as desired using new fields, or reusing existing fields you have already defined.</em></p>
<figure><img src="https://simplygoodwork.com/uploads/blog/entry-type.png" alt="Entry Type" /></figure>
</div>

                                            <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <h3>Create a new field</h3>
<p>Let's set up a new field that we'll use for dropping Donkeytail into our Craft templates. Since a picture is worth a thousand words we'll use the image below as a guide for setting up this field.</p>
<p>The <em>Entry Sources</em> field is of most interest, and we'd like to select from the channel we've just created which is named <strong>Donkey Tail Pins</strong>.</p>
<figure><img src="https://simplygoodwork.com/uploads/blog/donkeytail-field.png" alt="Donkeytail Field" /></figure>
</div>

                                            <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <h3>Add the Donkeytail field into any existing page.</h3>
<p>We'll drop the newly created Donkeytail field into an existing page. In this example we'll add it to the homepage (which is a standard single section).</p>
<figure><img src="https://simplygoodwork.com/uploads/blog/homepage-section.png" alt="Homepage Section" /></figure>
</div>

                                            <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <h3>Add a canvas and your first pin.</h3>
<p>Grab an image from Unsplash, or your preferred stock image library, and add it to the Donkeytail field in your homepage.</p>
<p><em>In Craft 3.7.x you can also add your first pin while editing the homepage, but in earlier versions you may need to add a Donkeytail pin entry first, and then add it to your homepage Donkeytail field.</em></p>
<p>As you add each pin you'll see the pin placed directly in the center of the canvas. Use your mouse to drag and drop to the desired position. We positioned our first pin bottom left on the sofa as indicated below.<br /></p>
<figure><img src="https://simplygoodwork.com/uploads/blog/lounge-with-pin.jpeg" alt="Lounge with first pin" /></figure>
</div>

                                            <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <h3>And finally we can begin coding!<br /></h3>
<p>Now that we've wired everything up in Craft let's begin by dropping in the following code into the relevant template.</p>
</div>

                                            

                                          

<div class="block max-w-2xl mx-auto">
  <pre class="language-twig">
    <code class="prism language-twig">
      {% extends &#039;_layout&#039; %}

{% set donkeytail = entry.donkeytail %}
{% set donkeyTailCanvas = donkeytail.canvas ?? false %}

{% block content %}

  &lt;div class=&quot;container relative&quot;&gt;
    {% if donkeyTailCanvas %}

      {% do donkeyTailCanvas.setTransform({ width: 1024 }) %}
      {{ tag(&#039;img&#039;, {
        src: donkeyTailCanvas.url,
        width: donkeyTailCanvas.width,
        height: donkeyTailCanvas.height,
        srcset: donkeyTailCanvas.getSrcset([&#039;1.5x&#039;, &#039;2x&#039;, &#039;3x&#039;]),
        alt: &#039;Lounge&#039;,
        class: &#039;w-full&#039;
      }) }}

      {% for pin in donkeytail.pins %}

        {% set pinTitle = pin.element.title %}
        {% set pinShortDescription = pin.element.shortDescription %}
        {% set pinPrice = pin.element.price %}

        &lt;div class=&quot;absolute&quot;
            style=&quot;transform:translate(-50%, -50%);
                   top:{{ pin.y }}%;
                   left:{{ pin.x }}%;&quot;&gt;

          {# open svg #}
          &lt;svg width=&quot;40&quot; height=&quot;40&quot; viewBox=&quot;0 0 40 40&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
            &lt;circle cx=&quot;20&quot; cy=&quot;20&quot; r=&quot;18.75&quot; stroke=&quot;#ffffff&quot; stroke-width=&quot;2.5&quot;/&gt;
            &lt;path d=&quot;M20 10V30&quot; stroke=&quot;#ffffff&quot; stroke-width=&quot;2.5&quot;/&gt;
            &lt;path d=&quot;M10 20H30&quot; stroke=&quot;#ffffff&quot; stroke-width=&quot;2.5&quot;/&gt;
          &lt;/svg&gt;
        &lt;/div&gt;
      {% endfor %}

    {% endif %}
  &lt;/div&gt;

{% endblock %}
    </code>
  </pre>
</div>

                                            <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>The above code will take care of the basics:</p>
<ul><li>placing the Donkeytail canvas on the page</li><li>iterating each Donkeytail pin and placing an SVG in the appropriate position</li></ul>
<p>The <em>relative</em> class on the container div, and the nested <em>absolute</em> class, are of particular importance here in the successful positioning of the pins.</p>
<p>The style attribute for each pin contains a <em>transform</em> to re-center the SVG so that its center sits on the pin position defined by <em>top</em> and <em>left</em>. </p>
<figure><img src="https://simplygoodwork.com/uploads/blog/frontend-01.jpeg" alt="Screenshot 01" /></figure>
<p><br /></p>
<p>Directly after the absolutely positioned pin/svg, let's add what will become our popover containing the name, description and price of the item.</p>
</div>

                                            

                  

<div class="block max-w-2xl mx-auto">
  <pre class="language-twig">
    <code class="prism language-twig">
      &lt;div class=&quot;absolute z-20 bg-white p-6 w-72 shadow&quot;
      style=&quot;top:{{ pin.y }}%; left:{{ pin.x }}%;
            transform:translate(-50%, 60px);&quot;&gt;

  {# rotate white square to add a triangle #}
  &lt;div class=&quot;absolute bg-white z-10
              -top-5 h-10 w-10 transform rotate-45&quot;
      style=&quot;left: 7.75rem;&quot;&gt;
  &lt;/div&gt;

  &lt;div class=&quot;font-bold&quot;&gt;{{ pinTitle }}, {{ pinPrice}}USD&lt;/div&gt;
  &lt;div class=&quot;mt-1&quot;&gt;{{ pinShortDescription }}&lt;/div&gt;

&lt;/div&gt;
    </code>
  </pre>
</div>

                                            <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <figure><img src="https://simplygoodwork.com/uploads/blog/frontend-02.jpeg" alt="Screenshot 02" /></figure>
</div>

                                            <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <h3>Alpine JS to the rescue</h3>
<p>We don't want the popover displaying for all our pins, which could lead to a very cluttered image with a lot of the image hidden behind information.</p>
<p>Let's begin (amending the existing code) to add a little interactivity using a sprinkling of Alpine JS adding:</p>
<ul><li><code>x-data</code></li><li><code>x-show</code></li><li><code>x-on:click</code></li></ul>
<h4><br /></h4>
<h4>Step 1</h4>
<p>Everything in Alpine starts with the <code>x-data</code> directive.</p>
</div>

                                            

                  

<div class="block max-w-2xl mx-auto">
  <pre class="language-twig">
    <code class="prism language-twig">
      &lt;div x-data=&quot;{ selected: &#039;&#039; }&quot;
     class=&quot;container relative&quot;&gt;
    {% if donkeyTailCanvas %}
    </code>
  </pre>
</div>

                                            <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <h4>Step 2</h4>
<p>Set <code>selected</code> to the clicked <code>pinId</code> using <code>x-on:click</code></p>
</div>

                                            

                  

<div class="block max-w-2xl mx-auto">
  <pre class="language-twig">
    <code class="prism language-twig">
      &lt;div x-on:click=&quot;selected === &#039;{{ pinId }}&#039;
                 ? selected = &#039;&#039;
                 : selected = &#039;{{ pinId }}&#039;&quot;
      class=&quot;absolute&quot;
      style=&quot;transform:translate(-50%, -50%);
            top:{{ pin.y }}%;
            left:{{ pin.x }}%;&quot;&gt;
    </code>
  </pre>
</div>

                                            <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <h4>Step 3</h4>
<p>Inside the for loop, if the current pin has been selected show the close svg icon else show the open svg icon.<br /></p>
</div>

                                            

                  

<div class="block max-w-2xl mx-auto">
  <pre class="language-twig">
    <code class="prism language-twig">
      {# open svg #}
&lt;svg x-show=&quot;selected != &#039;{{ pinId }}&#039;&quot; 
      width=&quot;40&quot; height=&quot;40&quot; viewBox=&quot;0 0 40 40&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
  &lt;circle cx=&quot;20&quot; cy=&quot;20&quot; r=&quot;18.75&quot; stroke=&quot;#ffffff&quot; stroke-width=&quot;2.5&quot;/&gt;
  &lt;path d=&quot;M20 10V30&quot; stroke=&quot;#ffffff&quot; stroke-width=&quot;2.5&quot;/&gt;
  &lt;path d=&quot;M10 20H30&quot; stroke=&quot;#ffffff&quot; stroke-width=&quot;2.5&quot;/&gt;
&lt;/svg&gt;
{# close svg #}
&lt;svg x-show=&quot;selected === &#039;{{ pinId }}&#039;&quot;
      width=&quot;40&quot; height=&quot;40&quot; viewBox=&quot;0 0 40 40&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
  &lt;circle cx=&quot;20&quot; cy=&quot;20&quot; r=&quot;20&quot; stroke=&quot;#ffffff&quot; stroke-width=&quot;2.5&quot; /&gt;
  &lt;path d=&quot;M10 20H30&quot; stroke=&quot;white&quot; stroke-width=&quot;2.5&quot;/&gt;
&lt;/svg&gt;
    </code>
  </pre>
</div>

                                            <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <h4>Finally<br /></h4>
<p>Only show the popover for the currently selected pin.</p>
</div>

                                            

                  

<div class="block max-w-2xl mx-auto">
  <pre class="language-twig">
    <code class="prism language-twig">
      {# popover #}
&lt;div x-show=&quot;selected === &#039;{{ pinId }}&#039;&quot;
     class=&quot;absolute z-20 bg-white p-6 w-72 shadow&quot;
     style=&quot;top:{{ pin.y }}%; left:{{ pin.x }}%;
            transform:translate(-50%, 60px);&quot;&gt;
    </code>
  </pre>
</div>

                                            <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>That's it, we're done folks.</p>
<p>Below is a copy of the full source code created in this post.</p>
</div>

                                            

                                          

<div class="block max-w-2xl mx-auto">
  <pre class="language-twig">
    <code class="prism language-twig">
      {% extends &#039;_layout&#039; %}

{% set donkeytail = entry.donkeytail %}
{% set donkeyTailCanvas = donkeytail.canvas ?? false %}

{% block content %}

  &lt;div class=&quot;container relative&quot;
       x-data=&quot;{ selected: &#039;&#039; }&quot;&gt;
    {% if donkeyTailCanvas %}

      {% do donkeyTailCanvas.setTransform({ width: 1024 }) %}
      {{ tag(&#039;img&#039;, {
        src: donkeyTailCanvas.url,
        width: donkeyTailCanvas.width,
        height: donkeyTailCanvas.height,
        srcset: donkeyTailCanvas.getSrcset([&#039;1.5x&#039;, &#039;2x&#039;, &#039;3x&#039;]),
        alt: &#039;Lounge&#039;,
        class: &#039;w-full&#039;
      }) }}

      {% for pin in donkeytail.pins %}

        {% set pinId = pin.element.id %}
        {% set pinTitle = pin.element.title %}
        {% set pinShortDescription = pin.element.shortDescription %}
        {% set pinPrice = pin.element.price %}

      &lt;div x-on:click=&quot;selected === &#039;{{ pinId }}&#039;
                        ? selected = &#039;&#039;
                        : selected = &#039;{{ pinId }}&#039;&quot;
            class=&quot;absolute&quot;
            style=&quot;transform:translate(-50%, -50%);
                  top:{{ pin.y }}%;
                  left:{{ pin.x }}%;&quot;&gt;

        {# open svg #}
        &lt;svg x-show=&quot;selected != &#039;{{ pinId }}&#039;&quot; 
              width=&quot;40&quot; height=&quot;40&quot; viewBox=&quot;0 0 40 40&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
          &lt;circle cx=&quot;20&quot; cy=&quot;20&quot; r=&quot;18.75&quot; stroke=&quot;#ffffff&quot; stroke-width=&quot;2.5&quot;/&gt;
          &lt;path d=&quot;M20 10V30&quot; stroke=&quot;#ffffff&quot; stroke-width=&quot;2.5&quot;/&gt;
          &lt;path d=&quot;M10 20H30&quot; stroke=&quot;#ffffff&quot; stroke-width=&quot;2.5&quot;/&gt;
        &lt;/svg&gt;
        {# close svg #}
        &lt;svg x-show=&quot;selected === &#039;{{ pinId }}&#039;&quot;
              width=&quot;40&quot; height=&quot;40&quot; viewBox=&quot;0 0 40 40&quot; fill=&quot;none&quot; xmlns=&quot;http://www.w3.org/2000/svg&quot;&gt;
          &lt;circle cx=&quot;20&quot; cy=&quot;20&quot; r=&quot;20&quot; stroke=&quot;#ffffff&quot; stroke-width=&quot;2.5&quot; /&gt;
          &lt;path d=&quot;M10 20H30&quot; stroke=&quot;white&quot; stroke-width=&quot;2.5&quot;/&gt;
        &lt;/svg&gt;

        {# popover #}
        &lt;div x-show=&quot;selected === &#039;{{ pinId }}&#039;&quot;
              class=&quot;absolute z-20 bg-white p-6 w-72 shadow&quot;
              style=&quot;top:{{ pin.y }}%; left:{{ pin.x }}%;
                    transform:translate(-50%, 60px);&quot;&gt;

          {# rotate white square to add a triangle #}
          &lt;div class=&quot;absolute bg-white z-10
                      -top-5 h-10 w-10 transform rotate-45&quot;
              style=&quot;left: 7.75rem;&quot;&gt;
          &lt;/div&gt;

          &lt;div class=&quot;font-bold&quot;&gt;{{ pinId }}, {{ pinTitle }}, {{ pinPrice}}&lt;/div&gt;
          &lt;div class=&quot;mt-1&quot;&gt;{{ pinShortDescription }}&lt;/div&gt;

        &lt;/div&gt;
      &lt;/div&gt;
      {% endfor %}

    {% endif %}
  &lt;/div&gt;

{% endblock %}
    </code>
  </pre>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>Top Craft CMS plugins used at Good Work, Part Deux</title>
                <link>https://simplygoodwork.com/blog/top-craft-cms-plugins-used-at-good-work-part-two</link>
                <pubDate>Tue, 18 May 2021 08:00:00 -0500</pubDate>
                <author>Garrett Winder</author>
                <guid>https://simplygoodwork.com/blog/top-craft-cms-plugins-used-at-good-work-part-two</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/top-craft-cms-plugins-good-work-2.jpg?w=1600&amp;h=900&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666733706&amp;s=005be2c8029f688d313475f7b5a76b49" alt="Top craft cms plugins good work 2">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>We've lived and breathed Craft CMS at Good Work since day one, and <a href="https://simplygoodwork.com/blog/top-craft-cms-plugins-used-at-good-work">once again</a> have asked each member of our development team to select their top Craft CMS plugins. From Neo to Preparse to Donkeytail to SEOmatic, here they are in alphabetical order. Let the listicle begin!</p>
<h2>Donkeytail</h2>
<p>Being the authors of the Donkeytail plugin we are a little biased, but honestly, we use this gem a lot and our clients love it.</p>
<blockquote><p>“Donkeytail lets you mark specific points on an image asset and relate those out to entries, categories, products - in fact all elements! This is great for highlighting office locations on an illustrated map, pointing out features on a physical product image or maybe highlighting products on a marketing photo of a room layout. These are just a few example of how we've used Donkeytail.”</p> <cite>— Chris Rowe</cite></blockquote>
<p>We brought Donkeytail to life a few years back in the good old Craft 2 days, but it’s since been updated for Craft 3 and even supports GraphQL; grab it today from the plugin store.</p>
<p><a href="https://plugins.craftcms.com/donkeytail" target="_blank" rel="noreferrer noopener">Learn more about the Donkeytail plugin</a> »</p>
<h2>FeedMe</h2>
<blockquote><p>“Whether it’s a one-time import to migrate content from an old system, or setting up a schedule to pull in entries from other sources like podcasts and social feeds, this super flexible and reliable first-party plugin is an essential piece of many projects. And for commerce projects it’s a breeze to update product details and stock levels, too.”</p> <cite>— Ant Cooper</cite></blockquote>
<p><a href="https://plugins.craftcms.com/feed-me" target="_blank" rel="noreferrer noopener">Learn more about the FeedMe plugin</a> »</p>
<h2>Neo</h2>
<blockquote><p>“Most of our websites include a super-flexible ‘page builder’ feature which allows clients to create a range of different page layouts. Neo gives content editors a nicer user interface to handle this, and the developer experience is great too – Neo means we can re-use lots of common building block fields which speeds development up tremendously. We can’t wait to see something similar in the core of Craft 4!”</p> <cite>— Gavin Platt</cite></blockquote>
<p><a href="https://plugins.craftcms.com/neo" target="_blank" rel="noreferrer noopener">Learn more about the Neo plugin</a> »</p>
<h2>Preparse</h2>
<blockquote><p>“Preparse is a plugin that you'll only appreciate once you've run into a problem that it solves beautifully, and then you'll never forget it.”</p> <cite>— Jake Dohm</cite></blockquote>
<p>This plugin allows you to run some Twig code and save the result as a field on an element. For example, if you had an entry where you could select multiple products, you could also have a Preparse field on that entry called "averagePrice" which automatically calculated the average price of the products, using Twig, and that value would get saved on the entry like a normal field!</p>
<p><a href="https://plugins.craftcms.com/preparse-field" target="_blank" rel="noreferrer noopener">Learn more about the Preparse Field plugin</a> »</p>
<h2>SEOmatic</h2>
<blockquote><p>“There are lots of SEO plugins for Craft, but SEOmatic takes the cake. It takes the guesswork out of creating sitemaps, meta tags, structured data and more.”</p> <cite>— Andrew Menich</cite></blockquote>
<p>By mapping to the fields you already use, SEOmatic builds meta tags and social previews from your existing content, without having to duplicate data or set up custom fields that lock you into the plugin. It also makes adding analytics and other social integrations a breeze. A must-have for every site!</p>
<p><a href="https://simplygoodwork.com/blog/how-to-setup-an-seo-friendly-craft-cms-website">Learn more about the SEOmatic plugin</a> »</p>
<h2>Sprout Reports</h2>
<blockquote><p>“The Sprout Report plugin is a fantastic addition to many of our client's websites, allowing them to gain valuable insights into their site visitors.”</p> <cite>— Robin Mannering</cite></blockquote>
<p>The plugin really comes into its own when finding out when registered users visit a site and what kind of actions they perform. Integrated with a commerce website, the client can perform complex marketing queries such as ’show me all the people that have bought product X last week but haven’t bought products Y or Z’. This allows our clients to use that valuable data to cross-market intelligently and increase their sales while also benefiting their customers.</p>
<p><a href="https://plugins.craftcms.com/sprout-reports" target="_blank" rel="noreferrer noopener">Learn more about the Sprout Reports plugin</a> »</p>
<h2>Typed Link Field</h2>
<blockquote><p>“With over 16,000 installs, this free plugin is a must. We add it to every project we make. It covers every situation a client could or might want when creating a link on their page”</p><cite><em>— Jeff Irwin</em><a href="https://simplygoodwork.com/about/jeff-irwin"></a></cite></blockquote>
<p>When a client needs a call-to-action button, this plugin handles it really well. Link to Entries, Assets, Categories, URLs or even custom links. Set custom link text, open links in new tabs and set aria labels and link attributes. You will find this plugin in every Good Work project.</p>
<p><a href="https://plugins.craftcms.com/typedlinkfield" target="_blank" rel="noreferrer noopener">Learn more about the Typed Link Field plugin</a> »</p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>7 years of Good Work</title>
                <link>https://simplygoodwork.com/blog/7-years-of-good-work</link>
                <pubDate>Wed, 03 Mar 2021 09:00:00 -0600</pubDate>
                <author>Garrett Winder</author>
                <guid>https://simplygoodwork.com/blog/7-years-of-good-work</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/goodwork-article-image-7years.jpg?w=1600&amp;h=900&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666108316&amp;s=d1fdb4385e8f31b9423f68353dd98824" alt="7 years of Good Work">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>Somehow I blinked and it’s time for the SEVENTH Good Work birthday message. I wrote last year’s message days before our company retreat in Austin, Texas, where we talked through our big plans for 2020 and beyond. Little did I know that a week or so later it’d be back to the drawing board!</p>
<p>Last year was one of those years where all you can do is get on the boat and hold on tight. It was a blur, we had to think on our feet quite a bit, but we’re much stronger for it. We had gone fully remote a few weeks before lockdown hit, and have always prioritized efficiencies over hands, so we were in as good of a place as we could have been to weather the storm.</p>
<p>In September we said goodbye to Chase Giunta, our resident Daily National Holiday Announcer. It was sad to see him go but luckily (or unluckily) for us he’s still actively trolling the Good Work Slack Channels.</p>
<p>In December we said hello to Robin Mannering, the latest addition to our web development team. He’s in France with Gavin, and has stolen the coveted first place position for Most Scenic Zoom Background.</p>
<p>We launched over a dozen new websites, crowd favorites being the relaunch of e-commerce brand <a href="https://iconicinteriors.com/" target="_blank" rel="noreferrer noopener">Iconic Interiors</a> in the UK, <a href="https://livelmc.com/" target="_blank" rel="noreferrer noopener">LMC</a> and <a href="https://www.digitalbuilding.com/" target="_blank" rel="noreferrer noopener">Digital Building Components</a>.</p>
<p>On the content front, we continued our <a href="http://createsend.com/t/d-70A97ABFF55BEDC32540EF23F30FEDED">monthly email newsletter</a>, Jake launched a <a href="https://www.youtube.com/c/simplygoodwork/videos">Web Development Video Series</a> covering a wide range of topics from Craft CMS to Vue.js and Tailwind, and gave <a href="https://www.instagram.com/simplygoodwork/">the @simplygoodwork Instagram account</a> a much-needed facelift.</p>
<p>And how could I forget the most cleverly named Craft CMS Plugin on this side of the Mississippi, <a href="https://simplygoodwork.com/blog/donkeytail-plugin-craft-cms">Donkeytail</a>? With over 150 active installs, Donkeytail is content managing points on images all over the internet.</p>
<p>This next year is an exciting one for Good Work. We’re doubling down on our role as a web development partner for design agencies, and are growing our project management and development teams to better support our clients' needs.</p>
<p>Read our previous birthday messages:</p>
<ul><li><a href="https://simplygoodwork.com/blog/6-years-of-good-work">6 years of Good Work</a></li><li><a href="https://simplygoodwork.com/blog/5-years-of-good-work">5 years of Good Work</a></li><li><a href="https://simplygoodwork.com/blog/4-years-of-good-work">4 years of Good Work</a></li><li><a href="https://simplygoodwork.com/blog/3-years-of-good-work">3 years of Good Work</a></li><li><a href="https://simplygoodwork.com/blog/2-years-of-good-work">2 years of Good Work</a></li><li><a href="https://simplygoodwork.com/blog/1-year-of-good-work">1 year of Good Work</a></li></ul>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>Donkeytail use cases for Craft CMS 3</title>
                <link>https://simplygoodwork.com/blog/donkeytail-use-cases-for-craft-cms</link>
                <pubDate>Wed, 02 Dec 2020 13:48:00 -0600</pubDate>
                <author>Garrett Winder</author>
                <guid>https://simplygoodwork.com/blog/donkeytail-use-cases-for-craft-cms</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/goodwork-article-image-donkeytail-2020.jpg?w=1600&amp;h=900&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666733744&amp;s=1c9dbea2cb7ac1edf52a19df26470520" alt="Donkeytail use cases for Craft CMS 3">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>Last month we launched <a href="https://plugins.craftcms.com/donkeytail" target="_blank" rel="noreferrer noopener">Donkeytail</a>, a <a href="https://simplygoodwork.com/craft-cms">Craft CMS</a> plugin that allows website administrators to easily place points on images. Below are a few examples of how Donkeytail could be useful for your next website project.</p>
<h2>Selling multiple products within a single lifestyle image</h2>
<p>One area where Donkeytail shines is when you want the ability to sell multiple products within an image (think Instagram). Pins in a Donkeytail Field are really just content types that reference entries, assets, users, categories, products and variants, so you inherently have access to all of the fields within those content types on the front end using Twig. So, with design + code on the front end you can easily make interactions (like pop-ups) for each pin that provide more information, "quick buy" links, etc.</p>
<p>In other words, if IKEA was a Craft website then they'd probably use Donkeytail for their <a href="https://www.ikea.com/us/en/rooms/home-office/" target="_blank" rel="noreferrer noopener">Room Showcases</a>.</p>
<figure><img src="https://simplygoodwork.com/uploads/blog/donkeytail-usecase-screenshots.001.png" alt="IKEA website Donkeytail example" /></figure>
<h2>Highlighting locations on a faux map</h2>
<p>Another common use for Donkeytail is when you want to call out locations on a faux map, and something like Google Maps won't work. Maybe you're building a website for a new apartment complex that needs an interactive floor plan, or a new neighborhood development or an imaginary world like <a href="https://en.wikipedia.org/wiki/Universe_of_The_Legend_of_Zelda#Hyrulean_geography" target="_blank" rel="noreferrer noopener">Hyrule</a>. In this instance you'd use Donkeytail's background image as your "Map," and each pin could reference an entry from your "Locations" channel, or something similar.</p>
<figure><img src="https://simplygoodwork.com/uploads/blog/donkeytail-locations.jpg" alt="Locations on a Faux map" /></figure>
<h2>Pointing out features on a physical product</h2>
<p>Donkeytail can also be used to point out individual features of a physical product, or point out UI on a marketing website for a piece of software.</p>
<p>In other words, if the Tesla website was built in Craft they'd probably use Donkeytail to call out the safety features on their Vehicle Marketing Pages.</p>
<figure><img src="https://simplygoodwork.com/uploads/blog/donkeytail-usecase-screenshots.002.png" alt="Tesla website Donkeytail example" /></figure>
<p>At the end of the day, Donkeytail is a great solution for people who want to easily content manage points on images, and want those points to reference content types in Craft CMS. Feel free to reach out if you have any questions, and you can learn more about <a href="https://plugins.craftcms.com/donkeytail" target="_blank" rel="noreferrer noopener">Donkeytail in the Craft Plugin Store</a>.</p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>Donkeytail plugin for Craft CMS 3 and 4</title>
                <link>https://simplygoodwork.com/blog/donkeytail-plugin-craft-cms</link>
                <pubDate>Fri, 06 Nov 2020 13:23:00 -0600</pubDate>
                <author>Garrett Winder</author>
                <guid>https://simplygoodwork.com/blog/donkeytail-plugin-craft-cms</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/goodwork-article-image-donkeytail.jpg?w=1600&amp;h=900&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666733775&amp;s=dfc143b35329a6309a53d3d098306351" alt="Donkeytail plugin for Craft CMS 3">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>A few years back we created an internal plugin for our team to help content manage points on images in <a href="https://simplygoodwork.com/craft-cms" target="_blank" rel="noreferrer noopener">Craft CMS</a>. After a lot of trial and error, we're excited to announce we've officially published the full and public version in the Craft CMS plugin store, and we’re calling it <a href="https://plugins.craftcms.com/donkeytail" target="_blank" rel="noreferrer noopener">Donkeytail</a>.<br /></p>
<p>Donkeytail is a Craft CMS field type for Craft 3 &amp; 4 that allows users to quickly and easily content manage points on images. You can use Donkeytail for locations on a faux map, showcasing multiple products within an image or even <em>pinning the tail on a donkey</em>. It’s GraphQL compatible, and works with all content types: entries, assets, users, categories, products and variants.</p>
<figure><img src="https://simplygoodwork.com/uploads/blog/Donkeytail-Screenshot.png" alt="Donkeytail Screenshot" /></figure>
<p>More specifically, maps come up a lot in our world. From maps for new development projects, to maps for hiking trails through the Scottish Highlands, most of the time it makes more sense to utilize our own system for design consistency rather than using a service like the Google Maps API. Reasoning for this varies from project to project — maybe what we’re mapping isn’t quite there yet (like a new neighborhood), or the design of the map and its interactions doesn’t quite fit a traditional mapping library. Donkeytail is now available to save the day.</p>
<p>You can <a href="https://plugins.craftcms.com/donkeytail" target="_blank" rel="noreferrer noopener">download Donkeytail on the Craft CMS plugin store today</a>. We hope you like it, and please <a href="https://simplygoodwork.com/contact" target="_blank" rel="noreferrer noopener">contact us</a> for any help.</p>
<p>Happy pinning!</p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>Using the Array.Reduce() Method in JavaScript</title>
                <link>https://simplygoodwork.com/blog/using-the-array-reduce-method-in-javascript</link>
                <pubDate>Tue, 25 Aug 2020 11:21:00 -0500</pubDate>
                <author>Jake Dohm</author>
                <guid>https://simplygoodwork.com/blog/using-the-array-reduce-method-in-javascript</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/12-Blog.png?w=1920&amp;h=1080&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666733861&amp;s=0f20070d871f4a2aba0f8c581743bdc0" alt="Using the Array.Reduce() Method in JavaScript">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>In this video, we walk through how to use JavaScript’s Array.reduce() method to create a new value based on an array.</p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>Using the Array.Filter() Method in JavaScript</title>
                <link>https://simplygoodwork.com/blog/using-the-array-filter-method-in-javascript</link>
                <pubDate>Tue, 18 Aug 2020 10:44:00 -0500</pubDate>
                <author>Jake Dohm</author>
                <guid>https://simplygoodwork.com/blog/using-the-array-filter-method-in-javascript</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/11-Blog.png?w=1920&amp;h=1080&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666733875&amp;s=0b3b443aabdbb32dc535395ed7270dbf" alt="Using the Array.Filter() Method in JavaScript">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>In this video, we walk through how to use JavaScript’s Array.filter() method to filter items out of an array.</p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>Using the Array.Map() Method in JavaScript</title>
                <link>https://simplygoodwork.com/blog/array-map-javascript-method</link>
                <pubDate>Tue, 04 Aug 2020 09:13:00 -0500</pubDate>
                <author>Jake Dohm</author>
                <guid>https://simplygoodwork.com/blog/array-map-javascript-method</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/10-Blog.png?w=1920&amp;h=1080&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666733889&amp;s=42b40032ea373714b2d9ecdaaa827f4a" alt="Using the Array.Map() Method in JavaScript">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>In this video, we walk through how to use JavaScript’s Array.map() method to transform the data in an array.</p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>Refactoring Your Function Parameters</title>
                <link>https://simplygoodwork.com/blog/refactoring-your-function-parameters</link>
                <pubDate>Tue, 14 Jul 2020 14:00:00 -0500</pubDate>
                <author>Jake Dohm</author>
                <guid>https://simplygoodwork.com/blog/refactoring-your-function-parameters</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/09-Blog.png?w=1920&amp;h=1080&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666733901&amp;s=ae60b68507e70f30f6deb802f104f0c8" alt="Refactoring your function parameters">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>In this lesson, we take a function and refactor it to make both the function definition, and the way we call the function more readable.</p>
<h2>Video Transcript</h2>
<p>In this video we're going to look at how to clean up our function definitions and the way that we call functions by using named parameters and setting defaults for our optional parameters.</p>
<p>For this example we have a function called renderlist which takes the list to render, whether that list should be ordered or unordered, the color that the item should be rendered in, and the background color for the list.</p>
<p>Inside of that function all we're doing is checking if some of these optional parameters like ordered color and background color are defined and if not we're giving them a value right here in the... but we're actually doing this in the body of the function.</p>
<p>So we're going to look at how to refactor some of this. The way that we would call this function is by passing an array as the first parameter, this is our list, and then true or false for this ordered, and then we could pass a hex code here for color and a hex code for background color.</p>
<p>The first thing that I noticed though is that we're passing in undefined, which seems weird because undefined is the base value for if you don't pass in a parameter, but the problem is that because we're passing in an ordered list of parameters instead of a named list because we want to pass in background color we have to pass something for color so that we can pass this last thing.</p>
<p>So let's go ahead and refactor this function to accept named parameters so that we don't have to pass in undefined for any optional parameters.</p>
<p>We're going to go ahead and come up here and we're going to refactor this to accept an object of parameters and we're actually going to destructure these values directly from that object. So we're gonna add some g-structuring right here and so we're gonna destructure list ordered color and background color and then when we call the function we will call it with list and then ordered set ordered to true. We don't need to pass undefined because this is not an ordered parameter, these are names, so it doesn't matter that if we don't pass in color it'll automatically be set to undefined and we'll pass in background color as that hex value.</p>
<p>Okay, perfect, so you can see this is already a little bit more readable even in the way we call the function because you can see what we're passing in. Before we were just passing in true as a value but you couldn't tell without looking at the function, going back to the function definition, or with some good dev tools that what exactly that boolean value of true or false was doing. You also couldn't tell what this value hex value was doing unless you looked at the function definition. But now this allows us to see directly from our function call exactly what's going to happen. You know you can tell from here you're going to get a list, it's going to be ordered, and it's going to have a background color which is whatever we pass in here.</p>
<p>We've done our first thing: we've named our parameters but now one problem is that if we want to call this in the most basic form, which should be something like this, you know renderlist and pass it an array, we can't do that anymore because we still need to pass in an object with a key of lists and a value of our list. This is a little bit more clunky than how we were previously able to do it which was like this... just calling renderlist directly. So, for the most basic usage of the function we've actually made it more complicated. Well, for a more complicated usage we've actually made it clearer.</p>
<p>But I don't really want to make that trade off. I really want the best of both worlds. So what we're going to do is we're going to make list a separate parameter so our first parameter will be the list and then the second parameter will be our options that are optional and you can pass these in when you're calling the function and you want to change something about the default way that it's called. So, if you just call it with the list it'll set order to true, it'll set these colors to their defaults, and you'll be good to go. So with that change we can now come down here and we can pass it just like this: we'll pass in our list, and then we'll pass an object with options, which is still very readable renderlist, and then you give it the list. That's very clear what's happening and then you can optionally pass an object full of options that will kind of change how that list is rendered.</p>
<p>Okay, so if you look in the browser you'll see that it says cannot destructure property ordered of undefined... so we have our order here and it's trying to destructure that but when we call renderlist like this what it really reads is, you know, passing in our function and then it passes undefined for the second parameter automatically because we didn't pass anything, and then what our function body is trying to do is pretty much this: const ordered and then the other things equals our second param which is undefined. So, it's trying to destructure something from undefined which doesn't work. So what we need to do is we need to set a default parameter for our second param up here so we could. It kind of makes sense to show it like this. You say options and then you set options to an empty object and then this down here would be like options.ordered but because we still want to do that destructuring what we can do is we can actually put that right back in where it was.</p>
<p>So we say destructure ordered color and background color from our second parameter and if the second parameter isn't defined, like when we call it right here with only one parameter and one argument then set it to an empty object. And this will allow it to because you can destructure from an empty object, you can't destructure from undefined, so if I refresh you'll see that we cleared up that error and we can call renderlist just like that and that works just fine even though we're not passing that second parameter.</p>
<p>Okay, so this gives us two really clean ways to call our function and this is pretty much as good as our function call is going to get. But one thing that we don't have yet is we still have this weird default setting in our function body which doesn't really make a lot of sense. It's kind of writing imperative code for something that should be declarative. You should be able to declare what the default for each parameter is. So we can actually move each of these things up into our destructuring. So we can say ordered equals true and what this will do is it'll set order to the value that's passed in, like here, true or it'll set it to fall back to whatever value we give it. So we'll set order to be false by default because we're passing true, and then we'll set the background color to be... or the color, to be this hex value and we'll set the background color to be transparent by default and then we can get rid of all of this checking, which is just checking if it's undefined, and this will do the exact same thing we were just doing, but it will do it in a declarative way. Kind of clean that up so you can kind of see. So we take our list and then we take an object of params which is ordered color and background color and we set fallbacks for each of those. And you can come back here and we can try to run this and you'll see that doesn't give us any errors, and it does if we kind of console.log, we'll just console.log list, ordered color, background color, every time this function is called.</p>
<p>When the console logs that out for the first renderlist we're only passing the list so we see the list is one, two, and then it uses all the defaults we have: transparent, our color, which is our default color and then order is false.</p>
<p>The second time that we call it we call it and we tell it order to be true and we give it a background color and you'll see that that's reflected and what's console logged out here. </p>
<p>That's pretty much it. that's all you need to know, um, Whenever I see a function call that looks kind of vague, something like our initial renderlist, where you're passing it maybe a list and maybe a true, if you see an undefined in there, to kind of get you to a third value, that's when you might want to reach for named parameters. You might want to reach for... anytime you're doing imperative checking of undefined in your function body you might want to reach for optional parameters and setting default for those parameters.</p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>Translating Static Content with Craft CMS</title>
                <link>https://simplygoodwork.com/blog/translating-static-content-with-craft-cms</link>
                <pubDate>Wed, 17 Jun 2020 16:36:00 -0500</pubDate>
                <author>Jake Dohm</author>
                <guid>https://simplygoodwork.com/blog/translating-static-content-with-craft-cms</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/08-Blog.png?w=1920&amp;h=1080&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666733914&amp;s=d834e4f7dcce024f86435687d8687784" alt="Translating static content with Craft CMS">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>In this video, we walk through how you can use Craft’s built-in translation features to translate static content that is not translated in the CMS.</p>
<h2>Video Transcript</h2>
<p>Hey everyone,</p>
<p>In this video, we're going to talk about static translations with Craft CMS. So, what is a static translation? Well, Craft has a couple of ways for you to translate content when you're working with it. You can use the CMS and actually use different translations of the content in your fields when you're putting any content in the CMS, but it also allows you to translate static content that isn't managed in the CMS. Maybe something like a heading or a form.</p>
<p>The first thing we need to do to get static translations set up in Craft is actually get the translations. So if you look in my directory structure you'll see that I've added a translations folder and then inside of that there's a folder for each language that we're gonna add a translation for. Right now we have de for German and es for Spanish, and Spanish
is what we'll be looking at today.</p>
<p>I can open up the site.php file that contains all those translations for any words that we want to translate. We have name which will translate to nombre, email, message, and we're gonna translate the word hello.</p>
<p>So, we have these translations here but our text isn't being translated. That's because we need to use the translate filter that Craft gives us in our Twig templates. So I'm going to wrap name in a string and we'll run the translate filter on it and then we'll do the same thing for email and message. Just wrap those as a string and we'll say Craft render the string but translate it.</p>
<p>You'll see nothing change but if I jump over to the Spanish version of the site all of these field names have been translated. Craft looks at the static text which are passing it, checks if it matches any of the keys that you've given it in the translation PHP file, and if it does then it goes ahead and translates it for you.</p>
<p>So let's try doing the same thing on this "Hello, Jake!" text. We'll just wrap it as a string and then we will translate it. Now you see here that nothing happens. This is because there's not an exact match on this string. So it sees the word "hello" but because we don't have "Hello, Jake!" in here it doesn't do substring translation it has to match the string exactly.</p>
<p>So for something like this where we want to match part of a string we know the format of this will always be "hello comma space something exclamation point", we can use a substring with a variable. So, what we'll do is we'll do <code>Hello, {name}!</code> will be our key and then we'll translate that to <code>Hola, {name}!</code> and then what we need to do when you use our translation is pass it some params. So, here we'll pass an object of params and we'll say the name should be Jake and here we'll say hello name and then it will translate that string for us.</p>
<p>So... this is a basic translation going from English to Spanish using static translations in Craft CMS!</p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>Using Tailwind’s Space and Divide Utilities</title>
                <link>https://simplygoodwork.com/blog/using-tailwinds-space-and-divide-utilities</link>
                <pubDate>Tue, 02 Jun 2020 06:30:00 -0500</pubDate>
                <author>Jake Dohm</author>
                <guid>https://simplygoodwork.com/blog/using-tailwinds-space-and-divide-utilities</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/07-Blog.png?w=1920&amp;h=1080&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666733929&amp;s=411d357e3459963ef8dbeba5bb0b1d26" alt="Using Tailwind&#039;s Space and Divide Utilities">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>Today we are going to take a quick peek at the new Space and Divide Utilities that were added to Tailwind in version 1.3.</p>
<h2>Final code</h2>
</div>

                                            

            

<div class="block max-w-2xl mx-auto">
  <pre class="language-javascript">
    <code class="prism language-javascript">
      &lt;div class=&quot;
  flex md:flex-row justify-center
  md:space-x-4 md:space-y-0
  flex-col space-y-4
&quot;&gt;
  &lt;div class=&quot;h-24 w-24 bg-blue-200&quot;&gt;&lt;/div&gt;
  &lt;div class=&quot;h-24 w-24 bg-blue-200&quot;&gt;&lt;/div&gt;
  &lt;div class=&quot;h-24 w-24 bg-blue-200&quot;&gt;&lt;/div&gt;
  &lt;div class=&quot;h-24 w-24 bg-blue-200&quot;&gt;&lt;/div&gt;
  &lt;div class=&quot;h-24 w-24 bg-blue-200&quot;&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;div class=&quot;my-8&quot;&gt;&lt;/div&gt;

&lt;div class=&quot;
  flex md:flex-row mx-auto w-3/5 justify-between
  md:divide-x-2 md:divide-y-0
  flex-col divide-y
&quot;&gt;
  &lt;div class=&quot;flex-grow text-center uppercase font-bold&quot;&gt;Never&lt;/div&gt;
  &lt;div class=&quot;flex-grow text-center uppercase font-bold&quot;&gt;Gonna&lt;/div&gt;
  &lt;div class=&quot;flex-grow text-center uppercase font-bold&quot;&gt;Give&lt;/div&gt;
  &lt;div class=&quot;flex-grow text-center uppercase font-bold&quot;&gt;You&lt;/div&gt;
  &lt;div class=&quot;flex-grow text-center uppercase font-bold&quot;&gt;Up&lt;/div&gt;
&lt;/div&gt;
    </code>
  </pre>
</div>

                                            <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <h2>Video Transcript</h2>
<p>What's up, everyone? In this video, we're going to look at how to set defaults for your props and also to validate props. So to do that I have three buttons here; give, you, and up, based on a popular song, and what we need to do is be able to set variants on these buttons... so we're going to use props for that.</p>
<p>We're going to look at the app component. You can just see I have three buttons here and here is the code for the actual component. It's just a simple button and we're applying a class of `button` and a class of `button teal`. Now, what if we wanted to have another variant of this button that wasn't teal but it was orange? Because we're working in Vue and using components we'd probably use a prop for that.</p>
<p>Let's come down here and we're going to add a prop and it's going to be called color and we're going to give that some information about what this prop should be. We're going to tell it the type should be a string, we're just going to accept a string telling us the color... and, let's go ahead and run with that for now.</p>
<p>Let's come out here and we're going to change this so that we can say color equals teal and the last one is gonna have the color orange. Those are gonna be our two colors; teal and orange. Let's come back into the component and try to implement that. What we can do is we can add a custom class here and we're gonna say that class should be button dash dash and then whatever the color they passed in is. We're going to remove this and we'll see that we now have a teal button and an orange button. But what if the teal button is our default and anytime we use it without the prop we want to go ahead and tell it that it should be teal?</p>
<p>I'm going to come back in and we're going to implement a default prop. We can say default and we're just going to give that a string of teal and when we save that you can see that when we don't pass any prop in like with this middle button it renders out this teal prop. So now we have a prop for our color and we have a default set for it. But one problem with using a string prop is that technically people can pass in a value that's not supported. If we come back and look here I could pass in for the second component color red and they would never know that that's not an accepted value. The color wouldn't show up on the front end but they wouldn't get any type of error either. Here's where prop validation comes in handy.</p>
<p>We can come within our prop definition and set up a validator and pass out a function which accepts one argument: value, which is the value of the prop. Then we want to check if the prop's value matches one of the specified values that are allowed. So we're going to say: if value equals equals equals, so if the value is equal to teal, or value is equal to orange then we'll return true that this is a valid prop value, otherwise, we'll return false... this is not a valid prop value.</p>
<p>Now if we come to look at our console here we'll see that we get an error when this is evaluated: invalid prop custom validator check failed for prop color. So it'll throw an error telling us that we passed in a color prop that is not accepted. This is useful for scenarios like this where you're allowing the users of your component to pass in string values as props but you need to make sure that they pass in allowed values only.</p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>Five console.log tips and tricks</title>
                <link>https://simplygoodwork.com/blog/five-console-log-tips-and-tricks</link>
                <pubDate>Fri, 22 May 2020 14:36:00 -0500</pubDate>
                <author>Jake Dohm</author>
                <guid>https://simplygoodwork.com/blog/five-console-log-tips-and-tricks</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/06-Blog.jpg?w=3840&amp;h=2160&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666733942&amp;s=3e6bb03aeff0364679bd9279cf1570bc" alt="Five console.log tips and tricks">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>Here's the final code including all 5 tips, <strong>and one bonus tip</strong>!</p>
</div>

                                            

            

<div class="block max-w-2xl mx-auto">
  <pre class="language-javascript">
    <code class="prism language-javascript">
      window.food = [&#039;🌯&#039;, &#039;&#039;, &#039;🍔&#039;, &#039;🍕&#039;]
window.todoList = [
  { task: &#039;Come up with examples&#039;, inProgress: false, done: true },
  { task: &#039;Record Video&#039;, inProgress: true, done: false },
  { task: &#039;Publish video&#039;, inProgress: false, done: false },
]

console.log(food)
console.log(todoList)

/* Tip #1: Named console.log */
console.log({ food })

/* Tip #2: console.table */
console.table(todoList)

/* Tip #3: console.warn &amp;&amp; console.error */
console.warn(&#039;This may be unsafe&#039;)
console.error(&#039;There was an error processing something&#039;)

/* Tip #4: console.count */
for (const item of food) {
  console.count(&#039;Loop ran&#039;)
}

/* Tip #5: console.assert (🍕, 🌯) */
console.assert(food[0] === &#039;🌯&#039;, &#039;First food item is burrito&#039;)
console.assert(food[0] === &#039;🍕&#039;, &#039;First food item is pizza&#039;)

/* Tip #6: Styling console.log */
console.log(
  &#039;%c Testing custom styles&#039;,
  &#039;color:green; font-family: Comic Sans MS; font-size: 30px; line-height: 60px;&#039;
)
    </code>
  </pre>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>Styling Redactor Output with Retcon (and Tailwind)</title>
                <link>https://simplygoodwork.com/blog/styling-redactor-output-with-retcon-and-tailwind</link>
                <pubDate>Wed, 13 May 2020 11:23:00 -0500</pubDate>
                <author>Jake Dohm</author>
                <guid>https://simplygoodwork.com/blog/styling-redactor-output-with-retcon-and-tailwind</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/05-Blog.jpg?w=3840&amp;h=2160&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666733959&amp;s=fb0e026aee1448b2130128bfec21226a" alt="Styling Redactor Output with Retcon (and Tailwind)">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>It's not rare to be working with a rich text field in Craft CMS and want to style some elements of the output without creating classes. This is especially true when you're working with Utility CSS frameworks like Tailwind CSS so you're not writing custom classes very often.</p>
<p>Thanks to <a href="https://plugins.craftcms.com/retcon" target="_blank" rel="noreferrer noopener">Retcon</a>, this is easy! In this video we'll look at how to replace and style elements using the Retcon plugin for Craft CMS.</p>
</div>

                                            

                  

<div class="block max-w-2xl mx-auto">
  <pre class="language-twig">
    <code class="prism language-twig">
      &lt;div class=&quot;content&quot;&gt;
  {{ entry.body|retcon([
    [&#039;change&#039;, &#039;h1&#039;, &#039;h2&#039;],
    [&#039;attr&#039;, &#039;h2&#039;, { class: &#039;text-3xl font-bold mb-4&#039; }],
    [&#039;attr&#039;, &#039;p + p&#039;, { class: &#039;mt-4&#039; }],
    [&#039;attr&#039;, &#039;code&#039;, { class: &#039;bg-gray-300 rounded text-red-500 text-sm&#039; }],
    [&#039;attr&#039;, &#039;p &gt; a&#039;, { class: &#039;text-blue-700&#039; }]
  ]) }}
&lt;/div&gt;
    </code>
  </pre>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>Vue Prop Defaults and Validators</title>
                <link>https://simplygoodwork.com/blog/vue-prop-defaults-and-validators</link>
                <pubDate>Wed, 06 May 2020 06:39:00 -0500</pubDate>
                <author>Jake Dohm</author>
                <guid>https://simplygoodwork.com/blog/vue-prop-defaults-and-validators</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/02.-Vue-Prop-Defaults-and-Validators.png?w=1920&amp;h=1080&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666733981&amp;s=afc0028718661d7b90a8d1978fc0a7a4" alt="Vue Prop Defaults and Validators">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <h2>Code</h2><p>Here's the code for the finished prop definition, including a default and validator.</p>
</div>

                                            

            

<div class="block max-w-2xl mx-auto">
  <pre class="language-javascript">
    <code class="prism language-javascript">
      export default {
  props: {
    color: {
      type: String,
      default: &#039;teal&#039;,
      validator: function(value) {
        if (value === &#039;teal&#039; || value === &#039;orange&#039;) {
          return true
        } else {
          return false
        }
      },
    },
  },
}
    </code>
  </pre>
</div>

                                            <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <h2>Bonus tip</h2>
<p>Another &#x1f525; tip for you: I find myself usually writing validators for string props, so one way to simplify the validator is to create an array of allowed values and use the "includes" array method to check if the passed in value matches an allowed value. Here's how that would look for this example:</p>
</div>

                                            

            

<div class="block max-w-2xl mx-auto">
  <pre class="language-javascript">
    <code class="prism language-javascript">
      export default {
  props: {
    color: {
      type: String,
      default: &#039;teal&#039;,
      validator: function(value) {
        const validColors = [&#039;teal&#039;, &#039;orange&#039;]
        return validColors.includes(value)
      },
    },
  },
}
    </code>
  </pre>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>Creating a Global Store in Vue without Vuex</title>
                <link>https://simplygoodwork.com/blog/creating-a-global-store-in-vue</link>
                <pubDate>Tue, 28 Apr 2020 06:30:00 -0500</pubDate>
                <author>Jake Dohm</author>
                <guid>https://simplygoodwork.com/blog/creating-a-global-store-in-vue</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/01.-Vue-Reactive-Store.png?w=1920&amp;h=1080&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666734003&amp;s=ce2d65cb53d47a9fcb3782831fa62df6" alt="Creating a Global Store in Vue without Vuex">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>If you have ever worked on a Vue application, a situation has most likely arose where you had some pieces of state that you use in multiple unrelated components. That forces you to decide: Do I put that (global) state in my root Vue instance and pass it all the way down through props, or do I pull in a state management library, like Vuex? Now, you have another option!</p><p>When the Vue maintainers released version 2.6, they exposed Vue's internal reactivity system, the same system used internally for a component's <code>data</code>. This allows for some pretty cool features, one of which is the ability to create a lightweight, reactive, global store. A big thing to note about that is the word "<strong>reactive</strong>". Because this state object will be reactive, if you update any piece of state in this store, your Vue app will know about that change and re-render any components that rely on that state, just like it does when you change something in your component's <code>data</code>.</p><p>Let's walk through how you can create a store and actions to update your state.</p><h3>Creating a Store</h3><p>Creating a reactive store is as easy as this:</p><pre class="code"><code>const store = Vue.observable({ count: 1 })</code></pre><p>I really wish there was more to say, but creating a store is so simple!</p><h3>Creating Actions to Update your State</h3><p>Let's talk about "actions": Actions are a way to centralize the way that components are allowed to update state in your store. The actions object is just that: an object containing functions. It doesn't have any fanciness or magic, it is purely a way for you to dictate how updates to state can be made*.</p><p>* <em>There is nothing preventing you from directly mutating a piece of state in the store, the actions pattern is really only for clarity and consistency.</em></p><pre class="code"><code>const actions = {
 incrementCount() {
 store.count += 1
 },
 decrementCount() {
 store.count -= 1
}}</code></pre><h3>Making Your Store and Actions Global</h3><p>The way Vue creates components is practically <code>const component = new Vue(options)</code>, which means that anything that you put on the Vue prototype will automatically be inherited by not only the root instance, but every Vue component. So, to make our store global, we can attach it to Vue's prototype.</p><pre class="code"><code>Vue.prototype.$store = store
Vue.prototype.$actions = actions</code></pre><h3>Using Your Store and Actions</h3><p>Because the store and actions are attached to the Vue prototype, they'll be automatically available in every component, so you can easily access them in your component.</p><pre class="code"><code>&lt;!-- Counter Component --&gt;
&lt;template&gt;
 &lt;div&gt;Count: {{ count }}&lt;/div&gt;
 &lt;button @click="$actions.incrementCount"&gt;+ Add One&lt;/button&gt; 
 &lt;button @click="$actions.decrementCount"&gt;- Subtract One&lt;/button&gt;
&lt;/template&gt;

&lt;script&gt;
 export default {
 computed: {
 count() {
 return this.$store.count
 }
 }
 }
&lt;/script&gt;</code></pre><h3>Complete Example</h3><pre class="code"><code>/* Create a reactive store */
const store = Vue.observable({ count: '' })

/* Create centralized actions for updating the store */
const actions = {
 incrementCount() {
 store.count += 1
 },
 decrementCount() {
 store.count -= 1
 }
}

/*
 Attach store and actions to the Vue prototype
 so they can be accessed from any component
*/
Vue.prototype.$store = store
Vue.prototype.$actions = actions</code></pre>
<h3>Conclusion</h3><p>This might not be the perfect pattern for your application. Sometimes you don't need a global store. Sometimes you <em>do</em> need a full-fledged state management system like Vuex. But before you pull in a library, or pass props and events up and down through numerous components, it's worth thinking about whether a simple global store could save you a lot of headache.</p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>The Soft Side of the Delete Button</title>
                <link>https://simplygoodwork.com/blog/the-soft-side-of-the-delete-button</link>
                <pubDate>Tue, 14 Apr 2020 11:33:00 -0500</pubDate>
                <author>Jake Dohm</author>
                <guid>https://simplygoodwork.com/blog/the-soft-side-of-the-delete-button</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/goodwork-article-image-softdelete.jpg?w=1600&amp;h=900&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666734035&amp;s=463f90e721c3b30fb0780380b988482d" alt="The Soft Side of the Delete Button">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>We've all been there. You get a call that someone deleted content from their website, they don't know how to get it back and they're (understandably) upset. Before the 3.1 release of <a href="https://simplygoodwork.com/craft-cms">Craft CMS</a> you might have been in a pinch. You <em>could</em> restore an old copy of the database, assuming you have backups, but then you risk overwriting newer content. It's not an impossible problem to fix, but you'd definitely be in for a bummer of an afternoon.</p>
<p>This is why the Craft team introduced <strong>Soft Deletes</strong>. Now, when you delete an entry, category, user or any type of element, it is automatically placed in a "Trashed" state, where it is recoverable, but won't appear in the dashboard or in any templates.</p>
<p>In this article, we'll be diving into the following topics:</p>
<ul><li>What types of content have a soft-delete</li><li>How to soft-delete content</li><li>How to find and recover soft-deleted content</li><li>How to permanently remove soft-deleted content</li><li>Configuring soft-delete</li><li>What this means for plugin authors</li></ul>
<h2>What types of content will be soft-deleted?</h2>
<p>Great question! The short answer: anything that is an "element" in Craft. The main types of content that you'll be working with soft-deletes in Craft are:</p>
<ul><li>Entries</li><li>Categories</li><li>Users</li><li>Assets*</li></ul>
<p>Other entities in Craft like sections, entry types and category groups are also soft-delete-enabled, but you can't restore them from the Control Panel (CP), and probably won't bump into many scenarios where you'd want to recover those elements manually, especially if you're using <a href="https://docs.craftcms.com/v3/project-config.html" target="_blank" rel="noreferrer noopener">Project Config</a>.</p>
<p>*<em>Assets cannot be recovered from the CP, which we'll discuss below</em></p>
<h2>How to soft delete content</h2>
<p>Soft delete is automatically enabled if you're using Craft CMS 3.1+, so you can delete your content normally and it will automatically be soft-deleted.</p>
<figure><img src="https://simplygoodwork.com/uploads/blog/Deleting-an-Entry.jpg" alt="Deleting an entry from the Craft CMS control panel" /></figure>
<h2>How to find and recover soft-deleted content</h2>
<p>Here's the fun part! The whole reason to <em>have</em> soft-delete is so that you can find and recover content that was mistakenly deleted.</p>
<h3>Finding soft-deleted content</h3>
<p>When you delete an entry (or another element) it's marked as "Trashed" and will no longer show up in the normal list of entries in the Control Panel.</p>
<p>To find and manage soft-deleted entries, you can click on the "status" indicator (to the right of the search bar) and select a new status option called "Trashed." This works for Entries, Categories, Users and Assets.</p>
<figure><img src="https://simplygoodwork.com/uploads/blog/Trashed-Filter.jpg" alt="Looking in the Trash in the Craft CMS control panel" /></figure>
<p>Within this view, you can see all of the content that has been soft-deleted, but has not yet been permanently removed (see the next section for how/when content is permanently removed).</p>
<figure><img src="https://simplygoodwork.com/uploads/blog/Trashed-View.jpg" alt="The Trash in the Craft CMS control panel" /></figure>
<p>As you can see, the Deleted Blog Post entry showing up under Trashed still has a status of "enabled" even though it has been deleted. Don't worry about this, it won't show up on the front end or in any searches.</p>
<h3>Recovering soft-deleted content</h3>
<p>To recover an item that's been soft-deleted, find the trashed element and select it. Once you've selected it, the filtering bar at the top will disappear and a "Restore" button will appear. Click "restore" to restore all selected entries.</p>
<figure><img src="https://simplygoodwork.com/uploads/blog/Restoring-an-Entry.jpg" alt="Recovering soft-deleted content in Craft CMS" /></figure>
<p><strong>Note</strong>: Entries, Users and Categories can all be restored from the Control Panel, but Assets cannot. This is because when you delete an asset, the file related to that asset is automatically removed from the server (either your server or a remote). This makes it difficult to "restore" an asset.</p>
<h2>How to permanently remove soft-deleted content</h2>
<h3><br /></h3>
<h3>From the Control Panel</h3>
<p>Do you want the good news or the bad news first? The bad news? Okay. Currently, there's no way to permanently delete soft-deleted content from the CMS. But, the <strong>good news</strong> is that it's <a href="https://github.com/craftcms/cms/issues/4420" target="_blank" rel="noreferrer noopener">coming in Craft 3.5</a>.</p>
<p>Once Craft 3.5 is released, you'll be able to permanently delete content that's been soft-deleted by navigating to the Trashed screen and clicking "Delete Permanently."</p>
<figure><img src="https://simplygoodwork.com/uploads/blog/Delete-Permanently.png" alt="Deleting items in the Trash in Craft CMS 3.5" /></figure>
<h3>With a Console Command</h3>
<p>You can, however, remove soft-deleted content using a Console Command that's built into Craft. I won't go into exactly how this works, but just know that soft-deleted entries are <em>eventually</em> garbage-collected automatically*, but you can run this command to remove them early.</p>
</div>

                                            

            

<div class="block max-w-2xl mx-auto">
  <pre class="language-javascript">
    <code class="prism language-javascript">
      // remove all soft-deleted elements immediately (Entries, Users, etc.)
./craft gc --delete-all-trashed
    </code>
  </pre>
</div>

                                            <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p><em>*Unless you tell Craft never to remove soft-deleted content (see Configuration section below)</em></p>
<h2>Configuring soft-delete</h2>
<p>By default, soft-deleted content is kept for 30 days, and then will be automatically removed. But you can configure this to keep content for a shorter period, a longer period or forever.</p>
<p>Using the <a href="https://docs.craftcms.com/v3/config/config-settings.html#softdeleteduration" target="_blank" rel="noreferrer noopener">softDeleteDuration</a> config:</p>
</div>

                                            

            

<div class="block max-w-2xl mx-auto">
  <pre class="language-javascript">
    <code class="prism language-javascript">
      // general.php

return [
  &#039;softDeleteDuration&#039; =&gt; 0 // zero means that trashed content will be kept forever
]
    </code>
  </pre>
</div>

                                            <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <h2>What this means for plugin authors</h2>
<p>Soft Delete doesn't just work for native Craft element types, any custom element that a plugin adds can also leverage the Soft Delete functionality.</p>
<h3>Examples</h3>
<h4>Inventory</h4>
<p>Lindsey DiLoreto recently updated his plugin <a href="https://plugins.craftcms.com/inventory" target="_blank" rel="noreferrer noopener">Inventory</a>, which helps you keep an inventory of where your fields are being used and track if fields <em>were</em> being used in a now-deleted section.</p>
<figure style="margin:0px 0px 1em;padding:0px;border:0px;font-style:normal;font-weight:400;font-size:16px;line-height:inherit;font-family:'system-ui', 'system-ui', '-apple-system', 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;vertical-align:baseline;clear:both;color:rgb(41,50,61);letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);"><img src="https://simplygoodwork.com/uploads/blog/Inventory-Leveraging-Soft-Delete.jpg" alt="Craft CMS Field Inventory Plugin screenshot" /></figure>
<h4>Campaign</h4>
<p>Ben Croker also updated his plugin <a href="https://putyourlightson.com/plugins/campaign" target="_blank" rel="noreferrer noopener">Campaign</a> to leverage soft-deletes, <strong>and</strong> allow you to permanently delete Contacts for GDPR reasons.</p>
<figure style="margin:0px 0px 1em;padding:0px;border:0px;font-style:normal;font-weight:400;font-size:16px;line-height:inherit;font-family:'system-ui', 'system-ui', '-apple-system', 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Fira Sans', 'Droid Sans', 'Helvetica Neue', sans-serif;vertical-align:baseline;clear:both;color:rgb(41,50,61);letter-spacing:normal;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);"><img src="https://simplygoodwork.com/uploads/blog/Campaign-Delete-Permanently.png" alt="Craft CMS Campaign Plugin screenshot" /></figure>
<h3><br /></h3>
<h3>How to implement soft-delete</h3>
<p>Soft Delete will automatically work for any custom elements in Craft. But, if you want to allow users to be able to restore soft-deleted elements from the Control Panel, you need to implement a <a href="https://docs.craftcms.com/v3/extend/element-types.html#restore-action" target="_blank" rel="noreferrer noopener">Restore Action</a> on your element class. For more information, check out <a href="https://docs.craftcms.com/v3/extend/soft-deletes.html#update-the-rest-of-your-code" target="_blank" rel="noreferrer noopener">the documentation</a>.</p>
<h2>Further Reading</h2>
<ul><li><a href="https://craftquest.io/lessons/inside-soft-deletes-in-craft-3-1" target="_blank" rel="noreferrer noopener">Soft Deletes - CraftQuest Lesson</a> - this is an awesome resource that covers very similar content to this article in an awesome easy-to-follow video!</li><li><a href="https://docs.craftcms.com/v3/extend/soft-deletes.html" target="_blank" rel="noreferrer noopener">Soft Delete Plugin Documentation</a></li></ul>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>Our part in small business digital transformation</title>
                <link>https://simplygoodwork.com/blog/our-part-in-small-business-digital-transformation</link>
                <pubDate>Mon, 23 Mar 2020 06:30:00 -0500</pubDate>
                <author>Garrett Winder</author>
                <guid>https://simplygoodwork.com/blog/our-part-in-small-business-digital-transformation</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/small-business-digital-transformation.jpg?w=1600&amp;h=900&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666734056&amp;s=a20db481ab53f245493e6617e0c134a1" alt="Our part in small business digital transformation">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>We’re all having to come to grips with the massive changes COVID-19 has brought to our day-to-day lives, both from a health and economic perspective. There’s a lot of scary stuff happening, which has significantly impacted our families, friends, businesses, and everything in between.</p><p>Over the last few weeks I’ve been thinking about how we as digital service businesses, in general, can be the most useful, and what our role is during this period of unknown. In the end, I keep landing on a few simple things: continuing to do our jobs well with a heightened sensitivity to our customers, and offering our expertise in any way possible (even if it’s not on our list of services).</p><p>Right now people are leaning on technology with a heightened sense of urgency, and our roles within our agencies can be much more meaningful and impactful - and on a much larger scale - than ever before. Small businesses around the globe are spinning up entirely new concepts overnight to stay up and running, temporarily transforming their businesses from what they were yesterday, into something that works today, and into the future. As experts in this area, it is our job to provide as much guidance as possible, and facilitate these transformations to the best of our ability.</p><p>We should be helping restaurants quickly transition from traditional walk-in eateries to agile kitchens that offer take-out, delivery and e-gift cards.</p><p>We should be helping churches navigate their online service offerings, and how to properly build the infrastructure required to meet those needs so their digital doors remain open.</p><p>Since we already work in a remote-friendly industry, we should be providing tools and insights to our friends that are making that transition for the first time.</p><p>We should be helping brick and mortar retailers strategically scale their online businesses, and engage their customers in new ways, like bookings for digital consultations and curbside pick up.</p><p>You get the point.</p><p>While we’re always looking for clients that are the perfect fit, we must do what businesses across the globe are being required to do to simply survive. Change. Let’s all do our part, and look for opportunities to provide creative, digital ways to help humanity get through this together.</p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>6 years of Good Work</title>
                <link>https://simplygoodwork.com/blog/6-years-of-good-work</link>
                <pubDate>Tue, 03 Mar 2020 06:30:00 -0600</pubDate>
                <author>Garrett Winder</author>
                <guid>https://simplygoodwork.com/blog/6-years-of-good-work</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/6-years-of-good-work.png?w=1600&amp;h=900&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666108273&amp;s=aceac1539309a584102b661b881ca89f" alt="6 years of Good Work">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>I look forward to this post every year where I get to go off-topic (for our blog, at least) and publicly reflect on what we’ve accomplished over the previous 365 days as a company.</p>
<p>One of the many things I <del>like</del> <ins>love</ins> about Good Work is our ability to continually evolve, both quickly and efficiently. We didn’t choose a certain way of doing things six years ago and stick to it, we learn from everything that comes our way and adjust accordingly. At the beginning of each year we set various themes and goals, and as the months go by we stick to them as much as possible, while also understanding the road isn’t straight, but incredibly windy.</p>
<p>About this time last year we were in the early stages of making an intentional effort to share our knowledge through a series of <a href="https://simplygoodwork.com/blog">articles</a>, <a href="http://createsend.com/t/d-F1BAEA40E98C42682540EF23F30FEDED">newsletters</a> and speaking engagements at conferences. Since that time we have committed to twice-monthly articles, a monthly newsletter and have spoken at conferences all over the map, including the official Craft CMS conference, DotAll and Vue.js Amsterdam, one of the largest Vue.js conferences in the world.</p>
<p>When it comes to <a href="https://simplygoodwork.com/craft-cms">Craft CMS</a>, we upped our partnership with Craft and became one of only 16 verified partners in the United States. We also launched an official <a href="https://simplygoodwork.com/maintenance">Craft CMS Maintenance Program</a> out of necessity, as the demand for The Good Work Way (development rooted in reliability, communication, and of course, expertise) continues to grow.</p>
<p>We added 30 new clients to the Good Work family over the last year, roughly one-third of our total client list, and have worked on many exciting and challenging website projects.</p>
<p>To top it all off, we went fully remote back in February. We’ve always been remote-friendly with <a href="https://simplygoodwork.com/about">team members in different states and countries</a>, so it only made sense. We’re now officially located in guest bedrooms and home offices throughout Texas, North Carolina, England and France!</p>
<p>As I write our remote team is descending upon Austin, Texas, for our <a href="https://www.instagram.com/p/B9hnkJyH_P8/">annual company retreat</a> so we can spend a few days in-person hanging out, eating BBQ, and talking through themes and goals for the next 12 months. Each year we grow stronger both as a team, and company, and I’m excited to see that tradition through to our next birthday post and beyond.</p>
<p>Read our previous birthday messages:</p>
<ul><li><a href="https://simplygoodwork.com/blog/5-years-of-good-work">5 years of Good Work</a></li><li><a href="https://simplygoodwork.com/blog/4-years-of-good-work">4 years of Good Work</a></li><li><a href="https://simplygoodwork.com/blog/3-years-of-good-work">3 years of Good Work</a></li><li><a href="https://simplygoodwork.com/blog/2-years-of-good-work">2 years of Good Work</a></li><li><a href="https://simplygoodwork.com/blog/1-year-of-good-work">1 year of Good Work</a></li></ul>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>Regularly scheduled website audits</title>
                <link>https://simplygoodwork.com/blog/regularly-scheduled-website-audits</link>
                <pubDate>Wed, 26 Feb 2020 06:30:00 -0600</pubDate>
                <author>Garrett Winder</author>
                <guid>https://simplygoodwork.com/blog/regularly-scheduled-website-audits</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/regular-website-audits.jpg?w=1600&amp;h=900&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666734082&amp;s=39d1b79c919c19e7f9b7103054132953" alt="Regularly scheduled website audits">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>I recently wrote '<a href="https://simplygoodwork.com/blog/how-to-use-google-analytics-to-improve-your-website">How to use Google Analytics to improve your website</a>,' an article about making strategic website planning decisions by prioritizing, tracking and analyzing your goals with Google Analytics.</p><p>I'd like to continue the theme of making informed website decisions by hopping over to another data-driven topic: website audits. Website audits come in a variety of shapes and sizes, but the ones I find most useful are geared towards Accessibility, Technical SEO, Speed and Design.</p><p><a href="https://simplygoodwork.com/blog/continuous-improvements-over-website-redesigns">Continuously improving your website</a> by performing these four types of website audits will not only keep your website more relevant between completing traditional website redesigns, but also improve the usability of your website for your customers and help with search engine optimization. Website audits are similar to vehicle checkups and oil changes, and should be completed every few thousand miles to better align your website for future relevancy.</p><h2>What is an Accessibility Audit?</h2><p>Website accessibility is the process of designing and developing your website in a way that allows easier use for people with disabilities. In some instances, website accessibility is a legal requirement, but even when it's not we should strive to have accessible websites. Last year Gavin, one of our developers, wrote an in-depth article about '<a href="https://simplygoodwork.com/blog/web-accessibility-ada-compliance">Website Accessibility &amp; ADA Compliance</a>' that provides a great introduction into the topic.</p><p>Since website accessibility is based heavily on content, you should complete regularly scheduled accessibility audits the more often you update your website. At a minimum, standard marketing websites should probably complete quarterly, or bi-yearly, audits, while websites that have a constant stream of new content and updates might need to schedule these audits on a monthly basis.</p><p>The quickest way to review your website's current accessibility standing is to utilize the <a href="https://wave.webaim.org/extension/">WAVE web accessibility evaluation tool</a>.</p><h2>What is a Technical SEO Audit?</h2><p><a href="https://simplygoodwork.com/blog/technical-seo-checklist">Technical SEO</a> is the search engine optimization work that needs to be completed outside of link building and content creation, and is a major component of the ranking signals that search engines like Google use in their algorithms. Things like website speed, security, usability and code structure all fall under the Technical SEO category. While this is very important to consider in the website building phase, you need to keep an eye on the status of your Technical SEO issues fairly regularly.</p><p>There are a variety of available tools that make it easy to automatically complete Technical SEO audits, and we utilize <a href="https://www.semrush.com/lp/seo-tools/en/?ref=8755903862&amp;refer_source=gw_blog_article&amp;utm_source=berush&amp;utm_medium=promo&amp;utm_campaign=link_seo_tools">SEMrush</a> at Good Work.</p><h2>What is a Website Speed Audit?</h2><p>People expect websites to load quickly. The exact statistics change year over year, but in general you can expect to see a ~10% loss in page views, customer satisfaction and conversions from just one second of extra load time. Like Technical SEO, there is a lot of work that can be completed when building your website to address these issues, but it’s important to schedule regular speed audits as your website evolves. Things like image sizes, unoptimized template logic from new features and code snippets from your marketing tools can have a significant impact on post-launch website speed.</p><p>One way to stay ahead of this issue is incorporating a website performance budget into your digital plan. A website performance budget is a set of constraints you put on your website to help ensure your pages stay nice and performant. For instance, your website performance budget could include maximum image/video sizes per page, or more generally a page load time that you can never exceed. Mozilla provides <a href="https://developer.mozilla.org/en-US/docs/Web/Performance/Performance_budgets">a good overview of performance budgets</a> if you’re interested in learning more. You can also use <a href="https://developers.google.com/web/tools/lighthouse">Google Lighthouse</a> to test the speed of your website on desktop and mobile.</p><h2>What is a Website Design Audit?</h2><p>A website design audit is the act of combing through your website on a regular basis to find opportunities for improvement. This may include finding newer and better ways of doing something you've done in the past, considering new features based on real use cases and how to implement them, or just a general tightening of your design system to keep the details from falling apart over time.</p><p>So, how do you get started? Well, it’s pretty easy. You can get 80% of the way there with your Accessibility, Technical SEO and Speed audits by using the out-of-the-box tools I mentioned above. Auditing your website from a design perspective is as easy as setting up a prioritization meeting with your design team and scheduling in the work.</p><p>Completing a combination of each of the above audits on a regular basis will help ensure your website is doing its job in relation to your businesses goals, whether that's selling widgets or a service, or simply offering visitors a place to read the news.</p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>How to use Google Analytics to improve your website</title>
                <link>https://simplygoodwork.com/blog/how-to-use-google-analytics-to-improve-your-website</link>
                <pubDate>Mon, 17 Feb 2020 06:30:00 -0600</pubDate>
                <author>Garrett Winder</author>
                <guid>https://simplygoodwork.com/blog/how-to-use-google-analytics-to-improve-your-website</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/goodwork-article-image-googleanalytics-2.jpg?w=1600&amp;h=900&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666734125&amp;s=05bf5d1858bad7086d84a44670f5d24f" alt="How to use Google Analytics to improve your website">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>Digging through Google Analytics to track your website’s performance can be an overwhelming and confusing process. It's easy to base decisions on general statistics like Bounce Rates and Website Visitors, but if we dig a little further there's loads of useful data that can help guide your website improvements.</p><p>I recently completed this process to help plan out requirements for the future of our website, and decided to document the process for future me (and future you, too).</p><p>P.S. If you don’t already have Google Analytics setup on your website, you’ll need to do that first. I also recommend that your website is in a good place from a <a href="https://simplygoodwork.com/blog/technical-seo-checklist">Technical SEO</a> standpoint before applying any of the learnings that you gain from this article.</p><p>P.S.S. If you're looking to get super analytical today, this article probably isn't for you. This is the 'Non-Marketers Marketing Overview to not using too much math but getting 80 percent of the way there.’</p><p>Let’s get to it, shall we?</p><h2>1. Prioritize your website goals</h2><p>The first step is deciding what hard actions you want your website visitors to take when they visit. The usual suspects for non-commerce websites are things like: fill out your contact form, subscribe to your newsletter, apply for a job or download a resource. As you go through this process it can be quite eye-opening, as your list and sitemap might not mesh. Unearthing these discrepancies is one of the primary reasons for this exercise.</p><p>To get your creative juices flowing, here's the list I created for our website:</p><ol><li>Fill out the contact form</li><li>Subscribe to the newsletter</li><li>Email us</li><li>Call us</li></ol><p>You also want people to learn more about you, what you do, and if you have a blog you want them to read your articles, but it's important to remember this is all just supporting content.</p><p>If your supporting content is right then more people complete the goals you've set for them. If your supporting content is wrong then less people complete the goals you've set for them.</p><h2>2. Tracking your website goals in Google Analytics</h2><p>Now that you've set your goals it's time to figure out how to track them appropriately in Google Analytics. There are a few ways to do this. You can use <a href="https://support.google.com/analytics/answer/1012040?hl=en">Goals</a> (literally), <a href="https://support.google.com/analytics/answer/1033068?hl=en">Events</a>, or <a href="https://support.google.com/analytics/answer/1033068?hl=en#eventsgoals">Event Goals</a>.</p><p>A <em>Goal</em> in Google Analytics tracks successful conversions, and usually can be measured as revenue earned per conversion. An <em>Event</em> in Google Analytics allows you to track actions on your website that aren't necessarily revenue related, but are still important to the overall health of your website. Lastly, <em>Event Goals</em> are a type of Goal that have a specific Event as the conversion.</p><h3>Destination Goals</h3><p>For goals like contact form submissions and newsletter signups, hopefully users are directed to a 'Thank You' page once they've successfully completed your form(s). If this is the case, the easiest way to set this up in Google Analytics is with a <em>Destination Goal</em>. You can learn more about this process by following the <a href="https://support.google.com/analytics/answer/1032415">Create, edit, and share goals</a> documentation on Google’s website. If you don't have a 'Thank You' page, you'll most likely need to use Event Tracking, which I'll explain in 3, 2, 1...</p><h3>Event Tracking</h3><p>For goals like tracking call-ins and emails (or forms that don't have a 'Thank You' page), the easiest way to set this up in Google Analytics is with <em>Event Tracking</em>. Events are slightly more technical in implementation than <em>Goals</em>, but if you have Google Tag Manager setup it will make your life quite a bit easier. You can learn more about this process by first <a href="https://support.google.com/tagmanager/answer/6107124?hl=en&amp;ref_topic=6333310">Deploying Google Analytics with Tag Manager</a>, and then following <a href="https://support.google.com/tagmanager/answer/6106716?hl=en&amp;ref_topic=6333310">Tag Manager's Google Analytics events</a> documentation.</p><h2>3. Analyze and act on the data</h2><p>Once you are officially tracking all of your goals in Google Analytics, it's time to analyze and act on the data. Let's start with your <em>Destination Goals</em> for things like contact form submissions and newsletter signups.</p><p>Log into Google Analytics and go to Conversions &gt; Goals &gt; Goal URLs. Click the URL you're interested in (in my case it's <code>contact/thanks</code>) and adjust the date range to the timeframe you're interested in viewing. Click the 'Secondary Dimension' dropdown above the table and choose either 'Goal Previous Step - 1’ or 'Goal Previous Step - 2', whichever is relevant.</p><p>In my example I know that people have to visit <code>/contact</code> before they visit <code>contact/thanks</code>, and I want to know what triggered them to contact us, so I want to use 'Goal Previous Step - 2' (the page before <code>/contact</code>).</p><p>Secondly, let's look at our <em>Event Tracking</em>. Log into Google Analytics and go to Behavior &gt; Events &gt; Overview, click into whichever depth of detail you're interested in viewing (either Category, Action or Label) and then choose the actual <em>Event</em> you want to analyze. Click the 'Secondary Dimension' dropdown above the table and choose the relevant dimension. 'Page' is a good one for events that are on multiple pages, while 'Landing Page' could also be helpful to show where people originally landed on your site that led them to complete an action.</p><p>As you're digging through all of this information it's important to ask questions like:</p><ol><li>What supporting content (pages) is generating the most (and least) goal and event conversions?</li><li>On pages with lower conversions, are they useful in another way or could they be improved to be more useful?</li><li>If people are signing up for your newsletter from blog post pages, what type of posts are doing the best and what are doing the worst?</li><li>Are any specific types of content doing significantly better or worse than their siblings (e.g. of your six case studies, is one converting fantastically, is one doing horrible or are they all generally the same)?</li></ol><p>Asking these sorts of questions, backed by real data, will help you to make better decisions when planning improvements to your website and writing content, whether it's completing a full redesign or simply making tweaks across the board.</p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>Six steps to a successful designer to developer handoff</title>
                <link>https://simplygoodwork.com/blog/six-steps-to-a-successful-designer-to-developer-handoff</link>
                <pubDate>Tue, 28 Jan 2020 06:30:00 -0600</pubDate>
                <author>Ariel Kidwell</author>
                <guid>https://simplygoodwork.com/blog/six-steps-to-a-successful-designer-to-developer-handoff</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/successful-design-handoff.jpg?w=1600&amp;h=900&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666734146&amp;s=b5138590909c5b0cbabe09fe189da473" alt="Six steps to a successful designer to developer handoff">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>You’ve spent months on the design of your new website. You’ve been there for every email thread and conference call, reviewing color choices, user experience and content management system (CMS) functionality. The last step is packaging up the design files for your development team to bring the website to life. It’s at this crucial step that a website project’s success is determined.</p><p>A successful design to developer handoff extends far beyond a Dropbox link to layered Photoshop (PSD) files. It’s time to take a step back and ensure that your development team is walking into this project with the information they need to create the website promised to your stakeholders. Don’t allow them to make assumptions. We all know the common monicker about what happens when you assume something. Instead, create clear documentation throughout the design process that sets you and your development team up for success. Also, if you’re creating this documentation the day before the handoff, it’s probably too late, and you’ll probably forget something important. Ongoing information gathering and documenting is key during the design process to ensure a smooth transition into development.</p><p>Below are six key checkpoints to ensure a successful website development execution after a design handoff. Each project is unique, but utilizing a combination of the tools below will ensure your team creates the desired website once you move into quality assurance and launch.</p><h2>Design files</h2><p>Depending on how exact you want your breakpoints to be, provide Desktop, Mobile and Tablet design files. It is also helpful to include all default HTML elements such as headings, bullet and numbered lists and block quotes to ensure the content on long-form pages is formatted correctly as real content gets entered.</p><h2>Ensure web-friendly fonts are in order</h2><p>Make sure chosen fonts are web-friendly and include pre-purchased license details and files if applicable. Also, convert font icons to outlines in your design files.</p><h2>Export assets</h2><p>Export assets such as graphics, icons and photography used in the design into a separate folder for the handoff to ensure they’re exported to your liking and to save time in development.</p><h2>Document functionality requirements</h2><p>Clarifying how flat designs are expected to come to life in development is a key communication piece during this handoff. As you and your stakeholders make decisions, or voice preferences for animations, hovers, links, forms, etc., keep a living document that records these decisions as they’re made throughout the design process. This can be done in a spreadsheet, Word document or whatever medium you prefer.</p><p>You can either present these notes to your development team during the handoff, or better yet, turn them into an annotated PDF of the designs to make it as clear as possible. This prevents any confusion about the expectations that have been set. Again, if you record these requirements as decisions are made it ensures nothing is forgotten, which can happen if you try to remember everything at the end of the design process.</p><h2>Document CMS expectations</h2><p>Similar to the Functionality Requirements, keep a log of the content management system (CMS) expectations as you work through the design process with your stakeholders. Your development team’s default will be to build the CMS specifically for the designs. This is done to ensure the website content editors don’t have so much freedom that they can break your design. The development team could also go down an hours-long rabbit hole guessing what possible options your content editors could want, so to save budget, the development team will usually stick to the hard facts. Do your stakeholders expect color options for the headers, or for a certain page to be built modularly so they can drag and drop content areas? All of these unique expectations need to be notated per template, as well as any options such as multiple colors, image sizes and text/image placements.</p><h2>Organize 3rd-party logins</h2><p>There is likely a selection of login details that your development team will need available to them at some stage of the project. The best time to provide that information is at the beginning, saving you from having to dig them up midway through the project. These logins typically include domain name server, hosting, third-party integrations and email subscription accounts. Hand over these sensitive details in whatever manner you are most comfortable with, and trust they’re in safe hands with your development team.</p><p>Implement these six steps in your design to developer handoff for your next web project, and please buy me a coffee if it does wonders. :)</p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>Quick Start: Developing a Craft 3 Plugin</title>
                <link>https://simplygoodwork.com/blog/quick-start-guide-developing-a-craft-3-plugin</link>
                <pubDate>Mon, 13 Jan 2020 10:11:00 -0600</pubDate>
                <author>Jake Dohm</author>
                <guid>https://simplygoodwork.com/blog/quick-start-guide-developing-a-craft-3-plugin</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/goodwork-article-image-craftplugin.jpg?w=1600&amp;h=900&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666734177&amp;s=6a201f71d5ef85a22a922c4166f9741a" alt="Quick Start: Developing a Craft 3 Plugin">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>Creating a plugin for Craft CMS can be intimidating, but if you’re comfortable developing with Craft, we believe you’re 100% ready to take the leap! The following guide is a step-by-step process for creating and installing a Craft 3 plugin in just minutes.</p><h2><strong>Creating Your Plugin</strong></h2><h3><strong>Step #1: Create a plugin skeleton</strong></h3><p><a href="https://pluginfactory.io/">Plugin Factory</a> is an amazing tool that allows users to create a basic plugin framework that you can build on, and we highly recommend using it as a starting point. If you'd rather build out your plugin from scratch, you can refer to the<a href="https://docs.craftcms.com/v3/extend/plugin-guide.html#setting-up-the-basic-file-structure"> Craft docs</a> to set up the basic plugin structure.</p><h3><strong>Step #2: Register your plugin with Composer</strong></h3><p>When developing a plugin you’ll want to work on it locally, without registering it with something like <a href="https://packagist.org/">Packagist</a>, so that you don't have to push releases every time you make a change. To install a local plugin as a package you'll need to make a few changes to your composer.json file. Add the following to your composer.json (replacing the "url" with the relative path to the plugin):</p>
</div>

                                            

            

<div class="block max-w-2xl mx-auto">
  <pre class="language-javascript">
    <code class="prism language-javascript">
      {
  &quot;minimum-stability&quot;: &quot;dev&quot;,
  &quot;prefer-stable&quot;: true,
  &quot;repositories&quot;: [
    {
      &quot;type&quot;: &quot;path&quot;,
      &quot;url&quot;: &quot;./plugins/my-plugin-name&quot;
    }
  ]
}
    </code>
  </pre>
</div>

                                            <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <h3><strong>Step #3: Require your plugin</strong></h3><p>While Composer now knows where to find your plugin, it still hasn't been installed by Composer. We can "require" our plugin with Composer, just like we would a published package using the plugin's package name. To find the package name look at the composer.json file inside of your plugin folder. The name property is the package name. Once you've found the package name, run composer require package-name to add your plugin.</p><p><strong>Tip</strong>: Your plugin's name should look something like this: simplygoodwork/my-plugin-name</p><p>Because of the configuration we added in the above step, Composer will create a symlink to your plugin instead of attempting to download it from the registry like it normally would.</p><h3><strong>Step #4: Install your plugin</strong></h3><p>Your plugin should now be successfully installed by Composer, but we still need to install it with Craft. Login to your Control Panel, navigate to Settings &gt; Plugins, and install the plugin.</p><p><strong>Tip</strong>: To test whether your plugin is working, place some "dump and die" code within your plugin's init method, like this:</p>
</div>

                                            

            

<div class="block max-w-2xl mx-auto">
  <pre class="language-javascript">
    <code class="prism language-javascript">
      /* File: ./plugins/barracuda/src/Barracuda.php */

// ...

public function init() {
  print(&quot;Testing Plugin!&quot;);
  die();
}

// ...
    </code>
  </pre>
</div>

                                            <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>If your plugin is properly installed it should show ​“Testing Plugin” on a blank page when you try to visit your website or Control Panel.</p><h3><strong>Step #5: Profit</strong></h3><p>You’re done! When you’re ready to publish your plugin to be publicly accessible, follow this guide in the Craft docs:<a href="https://docs.craftcms.com/v3/extend/plugin-store.html"> https://​docs​.craftcms​.com/​v​3​/​e​x​t​e​n​d​/​p​l​u​g​i​n​-​s​t​o​r​e​.html</a></p><p>Plugins allow you to extend the core functionality of your Craft website, and there are hundreds already available through Craft’s plugin store (<a href="https://simplygoodwork.com/articles/top-craft-cms-plugins-used-at-good-work">including some of our favorites</a>). However, there are times when creating your own plugin can not only solve your own needs, but hopefully provide a valuable tool for other Craft websites. Hopefully this guide kickstarts that process!</p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>A guide to improving your website in the new year</title>
                <link>https://simplygoodwork.com/blog/a-guide-to-improving-your-website-in-the-new-year</link>
                <pubDate>Wed, 18 Dec 2019 06:30:00 -0600</pubDate>
                <author>Garrett Winder</author>
                <guid>https://simplygoodwork.com/blog/a-guide-to-improving-your-website-in-the-new-year</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/goodwork-article-image-guide2020-2.jpg?w=1600&amp;h=900&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666108519&amp;s=33f69b93aec2a600ea62c4182b0d7f60" alt="A guide to improving your website in the new year">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>‘Tis the season to reflect on the previous year and begin planning our future business goals and the projects we’ll need to tackle - both online and offline - to help us get there. I don’t know about you, but given the fact we’re entering not only a new year, but a new decade, this planning season feels especially important.</p><p>Over the last few weeks our team has been compiling survey results and creating bullet point after bullet point of things we want to accomplish to help us reach our goals. On the digital front, we have a few broad tasks we want to continually manage in order to stay ahead of the game and fend off the robots from taking over. We recently packaged this into <a href="https://simplygoodwork.com/maintenance">a new partnership offering for our clients</a>, but I wanted to share it here as well. I hope you find this as helpful for your business in the coming year as we have for ours.</p><h2>Regularly scheduled website audits</h2><p>As your website continues to expand and grow, it’s important to ensure it’s still in good standing from a technical SEO, accessibility, speed and design standpoint. Next year we will run monthly technical SEO audits on our website, and quarterly accessibility, speed and design audits.</p><p>When your website continually evolves like ours, it’s important to look under the hood every once in a while and schedule a tune-up. In the fast-paced environment that is digital, regularly scheduled website audits are required to have a seat at the table.</p><p><strong>Holiday reading material</strong>:</p><ul><li><a href="https://simplygoodwork.com/blog/regularly-scheduled-website-audits">Regularly scheduled website audits</a></li><li><a href="https://simplygoodwork.com/blog/technical-seo-checklist">Technical SEO Checklist</a></li><li><a href="https://simplygoodwork.com/blog/web-accessibility-ada-compliance">Website Accessibility and ADA Compliance</a></li></ul><h2>Ongoing maintenance and continuous improvements<br /></h2><p>Over the last year we’ve made a concerted effort to continuously improve our website on a monthly basis, ensuring our website is always presenting the best version of itself. Through iterative changes over the last 12 months we’ve seen significant improvements in engagement, how clients perceive our brand, and overall value our website brings to our business. Next year we’ll continue to improve, build on and prune our website as we always have.</p><p>Testing the right blend of infrastructure updates, website audits and continuous improvements is viable in ensuring our website brings the most value to our business at any given time. The most important thing is making sure we never let it go stagnant.</p><p><strong>Holiday reading material</strong>:</p><ul><li><a href="https://simplygoodwork.com/blog/how-to-use-google-analytics-to-improve-your-website">How to use Google Analytics to improve your website</a></li><li><a href="https://simplygoodwork.com/blog/continuous-improvements-over-website-redesigns">Continuous improvements over website redesigns</a></li><li><a href="https://simplygoodwork.com/blog/successful-website-development-process">A successful website development process</a></li></ul><h2>Updating your websites to Craft CMS 3 (and beyond!)</h2><p>Back in March I wrote an article about <a href="https://simplygoodwork.com/blog/updating-your-website-to-craft-cms-3">updating to Craft CMS 3</a> and the official end-of-life for Craft 2. Not only is Craft 3 packed with new features like speed improvements, better image editing and multi-site manager, but Craft 2 will no longer be supported after January 31, 2020.</p><p>But wait, there’s more! Craft 4 is also on the horizon, launching sometime next year. Making sure your website is on the latest version of Craft will ensure a much smoother transition to Craft’s newest version. Craft 4 development is still underway, but we know it will focus on important features like accessibility, collaboration (think Google Docs) and overall author experience.</p><p>Keeping Craft CMS (and any relevant website plugins) updated on a monthly basis gives us the peace of mind that our website is as secure as possible, and all of the latest features are available to our team.</p><p><strong>Holiday reading material</strong>:</p><ul><li><a href="https://simplygoodwork.com/blog/updating-your-website-to-craft-cms-3">Updating your website to Craft CMS 3</a></li><li><a href="/craft-cms#highlights">Why we love Craft CMS</a></li><li><a href="https://simplygoodwork.com/maintenance">Ongoing Craft CMS Maintenance Plans</a></li></ul><p>While our team is no stranger to website design and development projects that begin at square one, we always recommend continually auditing and improving your website on a consistent basis so redesign projects are needed less frequently. It’s not only easier to budget, it ensures your website is always acting as the best version of itself and performs its best in relation to your internal goals. Following the above recommendations is a great start.</p><p>Hopefully this guide proves helpful in planning your digital checklist and goals in the new year. Cheers to a successful 2020!</p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>Building blazing fast websites with Gridsome</title>
                <link>https://simplygoodwork.com/blog/building-blazing-fast-websites-with-gridsome</link>
                <pubDate>Tue, 26 Nov 2019 06:30:00 -0600</pubDate>
                <author>Jake Dohm</author>
                <guid>https://simplygoodwork.com/blog/building-blazing-fast-websites-with-gridsome</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/goodwork-article-image-gridsome.jpg?w=1600&amp;h=900&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1667239073&amp;s=e967f349040bd74b0fd5654c77678861" alt="Building blazing fast websites with Gridsome">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>Vue.js is an amazing library for building user interfaces, but it (purposefully) lacks some of the bells and whistles of a full framework. That’s where Gridsome comes in! Gridsome is a framework built on top of Vue that provides features like pre-rendering, a centralized GraphQL data store and a plethora of performance and developer experience improvements out of the box.</p>
<h2>What is Gridsome?</h2>
<p>The Gridsome team describes it in this way:</p>
<blockquote><p>“Gridsome makes it easy for developers to build modern websites, apps and PWAs that are fast by default &#x1f680;.”</p></blockquote>
<p>Gridsome is also a <a href="https://jamstack.org/" target="_blank" rel="noreferrer noopener">JAMstack</a> framework. If you're not familiar with JAMstack, here's a short description from their website:</p>
<blockquote><p>“The JAMstack is a tech stack to help you create fast and secure sites and dynamic apps with JavaScript, APIs and pre-rendered markup served without web servers.”</p></blockquote>
<p>Gridsome can do many things, but building static websites is one of its core tenets.</p>
<h2>What is a "static website"?</h2>
<p>To understand static websites it's helpful to understand the entire landscape. There are three primary ways to build Vue applications:</p>
<ol><li><strong>Client-side</strong>: Client-side applications are rendered completely in the browser. This comes with advantages, especially for highly dynamic applications, but it also has the occasional downside of being less performant and potentially SEO unfriendly.</li><li><strong>Server-side</strong>: Rendering your Vue application on a Node server, instead of in the browser, addresses SEO problems and can help with performance. However, server-rendering makes scaling your application harder since you have to run Node servers to handle all of your requests.</li><li><strong>Static (pre-rendered)</strong>: Fully pre-rendering your Vue application into HTML/CSS comes with many benefits, like incredible performance, built-in SEO, increased security and easy scalability.</li></ol>

<h2>Why build static sites with Gridsome?</h2>
<p>Gridsome really shines in three main ways: developer experience, user experience and business concerns.</p>
<h3>#1: Developer Experience &#x1f469;‍&#x1f4bb;</h3>
<p>&#x1f50c; <strong>The Plugin Ecosystem</strong>: Gridsome allows developers to create and open-source plugins for Gridsome. Plugins can do anything from pulling in a feed of your tweets to automatically inlining critical CSS!</p>
<p>&#x1f4c4; <strong>Source Plugins</strong>: Source plugins allow you to seamlessly pull your content in from any source: APIs, markdown files, or even a CMS. Gridsome has official first-party plugins for many common CMS's, like WordPress, Contentful and Sanity to name a few.</p>
<h3>#2: User Experience ⚡️</h3>
<p>✨ <strong>Pre-rendered HTML</strong>: Gridsome takes your content, templates and interactivity and builds out HTML and CSS pages that work <em>without</em> JavaScript. This matters for three reasons:</p>
<ol><li><strong>Performance</strong>: The browser is <strong>best and fastest</strong> at rendering out HTML directly.</li><li><strong>Search Engine Optimization</strong>: All the content and meta information (like tags) is already in the HTML of each page, so search engine's crawlers can quickly and easily crawl it.</li><li><strong>Progressive Enhancement</strong>: If your application is client-side rendered, you're out of luck if someone has JS disabled, or JS hasn't yet runs on the page. When your HTML is pre-rendered, JS is not required.</li></ol>
<p>&#x1f3a9; <strong>Automatic code-splitting</strong>: Because Gridsome knows about your templates, data and<em> </em>routes it can intelligently build page-specific bundles of code so you're never loading unneeded code.</p>
<p>&#x1f49c; <strong>PRPL pattern</strong>: PRPL is a pattern for structuring and serving Progressive Web Apps (PWAs), with an emphasis on the performance of app delivery and launch. Learn more <a href="https://developers.google.com/web/fundamentals/performance/prpl-pattern/" target="_blank" rel="noreferrer noopener">here</a>.</p>
<p>&#x1f9e0; <strong>Smart link prefetching</strong>: Gridsome knows which pages link to other pages, so when a link to another page comes into view Gridsome automatically loads that page in the background making the page change almost instantaneous when the link is clicked.</p>
<p>&#x1f304; <strong>Progressive image loading</strong>: Gridsome has a built-in component for automatic progressive image support. This component renders an ultra-compressed image before the image is ✨ magically ✨ lazy-loaded when in view.</p>
<p>&#x1f30d; <strong>CDN-based hosting for lightning speeds</strong>: The output of Gridsome build is completely static files that can be hosted anywhere, no LAMP stack required. This also means that your website can be hosted on the edge of a CDN so that it can be cached and quickly accessed from any location!</p>
<h3>#3: Business Concerns &#x1f4c8;</h3>
<p>&#x1f512; <strong>Security</strong>: If your content lives in a CMS and it's publicly accessible, it can cause security issues. If you don't believe me, Google "WordPress hacked." When working with the JAMstack it's usually only necessary for your build process to query your backend for content. You can put your backend behind a strict firewall, or within your intranet, to decrease the surface area of possible attacks and vulnerabilities.</p>
<p>&#x1f4b8; <strong>Scalability</strong>: As mentioned earlier, Gridsome outputs fully static files that <strong>don't</strong> <strong>require servers</strong>. This makes scaling your website or application simpler and cheaper because you're not scaling up servers to handle the request load.</p>
<h2>Further Reading</h2>
<p>Gridsome is great for building static sites that are performant and secure, and it's easy and fun for development teams to work with. If you're interested in developing with Gridsome, below are some additional resources:</p>
<ul><li><a href="https://gridsome.org" target="_blank" rel="noreferrer noopener">Gridsome Documentation</a></li><li><a href="https://scotch.io/tutorials/getting-started-with-gridsome" target="_blank" rel="noreferrer noopener">Getting Started with Gridsome</a></li><li><a href="https://www.leveluptutorials.com/tutorials/static-vue-with-gridsome" target="_blank" rel="noreferrer noopener">Static Vue With Gridsome</a> (video tutorial)</li><li><a href="https://simplygoodwork.com/blog/quick-start-gridsome-craft-cms-graphql-api">Quick Start: Gridsome + Craft CMS GraphQL API</a></li></ul>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>Continuous improvements over website redesigns</title>
                <link>https://simplygoodwork.com/blog/continuous-improvements-over-website-redesigns</link>
                <pubDate>Fri, 15 Nov 2019 06:30:00 -0600</pubDate>
                <author>Garrett Winder</author>
                <guid>https://simplygoodwork.com/blog/continuous-improvements-over-website-redesigns</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/Continuous-improvements-over-website-redesigns.png?w=1600&amp;h=900&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1667239022&amp;s=8884ac68f828a8808eb69e9c676b71c1" alt="Continuous improvements over website redesigns">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>In today's world it's no longer viable to complete a website redesign process with the expectation that you're <em>done</em> upon launch. Modern websites are a living, breathing part of your sales and marketing ecosystem, and need to be continually nurtured to ensure optimal performance and relevancy for both internal and external visitors.</p>
<p>This requires us to throw the standard "redesign every X years" approach into the fire and take a modern, two-pronged approach.</p>
<figure><img src="https://optimise2.assets-servd.host/good-work/production/blog/Continuous-Improvements-Over-Website-Redesigns/2D7468DB-CF44-44BD-91DD-A56F0BBF64D1.png?w=1300&h=1115&auto=compress%2Cformat&fit=crop&dm=1655133933&s=7d46145676a6b3f73d8c0077d1c6c1fb" alt="Website relevancy over time with continuous improvements v.s. traditional redesign cycles" /></figure>
<h2>Create a future-proof design system</h2>
<p>Creating your website with a future-proof design system and architecture, that can expand and grow with your business without falling apart, provides a foundation that prevents the need to start fresh again every few years. By designing with the future in mind, and taking a systematic approach, you can build out your website </p>
<p>quicker and more consistently over time.</p>
<p>A few examples of great design systems are:</p>
<ol><li><a href="https://www.ibm.com/design/language/">IBM</a></li><li><a href="https://polaris.shopify.com/">Polaris</a> by <a href="http://shopify.com/">Shopify.com</a></li><li><a href="https://orbit.kiwi/">Orbit</a> by <a href="http://kiwi.com/">Kiwi.com</a></li></ol>
<p>Design thinking and <a href="https://en.wikipedia.org/wiki/Systems_design#See_also">systems design</a> has been around forever, but it wasn't until the last decade, as the Wild West of the web matured like other industries, that it became a consideration in digital. As we near the end of 2019 the majority of design teams already take this approach, however, if they aren't (and for no good reason) it’s a red flag.</p>
<p>Smart systematic design doesn't have to constrain design liberties, either. Take our recent work with <a href="https://simplygoodwork.com/case-studies/oklahoma-christian-university">OC</a> and <a href="https://simplygoodwork.com/case-studies/posh-couture-rentals">POSH</a> for example.</p>
<h2>Continuously improve your website</h2>
<p>After launching your new systematic, future-proof website it's important to facilitate ongoing partnerships with your design, development and marketing teams to focus on continual performance improvements, new features, and general development based on your ever-changing business needs. This can be done with your existing team(s), or a business like Good Work that specializes in post-launch aftercare and long-term partnerships.</p>
<p>While the design process involves in-depth research and discovery, the way in which it's digested by your consumers is mostly guesswork until the day your website launches and starts engaging users. Edge-cases start to reveal themselves, <a href="https://simplygoodwork.com/blog/how-to-use-google-analytics-to-improve-your-website">new features or user-journey ideas pop up based on usage</a>, and the way your business stays relevant in a digital space continues to evolve. The list goes on. To stay relevant and ensure the most value out of your website you must continually nurture it post-launch.</p>
<h2>Summary</h2>
<p>Whether you deploy a redesign process every few years, or engage a partner on a <a href="https://simplygoodwork.com/maintenance">continual maintenance improvement plan</a>, the costs are fairly similar. However, the ROI on a maintenance plan is exponentially better. Redesigning every X years creates long stretches of irrelevancy and stagnant, sometimes broken, content that isn't good for anyone (including search engines).</p>
<figure><img src="https://optimise2.assets-servd.host/good-work/production/blog/Continuous-Improvements-Over-Website-Redesigns/A04D9298-2EBD-47E9-B36E-6336C6AE8791.png?w=1490&h=1146&auto=compress%2Cformat&fit=crop&dm=1655133939&s=0ebb6db9da8f973dc2bfe3ceec79a454" alt="Missed value and ROI during a single website redesign cycle v.s. continuous website improvements" /></figure>
<p>The web is a faster-paced world than ever before, and while ensuring your website is always presenting the best version of itself may seem like a huge barrier to overcome, it actually presents opportunities to build stronger connections with your customers. By treating your website as a living, breathing thing rather than an off-the-shelf product, businesses can remain ahead of the curve and offer website visitors a superior user experience to their competitors. Launching your website is step one - now it's up to you to ensure your website remains relevant and continually meets your goals.</p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>A somewhat unbiased reflection on why you should stop using IE11</title>
                <link>https://simplygoodwork.com/blog/a-somewhat-unbiased-reflection-on-why-you-should-stop-using-ie11</link>
                <pubDate>Wed, 30 Oct 2019 00:00:00 -0500</pubDate>
                <author>Ariel Kidwell</author>
                <guid>https://simplygoodwork.com/blog/a-somewhat-unbiased-reflection-on-why-you-should-stop-using-ie11</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/goodwork-article-image-internetexplorer.jpg?w=1600&amp;h=900&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666108743&amp;s=5094d25c486ba3a585f0d0e5d7866b24" alt="A somewhat unbiased reflection on why you should stop using IE11">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>For many of us, Internet Explorer (IE) was our first web browser experience, providing a simple double click from accessing the wonders of the internet and connecting us to the world in an entirely new way. It replaced our encyclopedias, helped us write our high school papers and was likely preloaded on the computer at our first job. It dominated the market share upon its arrival and represented around 90 percent of browsers used.<br /></p><p>Twenty years later IE has struggled to remain relevant, representing <a href="https://www.w3counter.com/globalstats.php">only about 3 percent</a> of the browser market. Its existence is linked to Windows 10, the <a href="https://support.microsoft.com/en-us/help/13853/windows-lifecycle-fact-sheet">final version of Windows</a> - ever - and will essentially survive until the end of time with minimal technical updates every six months. It’s slow, painful death has created a variety of issues for those who continue using it, with security risks being at the top of the list. In April, a security researcher <a href="https://mashable.com/article/internet-explorer-hacker-windows-pc-exploit/">discovered a security flaw</a> that allows hackers to steal Windows user’s data thanks to IE. Users don’t even have to open the now-obsolete web browser for malicious actors to exploit their data, it just needs to exist on their computer. Just last September, Microsoft <a href="https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2019-1367">released a notice</a> of serious security vulnerability.</p><p>Not only has IE fallen from grace amongst most consumers, Microsoft’s own security experts have published articles warning people from using it as their default browser. In his article titled, “<a href="https://techcommunity.microsoft.com/t5/Windows-IT-Pro-Blog/The-perils-of-using-Internet-Explorer-as-your-default-browser/ba-p/331732">The Perils of Using Internet Explorer as Your Default Browser</a>,” Microsoft cybersecurity expert, Chris Jackson, urges people to stop using it, explaining that it is now more accurately a compatibility solution to help with older sites that should be updated for modern browsers. Because IE is no longer being developed to support current web standards, the process of developing modern websites for IE compatibility is a nightmare, if not impossible. In some best-case scenarios, development can be simplified down to its basic elements allowing it to function in IE, but doing so creates significant disadvantages for the user experience.</p><p>As a development agency we must approach the challenges related to IE through two lenses. As developers, IE is archaic, difficult to work with and potentially dangerous for our clients. Due to these reasons it is no longer included as a tested browser in our standard contracts. However, as a partner to our clients, we recognize that IE compatibility is sometimes a necessary evil. Many corporations continue to use it as a default browser (despite Microsoft’s own warnings), and preparing for a user to view a website in IE might take priority based on the industry.</p><p>The most cost-effective approach for corporations to circumvent website visitors from viewing their site in IE is applying a banner to any page visited when a website detects someone is viewing it in IE. The banner copy will recommend the site be viewed in the most recent version of Chrome, Firefox, Safari or Edge. If this isn’t a satisfactory solution for our clients, we typically work on a case-by-case basis to determine the best route to provide a functional site in IE. This typically involves removing most of the bells and whistles of the front-end experience, and potentially editing some core website functionalities. It’s worth noting that it has become an industry standard to charge a 20 percent (or more) tax for IE testing and implementation, as this process can add extensive time to a project’s scope. This may be a worthwhile investment for some clients, and if this route is chosen we work with them to map out expectations and adjust both the scope and timeline to accommodate IE testing. </p><figure><img src="https://simplygoodwork.com/uploads/blog/The-Memes-Which-Came-After-Internet-Explorer-s-Death-476497-9.jpg" alt="SpongeBob SquarePants Internet Explorer joke gif" /></figure><p>Internet Explorer will continue to be an immortal ghost that haunts the halls of Microsoft and the corporations that continue utilizing it. Eventually it will become a thing of lore that developers use as jokes at conferences, and the snarky memes currently poking fun will become nostalgic. Until then, take this knowledge back to your marketing teams, IT groups and leadership and help us make this a better, Internet Explorer-free digital world.</p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>A successful website development process</title>
                <link>https://simplygoodwork.com/blog/successful-website-development-process</link>
                <pubDate>Tue, 15 Oct 2019 00:00:00 -0500</pubDate>
                <author>Garrett Winder</author>
                <guid>https://simplygoodwork.com/blog/successful-website-development-process</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/goodwork-website-development-process.jpg?w=1600&amp;h=900&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666883321&amp;s=3e62fc2ca60d5cfcfd9f12963ca19265" alt="A successful website development process">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>Good Work was created around developing websites for design and marketing teams. Whether it be client-side teams at brands or corporations or creative studios that design websites for clients, our processes are centered around catering to this type of work.</p>
<p>Web developers can develop websites, that’s a given, but placing a heavy emphasis on the indirect — but very important — processes that ensure overall success is crucial: launching projects on time, clearly communicating to everyone involved, and being reliable from project kickoff to launch. However, replicating that process repeatedly with a high success rate is challenging.</p>
<p>Over the last <a href="https://simplygoodwork.com/blog/eight-lessons-learned-from-eight-years-of-good-work">8+ years</a>, we’ve created and refined processes that work well for us and our partners. Sometimes our process spans months; other times it’s in smaller iterations, but sticking to it ensures our projects rarely break down.</p>
<p>I hope this post helps both clarify and spark ideas for your own development processes, ensuring both short- and long-term success.</p>
<h2>Pre-work, work</h2>
<p>Before getting started, it’s useful to thoroughly understand your project. For straightforward websites, this can be as simple as a phone call or meeting to nail down a sitemap and understand template and feature needs. For more complex builds this may require an <a href="https://simplygoodwork.com/blog/low-risk-onboarding-consultancy-projects">in-depth discovery phase</a> where we brainstorm and prototype ideas to ensure we’re developing the <em>right</em> product, a road map to proceed, and a rough prototype to reference throughout the life of the project.</p>
<p>At this point we should have enough details to plug the information into our custom estimating tool and nail down development costs and timelines. The deliverable here is a proposal and/ or contract. Throughout the pre-development phases of the project we like to keep an eye on design progress and provide any necessary feedback along the way.</p>
<h2>Design kick-off</h2>
<p>Once the design is signed off and completed, we like to hold a kick-off meeting with both the design and development teams to talk through development expectations. Here is a <a href="https://www.dropbox.com/s/mu7cajfgvvkjmp7/Good%20Work%20Sample%20Kickoff%20Agenda.pdf?dl=0" target="_blank" rel="noreferrer noopener">sample kick-off agenda document</a>. Since we’ve been involved with the design process from the start, we use this meeting to review everything with a fine-toothed comb. We can then nail down a specific timeline and expected launch date.</p>
<p>Things we look for in a good design handover:</p>
<ul><li>Full design files, including mobile</li><li>Documented functionality requirements and CMS expectations</li><li>Web-friendly font licenses and files</li><li>Exported assets</li></ul>
<p>Our ‘<a href="https://simplygoodwork.com/blog/six-steps-to-a-successful-designer-to-developer-handoff">Six steps to a successful designer to developer handoff</a>’ article is a must-read when creating a bulletproof checklist for your design handovers.</p>
<h2>Development cycle</h2>
<p>Following the design handover we move into development, which typically involves front-end development and content management system (CMS) integration. This phase usually becomes a silent period between agencies and clients, so we like to provide a weekly status update at a minimum, flagging anything unexpected as soon as possible through calls and emails. As development comes to an end we move into our quality assurance phase.</p>
<h2>Quality assurance</h2>
<p>Once development is finished and all content has been entered into the website, we begin our quality assurance process. After completing our own internal checklist we put the website on a special testing domain and walk our client through the site and how to use our quality assurance tool, <a href="https://bugherd.com/" target="_blank" rel="noreferrer noopener">BugHerd</a>. We provide our clients with a minimum of two rounds of quality assurance feedback before scheduling a launch date.</p>
<p>Our ‘<a href="https://simplygoodwork.com/blog/how-to-implement-a-bullet-proof-quality-assurance-process">How to implement a bulletproof QA process</a>’ article walks through the details of launching successful websites and web-based applications.</p>
<h2>Launch and post-launch</h2>
<p>Once all stakeholders have reviewed the website with a fine-toothed comb it’s time to schedule a launch date. After launch, nine times out of ten we book a follow-up project to implement any new features and ideas that might have come up in the quality assurance process. From there, the website moves into maintenance mode, where we make updates on an as-needed basis. For larger websites like <a href="https://simplygoodwork.com/case-studies/titos-handmade-vodka">Tito’s</a>, we develop intentional maintenance plans to ensure the website is continually evolving.</p>
<p>I can count our failed projects over the years on one hand, which resulted from veering off our processes in one way or another. By documenting and sticking to our processes, we’re able to run a calmer company and ensure happier clients and partners.</p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>2019 Dot All Conference</title>
                <link>https://simplygoodwork.com/blog/2019-dot-all-conference</link>
                <pubDate>Mon, 23 Sep 2019 12:00:00 -0500</pubDate>
                <author>Chase Giunta</author>
                <guid>https://simplygoodwork.com/blog/2019-dot-all-conference</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/goodwork-article-image-dotall.jpg?w=1600&amp;h=900&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666108627&amp;s=04c0bfd9e3c5f2fd275f11ac2f3ba873" alt="2019 Dot All Conference">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>Dot All 2019, the official Craft CMS conference, took place September 18-20 at the Phi Centre in Montreal, and Good Work was happy to be a part of it.</p>
<p>In case you don’t know, Craft is <a href="https://simplygoodwork.com/craft-cms">Good Work’s CMS of choice</a>. We’ve been using it since its inception in 2012, and recently became a verified Craft partner. Representing Good Work were two of our awesome developers, Jake Dohm and Chase Giunta. Jake partnered with Andris Ševčenko of Pixel &amp; Tonic (the creators of Craft), leading a workshop titled “Modern Web Development with Craft, Vue and GraphQL.” The workshop introduced the Craft community to new methods of tackling complex problems in development, utilizing our favorite javascript framework - Vue.js - and a new feature recently introduced into Craft, the GraphQL API (aimed to intelligently fetch data from Craft).</p>
<figure><img src="https://simplygoodwork.com/uploads/blog/Jake_2.jpg" alt="Jake speaking at Dot All Conference" /></figure>
<p>Not only was the workshop a huge success, allowing our team to share their knowledge with the larger Craft community is always a plus. In addition to the various workshops, Brandon Kelly, the founder and CEO of Pixel &amp; Tonic, kicked off the conference with a “State of Craft 2019” presentation (in which he showcased Good Work!). Below are a few highlights:</p>
<ul><li>The official <a href="https://plugins.craftcms.com/">Craft CMS plugin store</a> has 627 plugins and counting</li></ul>
<ul><li>There are currently 28,000 known websites using Craft CMS, a massive usage growth over the past year</li></ul>
<ul><li><a href="https://craft.cloud/">Craft Cloud</a>, a Craft CMS as a service offering, will be released in 2020, allowing authors to create and manage content with their favorite CMS, while simplifying developer's jobs by removing the need to create and manage servers</li></ul>
<ul><li>Craft 4 will be released in 2020, with improvements focused on accessibility, collaboration, content modeling and author experience. A few additional highlights:<ul><li>Full keyboard control in the control panel</li><li>Dark mode</li><li>Alerts for multiple users editing the same element</li><li>Improved field layout support</li><li>User-defined index views, with advanced control over what entries you see in the control panel, and how you see them</li></ul></li></ul>
<p>This year’s conference offered two tracks, one technically focused for developers, and one geared toward business philosophies, content author experience and client interactions. It was not only informative, it provided an excellent opportunity for our team to connect with the Craft community. We enjoyed putting names with faces and speaking with those who create and maintain many of the <a href="https://simplygoodwork.com/articles/top-craft-cms-plugins-used-at-good-work">plugins our team uses</a> on a daily basis. It reinforced our faith in the Craft product and the future of our industry. </p>
<p>We can't wait to be back, and with the 2020 Dot All Conference taking place in Amsterdam, we’re pretty sure our UK team members are just a tad bit excited.</p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>Quick Start: Gridsome + GraphQL API = Craft CMS Headless</title>
                <link>https://simplygoodwork.com/blog/quick-start-gridsome-craft-cms-graphql-api</link>
                <pubDate>Sun, 01 Sep 2019 06:30:00 -0500</pubDate>
                <author>Jake Dohm</author>
                <guid>https://simplygoodwork.com/blog/quick-start-gridsome-craft-cms-graphql-api</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/goodwork-article-image-kickstart_graphQL.jpg?w=1600&amp;h=900&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666883355&amp;s=234a23974a37ec01f22092da8461d40b" alt="Quick Start: Gridsome + Craft CMS GraphQL API">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>Craft CMS is a fantastic CMS that just got a whole lot easier to use with Gridsome (or any static site generator). The Craft team appears to have noticed the trend of people starting (or hoping) to use Craft as a "Headless CMS." In <a href="https://craftcms.com/blog/craft-33">Craft 3.3</a> they added an out-of-the-box GraphQL API which is perfect for pulling your content into a static site generator like Gridsome or Gatsby to make Craft CMS Headless.</p>
<p>Let's jump right into how to use the new GraphQL API to integrate with Gridsome.</p>
<h2>5 Steps</h2>
<h3>1. Set up your Craft installation</h3>
<p>To use the GraphQL API, you need to have a Craft installation running 3.3+ and licensed as Craft Pro*. If you have a current Craft installation and are running a lower version than 3.3, you can update by changing the <code>craftcms/cms</code> version in your <code>composer.json</code> to <code>"^3.3.0"</code> and then running <code>composer update</code>.</p>
<p>*In development you can use the Craft Pro trial</p>
<h3>2. Create a schema</h3>
<p>Schemas are the way you can access your Craft data through GraphQL. Each schema comes with an access token, that you provide to Craft with your GraphQL query to identify which schema to pull data from. Each schema has its own permissions set, so you can limit access to types of data based on which schema they're allowed querying.</p>
<p>For this step, head over to <code>Control Panel &gt; GraphQL &gt; Schemas</code>, then create a new schema, give it the proper data permissions and copy the access token.</p>
<h3>3. Set up a route to your GraphQL API.</h3>
<p>Add the following route to <code>routes.php</code>. This will allow you to send GraphQL queries to <code>example.com/api</code>.</p>
<pre>// routes.php
return [ 'api' =&gt; 'graphql/api' ];</pre>
<h3>4. Set up your Craft API as a Gridsome data source</h3>
<p>Assuming you have a working Gridsome installation up and running, the actual integration of your CMS data into the Gridsome GraphQL store is extremely simple!</p>
<p>First, you'll need to install the Gridsome source plugin for GraphQL:</p>
<pre>npm install @gridsome/source-graphqlyarn add @gridsome/source-graphql</pre>
<p>Then, add the following to your <code>gridsome.config.js</code>:</p>
<pre>// gridsome.config.js
{ 
 use: '@gridsome/source-graphql',
 options: {
 url: process.env.CRAFT_API_URL,
 fieldName: 'craft',
 typeName: 'craft',
 headers: {
 Authorization: `Bearer $​{process.env.CRAFT_API_TOKEN​}`,
 }
 }
}</pre>
<p>This gets us 90% of the way to a working integration, but it still won't work <em>quite</em> yet! You may have noticed the references to <code>process.env</code> variables for our API URL and token. This is what we'll set up in the next - and final - step.</p>
<h2>5. Create a <code>.env</code> in your Gridsome project</h2>
<p>If you're familiar with Craft, you've seen a <code>.env</code> file before. <code>.env</code> contains all of your "environmental variables": information specific to the environment in which you're working. Gridsome takes this same approach to environmental variables, so we're going to create (or add to) a <code>.env</code> file in our Gridsome project.</p>
<pre># .env - in Gridsome project

CRAFT_API_URL="http://example.test/api"</pre>
<p>Now run <code>gridsome develop</code> and you're off to the races! You should be able to query your Craft data from anywhere within Gridsome now. To test everything head over to the GraphQL playground and try sending the following request:</p>
<pre>query {
 craft { ping }
}</pre>
<p>If everything's working properly, the <code>ping</code> field should return <code>pong</code>.</p>
<p>Congratulations! You have now activated <em>headless mode</em>. If you have any comments/questions don't hesitate to reach out. I also love hearing when my articles were helpful, so let me know if these steps worked for you!<br /></p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>Use cases for a Craft CMS Multi-Site setup</title>
                <link>https://simplygoodwork.com/blog/use-cases-for-craft-multi-site</link>
                <pubDate>Thu, 15 Aug 2019 06:30:00 -0500</pubDate>
                <author>Garrett Winder</author>
                <guid>https://simplygoodwork.com/blog/use-cases-for-craft-multi-site</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/goodwork-article-image-multiplesites_1.jpg?w=1600&amp;h=900&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666883387&amp;s=34c24a378ecf5e48fa2c7a3b48608f03" alt="Use cases for a Craft CMS Multi-Site setup">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>The team at Good Work is no stranger to Craft CMS, and we love highlighting its great features, both from the development and user side of things. One of my favorite features is called Craft CMS <a href="https://craftcms.com/features/all#multi-site" target="_blank" rel="noreferrer noopener">Multi-Site</a>, and allows users to run multiple sites from a single Craft installation. With Multi-Site you can share content (and content-types) across multiple websites, while also having site-specific content and content-types that aren't shared. All from a single Craft control panel.</p>
<p>Here are a few quick examples where Craft's Multi-Site feature can be incredibly useful.</p>
<h2>Creating websites with the same content structure and different designs</h2>
<p>We have a client who owns a few dozen hospitals and walk-in clinics across the Southwestern United States. The hospital websites share the same content structure and functionality, as do the walk-in clinics. However, each has its own logo, branding and color palette. Craft Multi-Site gives them the ability to manage all of that content from a single place, while giving our team the ability to spin up new websites in a matter of hours.</p>
<p>Of course, this isn't just for hospitals. I've seen Craft Multi-Site used for churches, non-profits with self-standing branches and a group of individually branded co-working spaces.</p>


<figure><img src="https://optimise2.assets-servd.host/good-work/production/images/munger-place-1x1-desktop@2x.jpg?w=1124&h=896&auto=compress%2Cformat&fit=crop&dm=1664293950&s=7dbb43d5b113396ac95804be7056ad66" alt="" /></figure><figure><img src="https://optimise2.assets-servd.host/good-work/production/images/grove-1x1-desktop@2x.jpg?w=1124&h=896&auto=compress%2Cformat&fit=crop&dm=1664293945&s=f6db6fab0cf6d98a50abfa25854b1b96" alt="" /></figure>
<h2>Creating entirely different websites for the same parent company</h2>
<p>Large brands, or companies that offer a variety of products, such as a software company, typically have unique websites for each individual product. Managing all of that content from a single place is easy with Craft Multi-Site.</p>
<p><a href="https://wildbit.com/" target="_blank" rel="noreferrer noopener">Wildbit</a>, the creators of <a href="https://beanstalkapp.com/" target="_blank" rel="noreferrer noopener">Beanstalk</a>, <a href="https://postmarkapp.com/" target="_blank" rel="noreferrer noopener">Postmark</a> and <a href="https://www.conveyor.com/" target="_blank" rel="noreferrer noopener">Conveyor</a>, have done just that. Before <a href="https://wildbit.com/blog/2016/11/01/how-we-chose-craft-cms-for-products-websites" target="_blank" rel="noreferrer noopener">switching to Craft CMS</a> each of their websites had its own CMS, but now run seamlessly through Craft Multi-Site.</p>
<h2>Multi-Site user management</h2>
<p>Craft allows you to <a href="https://craftcms.com/features/all#user-management" target="_blank" rel="noreferrer noopener">configure user permissions</a> for entire user groups (e.g. content editors), as well as individual users, making it simple to allow certain team members to manage different aspects of your Multi-Site setup. A typical setup may have one group of people who can edit Site A, another group of people who can edit Site B, and then a handful of administrators with access to everything. Of course, you can get as complex and granular as needed, but this is a common example of user management setup on Craft Multi-Site.</p>
<p>Whether you run just a few websites - or dozens - Craft Multi-Site provides the features needed to smartly organize and manage all of your content from a single CMS.</p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>Website Accessibility &amp; ADA Compliance</title>
                <link>https://simplygoodwork.com/blog/web-accessibility-ada-compliance</link>
                <pubDate>Thu, 01 Aug 2019 06:30:00 -0500</pubDate>
                <author>Gavin Platt</author>
                <guid>https://simplygoodwork.com/blog/web-accessibility-ada-compliance</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/accessibility-illustration.jpg?w=1600&amp;h=900&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666883426&amp;s=79990a99d5a1b810567ea3c3d3b029f9" alt="Website Accessibility &amp; ADA Compliance">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>You’ve probably heard of the <em>Web Content Accessibility Guidelines (WCAG)</em>, a set of recommendations to help ensure your website’s content is accessible to people with disabilities.<br /></p>
<p>Here we'll provide an overview of the WCAG guidelines, why they matter to you and how to best implement them moving forward. To see this in action head over to <a href="https://simplygoodwork.com/case-studies/oklahoma-christian-university">our OC case study</a>. Meeting WCAG guidelines to make your website more accessible is easier than you think, and will benefit <em>all</em> your users.</p>
<h2>WCAGADA508W3C</h2>
<p>There’s a lot of acronyms out there, but let's tackle the ones that really matter:</p>
<h3>WCAG 2.1</h3>
<p>The current version of the Web Content Accessibility Guidelines. They’re published by <em>W3C</em>, the international body who creates web standards. They have three levels:</p>
<ul><li><strong>A</strong>: the bare minimum. If your website is in good shape you’re likely already achieving this level.</li><li><strong>AA</strong>: the middle ground. Most companies concerned with accessibility work towards this level, one you should aim for too. In some countries it’s a legal requirement for certain organizations (e.g. government body websites).</li><li><strong>AAA</strong>: the most in-depth level. Generally only used for specialist websites that have complex requirements (e.g. sign language translations for audio content).</li></ul>
<h3>ADA</h3>
<p>The <em>Americans with Disabilities Act</em>, a law prohibiting discrimination based on disability. While it doesn’t explicitly reference website accessibility, a legal precedent has been set that non-accessible websites could be considered discriminatory. There’s an equivalent in UK law called <em>Section 20</em> of the <em>Equality Act</em>.</p>
<h3>Section 508</h3>
<p>Law in the U.S. which requires (amongst other things) government websites to be accessible to all, as defined by meeting WCAG Level AA. The <em>European Accessibility Act</em> within the EU is similar to this.</p>
<h2>Why bother?</h2>
<p>As referenced above, there is a legal case for making your website accessible, but hopefully that’s not your only motivation. In the U.S. alone 12% of the population reports having a disability – over 37 million people. While that number is large, not following WCAG guidelines may create unnecessary obstacles for people that fall outside that category as well. Our default should be ensuring our websites are inclusive for all, without needing further justification. However, there are tangible benefits for businesses who work to achieve WCAG guidelines: your website will be easier to find and use, increasing your audience; you’ll have a competitive edge over rivals who haven’t prioritized accessibility; and your visitors will have an easier path to achieving their goals when they arrive at your website.<br /></p>
<p>But here’s the best part: building an accessible website benefits <em>all</em> users. Despite years of going to gigs – including the infamously loud Mogwai – my hearing is okay (for now). But I still prefer skim reading a transcript over listening to a podcast. You might have perfect eyesight but prefer listening to an audio book. And what if you’re on your phone in bright daylight? Or on holiday visiting a website that’s not in your primary language? You may have bad internet, feel overly tired or are in a rush? <strong>The WCAG guidelines make life better for all users in these situations</strong>.</p>
<p>So, how do you approach your next web project with an emphasis on achieving accessibility?</p>
<h2>Decide early and get everyone on board</h2>
<p>At the start of your project decide which accessibility level you’re aiming to achieve (most likely WCAG 2.1 – AA). Accessibility isn’t a line item to tack on at the end of a project, so communicate this goal to all stakeholders from the beginning. It affects all stages of the project, including content creation (using more descriptive link text than 'Click Here'), design (ensuring proper contrast between text and background color) and development (more on this below).</p>
<h2>Audit your existing site</h2>
<p>If you already have a website then completing an in-depth accessibility audit is a good start, which should include testing real users with ‘assistive technologies’ (like the JAWS screen reader). However, even a quick, simple audit using automated tools will help identify big issues. <a href="https://wave.webaim.org/extension/" target="_blank" rel="noreferrer noopener">Wave</a>, <a href="https://github.com/pa11y/pa11y" target="_blank" rel="noreferrer noopener">Pa11y</a> and <a href="https://developers.google.com/web/tools/lighthouse/" target="_blank" rel="noreferrer noopener">Google Lighthouse</a> are good auditing tools, and will quickly scan your website and flag any issues.</p>
<h2>Technical implementation details</h2>
<p>While some WCAG requirements are tricky to implement (especially for complex components like multi-level dropdowns or carousels), you can make substantial progress relatively easily. Below are a few quick wins to make your site more accessible.</p>
<h3>Get the fundamentals right</h3>
<p>We <a href="https://simplygoodwork.com/blog/nailing-the-basics">wrote about this in 2015</a> and nothing has changed:</p>
<blockquote>“The magic bullet to a successful digital project is readable content, usable forms and intelligent website structure. Nail these basics and you’ve nailed your digital project, whatever it is."</blockquote>
<h3>Use semantic markup and appropriate elements</h3>
<p>We have <a href="https://www.w3schools.com/tags/" target="_blank" rel="noreferrer noopener">many HTML elements </a> at our disposal. Use them appropriately to give screen readers the best shot at understanding your page structure.</p>
<p>Many elements come with free, built-in accessibility features. Make use of these where possible instead of recreating them with Javascript. A native checkbox input is keyboard and screen reader accessible, offers keyboard events, communicates its state and behaves in a way that's universally understood. It’s now possible to style most native form inputs consistently using only CSS (see <a href="http://wtfforms.com" target="_blank" rel="noreferrer noopener">WTF, Forms?</a> and <a href="https://www.filamentgroup.com/lab/select-css.html" target="_blank" rel="noreferrer noopener">Styling a Select Like it’s 2019</a>).<br /></p>
<h3>Use just enough ARIA</h3>
<p>Using good markup means you shouldn’t have to lean too heavily on ARIA very regularly. For example, using a <code>nav</code> element is better than <code>div role=“navigation”</code>. </p>
<p>A common mistake is using <code>role=“menu”</code> for a navigation list. This was intended for building application menus, not website navigation. Using <code>role=“menu”</code> will require adding a lot of complex keyboard navigation support. An appropriately marked navigation needs no ARIA and can be used with just the <code>Tab</code> key. <a href="http://adrianroselli.com/2017/10/dont-use-aria-menu-roles-for-site-nav.html" target="_blank" rel="noreferrer noopener">More on that here</a>.</p>
<p>There are still a few cases where ARIA is useful: we make frequent use of <code>aria-hidden</code>, <code>aria-expanded</code>, <code>aria-haspopup</code> and <code>aria-labelledby</code>.</p>
<h3>Ensure headings are in the right sequence</h3>
<p>Heading levels should descend in a logical sequence reflecting the depth of the content – one <code>h1</code> element per page, no <code>h4</code> before an <code>h3</code> and no skipping levels. </p>
<p>One way we help enforce this is by ensuring the heading levels we make available to content editors (in <a href="https://simplygoodwork.com/craft-cms">Craft, our CMS of choice</a>) take into account the rest of the page content. A common example is a blog post template where the <code>h1</code> is populated by the post’s <code>Title</code> field, and the body of the post is populated by a Redactor WYSIWYG rich text field. In this case we’d use the redactor config code below to make only heading levels 2–6 available:</p>
<pre>{ 
 "buttons": ["formatting", "bold", "italic", "unorderedlist", "orderedlist", "link" ],
 "formatting": ["p", "h2", "h3", "h4", "h5", "blockquote"],
 "toolbarFixed": true
}</pre>
<h3>Provide good labels to screen readers</h3>
<p>A great example of this is a social network link, made up of that network's icon. Sighted users will see the icon and know to click; however, screen readers will only register an SVG icon with no description. To fix this, add a descriptive label and use CSS to hide this from everything except screen readers. Use <code>aria-hidden</code> to prevent the screen reader from getting bogged down on the SVG icon.</p>
<pre>/* Html */
&lt;a href="https://facebook.com"&gt;
 &lt;span class="u-sr-only"&gt;Find us on Facebook&lt;/span&gt;
 &lt;svg class="icon icon-facebook" aria-hidden="true"&gt;...&lt;/svg&gt;
&lt;/a&gt;

/* Css */
.u-sr-only {
 position: absolute;
 width: 1px;
 height: 1px;
 padding: 0;
 margin: -1px;
 overflow: hidden;
 clip: rect(0, 0, 0, 0);
 border: 0;
}</pre>
<h3>Provide useful image alt text (or don’t)</h3>
<p>All images should have an <code>alt</code> attribute. If the image is only used for decorative purposes then leave the alt attribute blank. Otherwise, provide a useful description of the image.</p>
<p>In Craft we usually use the asset’s <code>title</code> field for the alt content, and add a note to the field instructions to nudge content editors into making this useful: <code>Recommended image size: 2500 x 975. Double-click on the image to set a title, which should be a short description of the image.</code></p>
<h3>Provide a text version of non-text content</h3>
<p>Audio content should have a transcript provided. Videos should include closed captions, have a transcript provided, or both. Wistia, Youtube and other video-hosting providers can offer automated captions, though they’re unlikely to be 100% accurate. Alternatively you can create your own, or pay a third-party service.</p>
<p>In Craft we handle this by assigning three fields to a video asset:</p>
<ul><li><code>Video Track</code>: another asset field which accepts a subtitles/captions/description file in .vtt or .ttml format</li><li><code>Video Track Kind</code>: a dropdown field to choose between subtitles/captions/description</li><li><code>Video Transcript</code>: a rich text field to enter a transcript in</li></ul>
<p>Our video component then looks something like the image below. If a video transcript has been provided we use the <code>figcaption</code> to link to a basic template which displays the video and its transcript.</p>
<pre class="code"><code>&lt;figure&gt;
 &lt;video controls="" playsinline=""&gt;
 &lt;source src="{{ video.url }}" type="video/mp4"&gt;
 {% if video.videoTrack|length %}
 &lt;track label="English" kind="{{ video.videoTrackKind }}" srclang="en" src="{{ video.videoTrack.one() }}" default=""&gt;
 {% endif %}
 &lt;p&gt;Your browser doesn't support HTML5 video. Here is a &lt;a href="{{ video.url }}"&gt;link to the video&lt;/a&gt; instead.&lt;/p&gt;
 &lt;/video&gt;
 {% if video.videoTranscript|length %}
 &lt;figcaption&gt;
 &lt;a href="/video-transcript?video={{ video.id }}"&gt;Read a text description of the video&lt;/a&gt;
 &lt;/figcaption&gt;
 {% endif %}
&lt;/figure&gt;</code></pre>
<h3>The best advice: <strong>cheat!</strong></h3>
<p>In the introduction we mentioned that some components are tricky to make accessible, like carousels and multi-level dropdown navigation. The quickest fix for this is not using them. For example, carousels have a many <a href="http://bradfrost.com/blog/post/carousels/" target="_blank" rel="noreferrer noopener">well-documented problems</a>, and the best solution might be simply presenting that content in a different way. This is another good example of how ‘designing for accessibility’ is beneficial to <em>all</em> users. </p>
<h2>Checklists &amp; tools</h2>
<ul><li><a href="https://a11yproject.com/checklist/" target="_blank" rel="noreferrer noopener">A11Y Project Checklist</a>: a simple, easy-to-digest version of the full WCAG guidelines. This is an excellent starting point.</li><li><a href="https://www.w3.org/WAI/WCAG21/quickref/" target="_blank" rel="noreferrer noopener">W3C ‘How to Meet WCAG’ checklist</a>: a filterable list of all the WCAG guidelines with in-depth descriptions for each, including suggested techniques and what classes as failure.</li><li><a href="https://github.com/pa11y/pa11y" target="_blank" rel="noreferrer noopener">Pa11y</a>: a command-line interface which loads web pages and highlights any accessibility issues it finds.</li><li><a href="https://wave.webaim.org/extension/" target="_blank" rel="noreferrer noopener">Wave</a>: a browser extension from WebAIM, which gives quick feedback on a page’s accessibility.</li><li><a href="https://developers.google.com/web/tools/lighthouse/" target="_blank" rel="noreferrer noopener">Google Lighthouse</a>: a Chrome tool which audits performance and accessibility.</li></ul>
<h2>Further reading</h2>
<ul><li><a href="https://www.gov.uk/service-manual/helping-people-to-use-your-service/making-your-service-accessible-an-introduction#further-reading" target="_blank" rel="noreferrer noopener">Gov.uk ‘Making your service accessible: an introduction’</a>: the UK's government digital service publishes lots of great content about accessibility.</li><li><a href="https://abookapart.com/products/accessibility-for-everyone" target="_blank" rel="noreferrer noopener">Accessibility For Everyone by Laura Kalbag</a>: a thorough guidebook that covers high-level background information, to specific, practical implementation details.</li><li><a href="https://inclusive-components.design" target="_blank" rel="noreferrer noopener">Inclusive Components by Heydon Pickering</a>: a website and book demonstrating accessible implementations of common patterns (carousels, tabbed content, etc.)</li></ul>
<hr />
<p>Hopefully by now you’re convinced of the benefits of having an accessible website. It’s surprisingly easy to achieve most accessibility guidelines, especially with the wealth of tools and resources available. Ultimately, following WCAG guidelines encourages us to make better decisions about usability and will results in <em>all</em> your users having a better experience.</p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>How to implement a bulletproof QA process</title>
                <link>https://simplygoodwork.com/blog/how-to-implement-a-bullet-proof-quality-assurance-process</link>
                <pubDate>Sat, 01 Jun 2019 06:30:00 -0500</pubDate>
                <author>Ariel Kidwell</author>
                <guid>https://simplygoodwork.com/blog/how-to-implement-a-bullet-proof-quality-assurance-process</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/goodwork-article-image-qualityassurance-2.jpg?w=1600&amp;h=900&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666883454&amp;s=252477a14dfa7f57a38e3ecf2727dbd6" alt="How to implement a bulletproof QA process">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>The development phase of your website is complete and you’re ready for launch. However, before going live you need to engage in a thorough quality assurance (QA) process. This should be one of the most fun steps in the launch phase, allowing you to see the almost finished product and ensure it’s ready for liftoff</p>
<p>However, poor planning, or a lack of clarity around your team’s expectations, can lead to delays and budget overages. Entering a project’s kickoff meeting with a detailed timeline and clear communication strategies can solve most - if not all - future issues. Adding a tested QA process will both bolster alignment within your team, and ensure a seamless, painless launch. The following tips will provide you the knowledge to craft a QA process that ensures the successful launch of future web projects.</p>
<h2>1. Understand what QA is and isn't.</h2>
<p>QA is your opportunity to compare the nearly-finished product to the original goals, design, and functionality, ensuring no details have been overlooked. The two key terms in this phase are functionalities and requirements, which will guide your QA testing as you search for bugs (aka issues, breaks, dead ends). You will test forms, links, slideshows, third-party integrations and videos to ensure they’re working as expected. If your website has a content management system (CMS) you will explore the CMS to make sure all requested requirements and options are available. It’s also recommended to create test entries in the CMS to ensure everything is functioning as expected.</p>
<p>During the QA phase, it’s possible your team could decide on new design elements,functionalities or requirements. This is completely natural now that you’re interacting with the final product. However, this is not the time to make these changes if you have a fixed budget and/or timeline. These potential changes should be recorded during QA and addressed after launch as a follow-up project. Trying to shoehorn changes like this during QA creates unnecessary pressure on your development team and will inevitably create delays. Allowing the product to launch will also provide users the opportunity to provide feedback. Something you assumed would be helpful in QA might not be important once others interact with the product.</p>
<h2>2. Pay attention to timeline expectations.</h2>
<p>When creating the QA timeline you must be an active partner in setting turnaround expectations within your team. Check your team’s calendars against the timeline for holidays, vacations or busy work periods to make sure a deliverable date is possible, or a turnaround expectation is reasonable. Once the timeline is agreed upon, ensure these dates are placed on your team’s calendars well in advance so everyone can appropriately allot their time during QA periods.</p>
<h2>3. Align your team before the QA phase.</h2>
<p>QA is a team effort involving all stakeholders that have provided input or need final sign-off before launch. QA can be a tiered approach, assigning certain team members to dig through the product’s functionalities and testing, while others simply click around and review from a macro level. Make sure to designate who will be participating in QA, define their level of involvement and align their schedule with the project’s timeline well in advance of the QA phase.</p>
<h2>4. Create clear documentation of bugs during QA.</h2>
<p>Before beginning QA decide on a tool that will allow your team to easily record any found bugs throughout the process. This could be in the form of a third-party tool such as Bugherd or DebugMe, that automatically records your browser information, screenshots, and comments. Another option is a simple, internal spreadsheet where your team records bugs and phase-two recommendations.</p>
<p>Regardless of the tool, the key is ensuring your development team is provided a concise list of bugs they can address through collaborative, consistent feedback. Including details such as specific browser information (<a href="https://whatsmybrowser.org">whatsmybrowser.org</a>), device details (phone, tablet, computer size/type), and screenshots will create a clear picture of each issue and minimize the questions your development team may have. Before passing the information to the development team review the list and remove any redundancies, and make sure all listed issues are easy to decipher.</p>
<h2>5. Use your rounds wisely.</h2>
<p>Your QA process should include a fixed number of rounds for reviews and revisions. Utilize each round efficiently to ensure you stay on schedule and hit your ultimate launch deadline. The first round should be the most thorough review of the site, leaving no page unclicked and no form untested. Devote the majority of your team’s energy and time to this round. The next round(s) should be used to ensure prior bugs no longer exist and making a final pass at the entire product before approving its launch. Pushing extensive testing to later rounds places undue stress on your team and increases the chance of delays.</p>
<h2>QA Checklist</h2>
<h3>Immediate</h3>
<ul><li>Develop a QA process for your team</li><li>Select QA collection tool</li></ul>
<h3>Project Kick-Off</h3>
<ul><li>Set the project’s QA timeline </li><li>Designate team members that will be involved with the project’s QA based on availability, define their level of involvement and add dates to calendars</li></ul>
<h3>Pre-Launch</h3>
<ul><li>Make sure each team member is following their QA assignments as they begin testing all links, forms, third-party integrations, videos, CMS, etc.</li><li>Ensure all QA bugs are recorded in your collection tool</li><li>Ensure all phase-two recommendations are recorded in your collection tool</li><li>Review QA list after round one is completed to remove any redundancies, and ensureall necessary details are recorded for the development team</li><li>Begin final QA round(s) to test prior bugs before launch</li></ul>
<h3>Post-Launch</h3>
<ul><li>Gather stakeholder feedback</li><li>Plan and estimate phase two recommendations that were discovered during QA.</li></ul>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>How to set up an SEO-friendly Craft CMS website</title>
                <link>https://simplygoodwork.com/blog/how-to-setup-an-seo-friendly-craft-cms-website</link>
                <pubDate>Wed, 15 May 2019 06:30:00 -0500</pubDate>
                <author>Garrett Winder</author>
                <guid>https://simplygoodwork.com/blog/how-to-setup-an-seo-friendly-craft-cms-website</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/goodwork-article-image-seo.jpg?w=1600&amp;h=900&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666883489&amp;s=68f9e8b1fc19a23cbbf5f53a66035ee3" alt="How to setup an SEO-friendly Craft CMS website">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>Outside of general ease-of-use and editing capabilities, it's important to choose a content management system that has the tools and features required for your content editors to maintain an SEO-friendly website.</p>
<p><a href="https://simplygoodwork.com/craft-cms">Craft CMS</a> is used by businesses large and small, from mom-and-pop shops to large brands like PBS, Sonos and Netflix. Its easy-to-use control panel for content editors and elegant templating for developers make it one of the most powerful - and praised - systems on the market.</p>
<p>It’s important your team follows some sort of <a href="https://simplygoodwork.com/blog/technical-seo-checklist">SEO checklist</a> when designing (or redesigning) your website, and in this article we'll discuss how easy Craft CMS makes that process. If you don't already have a checklist like the one above you can start by downloading the <a href="https://www.dropbox.com/s/8k1kez6ytverlcj/Good%20Work%20-%20Technical%20SEO%20checklist.pdf?dl=0">Technical SEO PDF</a> we follow.</p>
<p>Let's get to it.</p>
<h2>Title tags and meta descriptions</h2>
<p>Using the SEOmatic plugin you can maintain title tags and meta descriptions from a global level down to the entry-level, and everything in between. This ensures you always have fallback content while having the ability to get as granular as needed with title tags and meta descriptions.</p>
<p>There's also a SERP (search engine results page) preview so you can see how your page will show up in search engines like Google.</p>
<figure><img src="https://simplygoodwork.com/uploads/blog/SEO-friendly-Craft-CMS-site/title-tags-meta-descriptions-seomatic.png" alt="Editing title tags and meta descriptions with SEOmatic" /></figure>
<h2>XML sitemap and robots.txt files</h2>
<p>SEOmatic will automatically generate a sitemap for each section of your website in Craft, and allows you to edit the change frequency, priority and more on a section-by-section basis. As an example, here's what the sitemap settings look like for the 'Articles' section on our website.</p>
<figure><img src="https://simplygoodwork.com/uploads/blog/SEO-friendly-Craft-CMS-site/xml-sitemap-seomatic.png" alt="XML sitemap configuration with SEOmatic" /></figure>
<p>You also get an out-of-the-box robots.txt file that you can edit and configure to your liking.</p>
<figure><img src="https://simplygoodwork.com/uploads/blog/SEO-friendly-Craft-CMS-site/robots-txt-seomatic.png" alt="Managing Robots.txt in SEOmatic" /></figure>
<h2>Social media card settings</h2>
<p>You can maintain social media cards for Twitter and Facebook in the same way you can manage titles and meta descriptions. You can configure them at the global level, but also get as granular as you'd like on an individual page/entry basis. This gives you full control over how your links look when you share them on social media.</p>
<figure><img src="https://simplygoodwork.com/uploads/blog/SEO-friendly-Craft-CMS-site/social-media-card-seomatic.png" alt="Managing social media cards in SEOmatic" /></figure>
<h2>Structured data for rich snippets</h2>
<p>Structured data allows search engines to gain a better understanding of your content compared to standard HTML tags, so they can rank and present data on your website in unique ways. SEOmatic has dozens of preferences you can configure for your structured data strategy. To learn more about structured data, visit <a href="https://schema.org/" target="_blank" rel="noreferrer noopener">schema​.org</a>.</p>
<figure><img src="https://simplygoodwork.com/uploads/blog/SEO-friendly-Craft-CMS-site/structured-data-seomatic.png" alt="Managing Structured Data in SEOmatic" /></figure>
<h2>Ability to easily verify your website</h2>
<p>Before you can start using third-party tools like Google Search Console and Bing Webmaster Tools to track the performance of your website in search results, you'll need to verify your website. This is usually done in a more technical way by editing your DNS or uploading a file to your server, but SEOmatic allows you to verify from within the control panel.</p>
<figure><img src="https://simplygoodwork.com/uploads/blog/SEO-friendly-Craft-CMS-site/site-verification-seomatic.png" alt="Site verification with SEOmatic" /></figure>
<h2>Additional features</h2>
<p>These are just a few highlights of the many features that come with using the SEOmatic plugin with Craft CMS. Other items worth noting are:</p>
<ul><li>Managing tracking scripts like Google Analytics and Facebook Pixel from within the CMS</li><li>Controlling site name positioning in title tags</li><li>Local business info for Google's Knowledge Panel like phone numbers, price range and opening hours</li><li>Ability to manage Ads.txt and Humans.txt files</li></ul>
<p>You can learn more about the SEOmatic plugin in the <a href="https://plugins.craftcms.com/seomatic" target="_blank" rel="noreferrer noopener">Craft Plugin Store</a>.</p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>Top 10 web project management tips for development projects</title>
                <link>https://simplygoodwork.com/blog/top-10-project-management-tips-web-development-projects</link>
                <pubDate>Wed, 01 May 2019 06:30:00 -0500</pubDate>
                <author>Ariel Kidwell</author>
                <guid>https://simplygoodwork.com/blog/top-10-project-management-tips-web-development-projects</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/goodwork-article-top-10-pm-tips.png?w=1600&amp;h=900&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666883525&amp;s=45b53b20757f7098a31fd1bf5b55012d" alt="project management tips for web development projects">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <h2>1. Set your goals</h2>
<p>Websites are rarely made to simply be a brochure anymore. Even marketing websites have multi-layer approaches to user experience to ensure people receive tailored information. With that in mind, setting project goals with your team is the first - and most important - thing you can do. These goals dictate the scope, design and development, ultimately deciding whether the project is successful or not.</p>
<p>Spend time with your team aligning your goals to ensure everything is covered. If you enter into the project with a singular goal (i.e. to sell more shirts) then you probably haven’t invested enough time into this step. Have you considered how important the content management system (CMS) is to your team, and how much time you do/don’t want to allocate to it? Is refreshing the voice or content on your site a priority? Are you wanting to increase blog views and create more blog posts or up your subscription rate? Time spent researching what’s really important within your project will create a positive trickle-down effect throughout the entire process from the start until you complete the project.</p>
<h2>2. Understand required integrations</h2>
<p>The third-party integrations you need to add to your website can sometimes be the elephant in the room. The worst thing you can ever say in relation to an integration is: “We’ll just figure it out.” If anyone on your team says this stop whatever you’re doing and address whatever "it" is, or set a plan to do so as soon as possible. Even the most straightforward integrations can have unexpected consequences to the timeline and scope.<br /></p>
<p>Determine the required integrations during the discovery phase of the website design process. Explore each one to determine its compatibility with the overall process and seek out any red flags they may cause. It’s also important to consider what limitations or opportunities they add to the overall project in terms of design and expected functionalities. You don’t want to discover during development that the chatbot you signed a year-long contract for isn’t supported by the website's platform. Understanding the required integrations for your website upfront will help keep your project on track.</p>
<h2>3. Set clear responsibilities</h2>
<p>Website development requires many steps - and a variety of expertise - as you move from discovery to design to development. Once you’ve created your team of key stakeholders, designers, website developers and copywriters, schedule a kick-off meeting with everyone involved to begin the project on the right foot. It’s important the project begins with everyone aligned on their responsibilities, as well as when and where they will engage in the process. You can document this by creating a RACI chart, spreadsheet, or document outlining everyone’s name, roles and responsibilities. If doing the latter, include details like contact information and time zones that can be referenced along the way.</p>
<h2>4. Create a hub for organizing everything</h2>
<p>If you’re following even half of these tips you’re going to end up with lots of documentation, in addition to the many files that accompany these types of projects. Documentation is only useful if it's organized and easy to locate. Find a tool that allows subfolders and can house multiple kinds of assets (i.e. Google Drive or Dropbox). Visit this hub on a weekly basis to organize folders as new documentation is created, allowing easy navigation by any member of the team.</p>
<p>If you’re using Trello or JIRA utilize quick links to the documentation stored in this hub, or create a shared document with quick links to store things like wireframes, designs and notes. This allows for easy access throughout the entirety of the project. What is important to the design team may not be to the development team, so creating multiple versions of this might be necessary.</p>
<h2>5. Set CMS and functionality expectations during discovery and design</h2>
<p>A website is much more than a pretty, interactive picture. It has goals to meet and needs to work for your team - not against it. Setting CMS and functionality expectations well before the development phase will ensure the final product is everything you hoped for. Determine what options you need the CMS to provide you, such as having the ability to insert links in a text field, or having both right and left justification on that text overlay. For functionality, understanding how a design is to be interpreted is critical. Is a block supposed to animate or hover, or what is the default order for a blog listing page?</p>
<p>Both of these pieces will likely be in flux during the early part of your project, so it’s important to set a documentation method to record and tweak these during the process. If you wait until the end to try to capture these it becomes overwhelming, and things will inevitably get missed. It’s also important to share expectations with the entire team to ensure your goals are both attainable and being fulfilled along the way. These two pieces are key to making sure there aren’t any unwanted surprises during QA.</p>
<h2>6. Transparency in communication</h2>
<p>A website development project can have many cooks in the kitchen, and it’s easy for each micro team to become siloed. As a successful project manager, it’s imperative to keep communication flows open between the discovery, design and development teams throughout the process. Decisions made in discovery will have a significant impact on development and should be made with everyone’s input considered. As designers create ideas for functionalities or animations, include the front end developers to help brainstorm as they may offer solutions to bring their ideas to life. Open communication and problem-solving between the designers and developers will help ensure everything remains within scope, allowing each team to flag issues before it’s too late.</p>
<h2>7. Clean design handovers</h2>
<p>A thorough and well-prepared design handover is the best way to ensure that the site you see in QA is the site you envisioned in design. Our ‘<a href="https://simplygoodwork.com/blog/six-steps-to-a-successful-designer-to-developer-handoff">How to provide a successful design handover</a>’ resource is a must-read when creating a bulletproof checklist for your design handovers. </p>
<h2>8. Stick to the plan</h2>
<p>Successful website launches are carefully planned from the onset and executed exactly as planned in discovery. Website projects are fraught with opportunities to derail, and it’s your job as the project manager to ensure everyone stays focused and on course. Between the visions of your stakeholders, designers and developers it's easy to add additional features and functionalities and make continual design changes throughout the process. Be sure your teams stick to the agreed-upon number of revisions and always get revision approvals in writing.</p>
<p>For team members that find this too constricting there is another way to communicate this information that may feel more natural. A website by nature is evolutionary and meant to be iterated upon. Your initial website launch is getting your product out in the public eye. The second it launches it’s prime for iterations. As your team develops new ideas record these in a 'Phase II' document. This allows everyone to be heard and ensures no good idea gets ignored throughout the rush of the process. Once the site is launched the team can reconvene on these items to prioritize and plan their execution.</p>
<h2>9. Plan for QA</h2>
<p>When you begin a website project the Quality Assurance (QA) phase feels incredibly far away and becomes an easy afterthought. QA is one of the most important phases of the project and becomes easily derailed by a lack of planning. This phase should involve your key stakeholders and decision-makers, as well as anyone else vested in testing the site's expected functionalities. These people typically have very busy schedules and will need advanced notice to allocate an adequate amount of time in QA so no detail is missed.</p>
<p>When scheduling the timeline during discovery set benchmarks for QA, and alert your testers so they can schedule a time to participate in QA. Choose a QA tool that best fits your team’s work style. Some people prefer a web based QA project management tool - like <a href="https://bugherd.com/">Bugherd</a> or <a href="https://usepastel.com/">Pastel</a> - while others prefer a spreadsheet. Whatever the case, there is a lot of web project management software out there to choose from. We also recommend providing checklists to ensure they’re testing only what's needed so they don’t feel overwhelmed.</p>
<p>Our ‘<a href="https://simplygoodwork.com/blog/how-to-implement-a-bullet-proof-quality-assurance-process">How to launch high-quality web projects</a>’ resource explores QA in-depth, setting you up to create a valuable checklist before entering this stage.</p>
<h2>10. Speak human to everyone involved</h2>
<p>Website projects are not easy, but it doesn’t mean they can’t be fun, creative and rewarding. Things will inevitably arise that create bumps along the way, such as personal issues and differences of opinion. Understand the team is made up of humans dealing with their own personal and professional stressors, and make it your mission to keep everyone positive and in communication. Remind everyone of the important partnerships created along the way, and keep the eye on the prize of collaborating to create something awesome.</p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>Adding a Mailchimp subscribe feature to an existing contact form</title>
                <link>https://simplygoodwork.com/blog/how-to-add-a-mailchimp-subscribe-feature-to-an-existing-contact-form</link>
                <pubDate>Mon, 15 Apr 2019 06:30:00 -0500</pubDate>
                <author>Jeff Irwin</author>
                <guid>https://simplygoodwork.com/blog/how-to-add-a-mailchimp-subscribe-feature-to-an-existing-contact-form</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/goodwork-article-image-mailchimp.png?w=1600&amp;h=900&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666883547&amp;s=c16caeb4a0bc1425df8095123178b4fb" alt="Adding a Mailchimp subscribe feature to an existing contact form">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <h2>The Problem</h2>
<p>I have a contact form that when submitted emails the form's details and saves them to a database. I also need to add the submitted email address to a Mailchimp list.</p>
<h2>The Idea</h2>
<p>Create a hidden form that grabs the input from the form being completed. When the visible form is submitted, use jQuery to submit both forms.</p>
<h2>Implementation</h2>
<h3>The HTML...</h3>
</div>

                                            

            

<div class="block max-w-2xl mx-auto">
  <pre class="language-javascript">
    <code class="prism language-javascript">
      &lt;form id=&quot;contact&quot; action=&quot;/some/action.php&quot; method=&quot;POST&quot;&gt;
  &lt;input type=&quot;text&quot; name=&quot;firstName&quot; /&gt;
  &lt;input type=&quot;text&quot; name=&quot;lastName&quot; /&gt;
  &lt;input id=&quot;emailInput&quot; type=&quot;email&quot; name=&quot;email&quot; /&gt;
&lt;/form&gt;

&lt;form id=&quot;mcForm&quot; action=&quot;&quot; method=&quot;POST&quot;&gt;
  &lt;input id=&quot;mcEmail&quot; type=&quot;email&quot; name=&quot;email&quot; /&gt;
&lt;/form&gt;
    </code>
  </pre>
</div>

                                            <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <h3>Always grab your DOM element</h3>
<p>First, we're going to grab our form. There are different ways of doing this, but we gave the form an ID, so let's grab that. Once we have our form we need to write a function for when the form submits. The first thing our function should do is <em>prevent</em> the form's <em>default</em> action. We're then going to assign variables to the email input fields we need. To complete this function we'll assign the contact form email value to the Mailchimp form email input. Finally, create a callback function that will submit to Mailchimp.</p>
<p><em>Note: <code>.val()</code> is a jQuery method that will return the value of that element if it has one. <code>.val( value )</code> is a jQuery method that will assign whatever <code>value</code> is.</em></p>
</div>

                                            

            

<div class="block max-w-2xl mx-auto">
  <pre class="language-javascript">
    <code class="prism language-javascript">
      &lt;script&gt;
  $(&#039;#contact&#039;).submit(function(event) {
    event.preventDefault(); 

    // the value of the email input 
    contactEmail = $(&#039;#emailInput&#039;).val(); 

    // the DOM node of the Mailchimp input var
    $mcEmail = $(&#039;#mcEmail&#039;)
  
    // assign contactEmail to $mcEmail 
    $mcEmail.val(contactEmail); 

    // callback function where all the magic will happen 
    submitMC();
  }
&lt;/script&gt;
    </code>
  </pre>
</div>

                                            <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <h3>Meat and Potatoes</h3>
<p>Our callback function will submit the Mailchimp form. But like before, we need to assign some variables and prevent the form’s default action. Then we'll perform an asynchronous HTTP (Ajax) request using the jQuery method, <code>.ajax()</code>. The Ajax method will take several options/settings. After our successful AJAX request we'll submit our Mailchimp form, and create another callback function to submit our original contact form.</p>
<p><em>Note: To get the form's action URL we will use the jQuery method <code>.attr(attributeName)</code>. This will return a string. <code>.serialize()</code> is a jQuery method that will encode form elements as a string for submission. The <code>dataType: "jsonp"</code> is specific for Mailchimp and has to do with the callback function at the end of the action URL.</em></p>
</div>

                                            

            

<div class="block max-w-2xl mx-auto">
  <pre class="language-javascript">
    <code class="prism language-javascript">
      &lt;script&gt;
  function submitMC() {
    var that = this;
    var $mcForm = $(&#039;#mcForm&#039;);
    
    $mcForm.submit(function(event) {
      event.preventDefault();
      var $form = $(this);
      var url = $form.attr(&#039;action&#039;);

      $.ajax({
        type: &quot;POST&quot;,
        url: url,
        data: $form.seralize(),
        dataType: &quot;jsonp&quot;,
        success: function(data) {
          that.submitContact();
        }
      });
    });
    
    $mcForm.submit();
  }
&lt;/script&gt;
    </code>
  </pre>
</div>

                                            <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <h3>Submit the Contact Form</h3>
<p><em>Note: We're using <code>.unbind( event )</code> to remove the previously attached event listener from our original function.</em></p>
</div>

                                            

            

<div class="block max-w-2xl mx-auto">
  <pre class="language-javascript">
    <code class="prism language-javascript">
      &lt;script&gt;
  function submitContact() {
    $(&#039;#contact&#039;).unbind(&#039;submit&#039;).submit();
  }
&lt;/script&gt;
    </code>
  </pre>
</div>

                                            <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <h3>Mailchimp Specifics</h3>
<p>The forms action URL needs some specific parameters, and the final segment should be <code>/post-json</code> instead of simply <code>/post</code>. The specific parameters are the Mailchimp user ID and the list ID where the email address is being submitted. Also, add <code>c=?</code> to the end of the URL, which pertains to Mailchimp's callback function. The end of the action URL should look something like this:</p>
<p><code>/subscribe/post-json?u=XXXXXXXXXXX&amp;id=XXXXXXXX&amp;c=?</code></p>
<h3>Follow Consent Rules</h3>
<p>Finally, we need to add a checkbox confirming the user's consent to add their email address to our Mailchimp list, and adjust our contact form submission function to check whether that value is true or not.</p>
</div>

                                            

            

<div class="block max-w-2xl mx-auto">
  <pre class="language-javascript">
    <code class="prism language-javascript">
      &lt;form id=&quot;contact&quot; action=&quot;/some/action.php&quot; method=&quot;POST&quot;&gt;
  ...
  &lt;input type=&quot;checkbox&quot; id=&quot;subConfirmation&quot; name=&quot;subConfirmation&quot; value=&quot;newsletter&quot;/&gt;
  ...
&lt;/form&gt;
    </code>
  </pre>
</div>

                                            <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>Now let's update the original contact submission function to check if the user consented.</p>
</div>

                                            

            

<div class="block max-w-2xl mx-auto">
  <pre class="language-javascript">
    <code class="prism language-javascript">
      &lt;script&gt;
  $(&#039;#contact&#039;).submit(function(event) {
    event.preventDefault();
    var isChecked = document.getElementById(&#039;subConfirmation&#039;).checked;
    if (isChecked) {
      // if true, run our Mailchimp stuff
      var contactEmail = $(&#039;#emailInput&#039;).val();
      var $mcEmail = $(&#039;#mcEmail&#039;)
      $mcEmail.val(contactEmail);
      submitMC();
    } else {
      // the user hasn&#039;t given consent, just submit the contact form
      submitContact();
    }
  }
&lt;/script&gt;
    </code>
  </pre>
</div>

                                            <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>Now we have a contact form with a consent input, that when checked will also submit the user's email address to our Mailchimp list!</p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>Creating an API with Twig</title>
                <link>https://simplygoodwork.com/blog/creating-an-api-with-twig</link>
                <pubDate>Mon, 01 Apr 2019 06:30:00 -0500</pubDate>
                <author>Jake Dohm</author>
                <guid>https://simplygoodwork.com/blog/creating-an-api-with-twig</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/goodwork-article-image-twig.png?w=1600&amp;h=900&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666883576&amp;s=c23ef0ca4c71e7d10bcf1d0138d26b27" alt="Creating an API with Twig">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>Creating an API can be tricky. You have to install the Element API plugin, configure it and set up your endpoints. Not to mention that if you're not as familiar with PHP it can be difficult to figure out how to query for what you need!</p>
<p>On the other hand Twig APIs are easy to create and built in a language you already know! This type of API doesn't work for every scenario, and it can feel a bit 'hacky' at times, but for simple APIs Twig is a great solution.</p>
<h2>Basic API</h2>
<p>So, how should you go about creating an API in Twig? Since Craft allows users to hit Twig templates directly by going to their file path, all you need to do is create a Twig file.</p>
<p><strong>Basic Example</strong></p>
<p>For a super simple example you can create a Twig file <code>templates/api/entries.json</code> with the following contents:</p>
<pre>{# templates/api/entries.json #}

{% set entries = craft.entries.all() %}

{{ entries | json_encode | raw }}
</pre>
<p>In this example we're querying for all our entries and encoding the results of that query to be JSON, using <code>raw</code> to allow HTML characters.</p>
<p>This is probably an oversimplified example, because this method doesn't return <em>all</em> of the fields on each entry. Fields like 'assets' and 'entries' have to be queried for, and won't be returned from this basic API. But it's a great starting point, and can work for very basic scenarios.</p>
<p><em>Note: This is a JSON API, but it could be any type. You could manually build out XML or another data type (and I have), but since JSON is the most popular data type for APIs we'll be returning JSON.</em></p>
<h2>API with Params</h2>
<p>In our basic example the API grabs <em>all</em> entries, but that isn't a very common use-case. A much more common example is getting all entries from a certain section. In the following example we'll add the ability to query for entries in a certain section, and limit how many entries we return.</p>
<pre>{# templates/api/entries.json #}

{% set request = craft.app.request %}

{% set section = request.getQueryParam('section') %}
{% set limit = request.getQueryParams('limit') %}

{% set entries = craft.entries.section(section).limit(limit).all() %}

{{ entries | json_encode | raw }}
</pre>
<p>Alright, let's look at what we did above:</p>
<ul>
<li>We're defining 'section' and 'limit' variables based on query params. This means that if someone visits <code>example.com/api/entries.json?section=blog&amp;limit=5</code> then 'section' will be set to 'blog' and 'limit' will be set to 5.</li>
<li>We then pass those variables into our 'entries' query, and return the 'entries' query.</li>
</ul>
<p><em>Note: When you call <code>getQueryParam</code> if a param with that name doesn't exist, it returns <code>null</code>. This is convenient because it means if you hit our endpoint without a 'section' or 'limit' param the API will still work and return all entries with no limit.</em> </p>
<h2>Adding Authentication</h2>
<p>Sometimes the data you want to expose shouldn't be available to just anyone. In this case we want to add a level of authentication to make sure the user is logged in.</p>
<p>Since the request to our Twig endpoint will be made in the same session as our normal pages we can use the <code>currentUser</code> variable to determine whether the user making the request is logged in or not.</p>
<pre>{% if currentUser %}
 {% set request = craft.app.request %}

 {% set section = request.getQueryParam('section') %}
 {% set limit = request.getQueryParam('limit') %}

 {% set entries = craft.entries.section(section).limit(limit).all() %}

 {{ entries | json_encode | raw }}
{% else %} 
 {% exit 401 %}
{% endif %}
</pre>
<p>In the above code we check to see if there is a <code>currentUser</code>. If so we return the entries like normal; if not we throw an error. You can customize this error response, but I'm throwing a '401 error' meaning the request was unauthorized.</p>
<p><em>Note: This is a very crude authorization system with very mediocre 'error' reporting (throwing a 401 template). For something robust I would lean on a more full-featured API system.</em></p>
<h2>Real World Example (with SmartMap)</h2>
<p>Finally, here's a slightly more realistic example I've previously implemented in production!</p>
<p>Below is a Twig API that takes two parameters: a search value and a limit. It will use SmartMap (todo: link) to search for locations nearest to the search string, order them by distance, and return them to us in JSON.</p>
<pre>{# Get our paramater values #}
{% set search = craft.app.request.getQueryParam('search') %}
{% set limit = craft.app.request.getQueryParam('limit') %}

{# Build our query, based on parameters #}
{% set locations = craft.entries.mapAddress({ target: search }).orderBy('distance').limit(limit).all() %}

{# Create an empty array to fill with our data #}
{% set locationsArray = [] %}

{# Loop over our items and fill our empty array with the necessary data #}
{% for location in locations %}

 {# Choose the properties that we need from our API #}
 {% set locationsArray = locationsArray | merge([{
 title: location.title,
 url: location.url
 }]) %}

{% endfor %}

{# Output JSON encoded array of locations #}
{{ locationsArray | json_encode | raw }}
</pre>
<p>I like this example because it shows all the steps we generally need to build the necessary data:</p>
<ol>
<li>Get our parameters (if any)</li>
<li>Build our query based on parameters</li>
<li>Create an empty object to fill</li>
<li>Loop over our items and fill our empty array with the necessary data</li>
<li>Output our data as JSON</li>
</ol>
<h2>Conclusion</h2>
<p>Does this replace the Element API plugin, Craft QL, or creating your own API endpoints? No, definitely not. Those are all powerful tools that do more/better than this method. However, this method is great for a simple API, or when you've already figured out how to query for something in Twig and don't want to convert that code to PHP. Use it in good health at your discretion!</p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>The top Craft CMS plugins used at Good Work</title>
                <link>https://simplygoodwork.com/blog/top-craft-cms-plugins-used-at-good-work</link>
                <pubDate>Fri, 15 Mar 2019 06:30:00 -0500</pubDate>
                <author>Garrett Winder</author>
                <guid>https://simplygoodwork.com/blog/top-craft-cms-plugins-used-at-good-work</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/goodwork-article-image-plugins.jpg?w=1600&amp;h=900&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666883597&amp;s=77aa01fd54723bc21a23e645dc72d685" alt="The top Craft CMS plugins used at Good Work">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p><strong>Heads up! This article was written in the Spring of 2019. Check out <a href="https://simplygoodwork.com/blog/top-craft-cms-plugins-used-at-good-work-part-two">Part Deux</a> for a more up-to-date list.</strong></p>
<p>The Craft Plugin Store recently hit a major milestone, <a href="https://craftcms.com/blog/500-plugins">surpassing five hundred third-party plugins</a> (over 600 as of September 2019) created by Craft's thriving community of developers. Plugins allow you to extend the core functionality of your Craft website, integrate with other platforms like Mailchimp, Salesforce and PayPal, or even get your own <a href="https://plugins.craftcms.com/happy-brad">Happy Brad</a> dashboard widget if you're into Craft community inside jokes.<br /></p>
<p>As a fun exercise we asked each member of our development team to select their top Craft CMS plugins. Here's the list in alphabetical order.<br /></p>
<h2>Embedded Assets</h2>
<blockquote><p>"The Embedded Assets plugin lets the client add YouTube/Vimeo videos, Instagram photos, Twitter posts and more to Craft’s Asset Manager, treating them as first-class assets."</p><cite>— Chase Giunta</cite></blockquote>
<p>The Embedded Assets plugin allows you to add videos, maps, social media content, etc. to your website as easily as uploading a photo. It's great for websites requiring integration with numerous embeddable platforms. As a bonus the plugin also adds the embeds to your Asset Library.</p>
<p><a href="https://plugins.craftcms.com/embeddedassets">Learn more about the Embedded Assets plugin</a> »</p>
<h2>FeedMe</h2>
<blockquote><p>"FeedMe is an incredibly well-thought-out and battle-tested plugin for importing your data. Whether it's importing data from your old CMS, or sharing data across Craft installations, FeedMe gets it done."</p><cite>— Jake Dohm</cite></blockquote>
<p>In addition to using FeedMe for initial data imports and sharing information across Craft installations, we also use it to sync websites with other web services like MLS for real estate projects, Shelby Arena for churches, and much more.</p>
<p><a href="https://plugins.craftcms.com/feed-me">Learn more about the FeedMe plugin</a> »</p>
<h2>Linkit</h2>
<blockquote><p>"This plugin is a true gem for content editors and developers alike. It creates a field in the CMS for content editors to link to custom URLs, other entries on the site, images, PDFs and even social media. It gives content editors tons of flexibility without the risk of breaking anything. Developers can set it and forget it."</p><cite>— Jeff Irwin</cite></blockquote>
<p>We recently used this plugin for a set of homepage call-to-action buttons, linking to a variety of entries, videos and files. The Linkit plugin allows the content editor to link to all of those entries using a simple, streamlined workflow in Craft's control panel.</p>
<p><a href="https://plugins.craftcms.com/linkit">Learn more about the Linkit plugin</a> »</p>
<h2>Retcon</h2>
<blockquote><p>"Retcon lets us modify HTML content - typically generated by rich text fields - from within Craft CMS. We can add classes to elements, extract nodes or include <code>srcset</code> parameters to inline images."</p><cite>— Chris Rowe</cite></blockquote>
<p>We use this plugin all the time, especially when the design dictates specific words within a heading to be colored differently, or use a different artisanal font. For content editors we create a Rich Text field with a simple 'Bold' button, then in our template we can swap out the <code>&lt;strong&gt;</code> tag for something like <code>&lt;span class=“font-serif text-green italic”&gt;</code> when using Tailwind.</p>
<p>You can see this in action on the <a href="https://redbirdec.com/locations">'Locations' page on the DEC @ Redbird website</a>, where the heading utilizes two colors.</p>
<p><a href="https://plugins.craftcms.com/retcon">Learn more about the Retcon plugin</a> »</p>
<h2>Super Table</h2>
<blockquote><p>"Not the most glamorous plugin, but a workhorse we use on every project. Ensuring Craft is a pleasure to use for content editors is super important to us, and Super Table allows us to achieve that."</p><em>— Gavin Platt</em></blockquote>
<p>Super Table is a Craft CMS plugin that allows you to create powerful, tabular content on your website, while utilizing existing Craft field types like assets, categories and dropdowns, rather than a simple text field.</p>
<p><a href="https://plugins.craftcms.com/super-table">Learn more about the Super Table plugin</a> »</p>
<h2>Typogrify</h2>
<blockquote><p>"This plugin is great for web typography. It handles widow protection, forced internal wrapping of long URLs and email addresses, character replacement, truncating and so much more. A truly must-have plugin for any Craft CMS installation. Another gem from nystudio107."</p><cite>— Steve Sharpe</cite></blockquote>
<p>This plugin makes your typography look good across all screen sizes and devices, ensuring typographic best practices like forcing smart curly quotes and apostrophes and correcting dreaded "widows."</p>
<p><a href="https://plugins.craftcms.com/typogrify">Learn more about the Typogrify plugin</a> »</p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>5 years of Good Work</title>
                <link>https://simplygoodwork.com/blog/5-years-of-good-work</link>
                <pubDate>Sun, 03 Mar 2019 06:30:00 -0600</pubDate>
                <author>Garrett Winder</author>
                <guid>https://simplygoodwork.com/blog/5-years-of-good-work</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/goodwork-article-image-5years.jpg?w=1600&amp;h=900&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666108409&amp;s=bad3fe56dfd84a2ef0c0a2b54dfe0396" alt="5 years of Good Work">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>Happy birthday, Good Work. The big 5!</p>
<p>I don't know how many times I've read our previous birthday messages in the last few months, but it's a lot. I love looking back and reading <a href="#end">old birthday posts</a> to see the progress we've made. This year isn't just a birthday, but a giant milestone, and we couldn't have done it without the amazing team, clients and partners we've built over the years.</p>
<p>We're now a team of nine web developers, designers and project managers scattered across the U.S., England, and France, with our home office located in Dallas, Texas. We added a few new faces this year, too. Jake Dohm joins us from North Carolina, and Grant Abston became our newest team member out of Abilene, Texas.</p>
<p>Some of you might know Jake from DotAll, the official Craft CMS Conference, and <a href="https://www.meetup.com/Triangle-JavaScript/">TriangleJS</a>, a 2,600+ member monthly JavaScript meetup in the Raleigh-Durham area that he co-organized. He's a talented developer and has been a great addition to the team.</p>
<p>Grant joins us as our Client Services Manager and will head up our <a href="https://www.reporternews.com/story/money/business/local/2019/02/23/abilene-business-notebook-good-work-expands-abilene/2942954002/">new office in Abilene, Texas</a>. This is where I started my first web agency in 2007 while at ACU, and I've been itching to open an office there ever since. <a href="https://www.texasmonthly.com/the-culture/high-rents-rural-renaissance-new-generation-is-reviving-small-town-texas/">Small Town Revival</a> is real in Texas, and towns like Abilene need local access to the high-quality web services found in big cities like Dallas.</p>
<p>While we've experienced new changes, some things have stayed the same. We've continued to hone in on our focus and streamline our process around it.</p>
<p>As we have since 2014, we've continued to grow our strategic partnerships with design and creative agencies around the world, helping with everything from web development maintenance of existing websites to developing websites and other digital products for their clients. This year we added quite a few to that list, including 214 in NYC and <a href="https://canalesco.com/">Canales &amp; Co. in Austin</a>.</p>
<p>We're also working directly with more brands across the U.S., like Applause, DPR Construction, and Heartwork, that use <a href="https://simplygoodwork.com/craft-cms">Craft CMS</a>, our preferred content management system.</p>
<p>Since 2012 Craft CMS has rapidly increased in popularity and adoption. Craft's modern approach to content management, and extreme design flexibility has garnered high praise from both developers and content editors. It offers users an expanding roadmap of modern features and has a thriving community of developers.</p>
<p>We've been using Craft CMS since day one, and in the last year have started to fly the Craft flag more publicly than ever. In November we were selected as one of the first official <a href="https://craftcms.com/partners/simplygoodwork">Craft CMS Development Partners</a>. We <a href="https://simplygoodwork.com/blog">dusted off the blog</a> and are writing about Craft on the 1st and 15th of every month, and have introduced a <a href="https://simplygoodwork.com/newsletter">once-per-month email</a> with helpful articles and resources for people who manage and make websites in Craft CMS. We're excited about the future of Craft and are doing our part to grow the platform through our agency partners and direct brands.</p>
<p>We've continued to develop and tweak our internal processes to better serve our clients, resulting in an ever-growing "Playbook" for our team. Our Director of Strategy, <a href="https://simplygoodwork.com/about/ariel-kidwell">Ariel</a>, completed the <a href="https://louderthanten.com/case-studies/good-work">LT10 Digital Project Management Apprenticeship</a> in the Fall, and I'm getting notes like this from clients more often than not:</p>
<blockquote><p>"The day we briefed with Ariel I told our team, 'we need to be buttoned up like that in our process!' Since then I’ve been digging through resources trying to find ways to get more legit."</p></blockquote>
<p id="end">It's been an amazing five years, to say the least, and I'm looking forward to continuing to slow down, simplify, and get better at what we do every day. A huge thanks to our entire team, clients and partners, we couldn't have done it without you.</p>
<p>Read our previous birthday messages:</p>
<ul>
<li><a href="https://simplygoodwork.com/blog/4-years-of-good-work">4 years of Good Work</a></li>
<li><a href="https://simplygoodwork.com/blog/3-years-of-good-work">3 years of Good Work</a></li>
<li><a href="https://simplygoodwork.com/blog/2-years-of-good-work">2 years of Good Work</a></li>
<li><a href="https://simplygoodwork.com/blog/1-year-of-good-work">1 year of Good Work</a></li>
</ul>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>Updating your website to Craft CMS 3</title>
                <link>https://simplygoodwork.com/blog/updating-your-website-to-craft-cms-3</link>
                <pubDate>Fri, 01 Mar 2019 06:30:00 -0600</pubDate>
                <author>Garrett Winder</author>
                <guid>https://simplygoodwork.com/blog/updating-your-website-to-craft-cms-3</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/goodwork-article-image-craft3update.jpg?w=1600&amp;h=900&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1667491915&amp;s=e0e770602b490e99c9f5043a78fddc70" alt="Update Craft CMS">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p><em>This article is about update your website to Craft 3. If you're looking to upgrade to Craft 4 you should read <a href="https://simplygoodwork.com/blog/update-craft-cms-3-to-4">Update Craft CMS 3 to 4</a>.</em></p>
<p>Since 2012 Craft CMS has rapidly increased in popularity and been adopted by an ever-growing list of household brands. Craft's modern approach to content management, and extreme design flexibility, has garnered <a href="http://www.cmscritic.com/announcing-the-2015-winner-of-best-cms-for-developers">high praise</a> from both developers and content editors. It offers users an expanding roadmap of modern features and has a thriving community of developers.</p>
<p>Rapid growth in popularity also means rapid growth in product maturity. In April 2018 <a href="https://craftcms.com/blog/craft-3">Craft launched version 3</a> and announced the <a href="https://craftcms.com/guides/craft-cms-2-and-craft-commerce-1-end-of-life-information">end-of-life dates for Craft 2</a> in early 2019. Now that the Craft 2 end-of-life date has come and gone, it is important to upgrade your Craft CMS website now rather than waiting.</p>
<h2>What does Craft 2 end-of-life really mean?</h2>
<p>As of January 2020, Craft 2 is no longer marketed, sold or maintained by its creators. Craft 3 is already on the market and Craft 4 is in the works, so continuing to maintain an old version doesn’t make sense. So, straight from the horse’s mouth:</p>
<ul><li><strong>Craft 2 bug fixes</strong> were supported through January 31, 2020. As of January 31, 2020 Craft is no longer fixing issues that creep into the software.</li><li><strong>Important Craft 2 security fixes</strong> will be supported through January 31, 2021. After January 31, 2021 Craft will no longer address security issues and vulnerabilities that creep into the software.</li></ul>
<h2>New features and benefits of Craft 3</h2>
<p>Craft 3 is packed with new features and benefits that can be easily introduced into your website once the upgrade is complete. Outside of its increased security, below are some of our favorite features that both content editors and website owners love.</p>
<h3>Speed and performance</h3>
<p>The new version is three times faster than its old self, a big win on the front-end for search engines like Google who analyze website speeds for page rankings. It also means the Control Panel will respond much quicker for content editors and website owners.</p>
<h3>Image editing</h3>
<p>You can now <a href="https://craftcms.com/features/all#image-editor">edit images in Craft</a> and set focal points from within the Control Panel, eliminating the need for external image editing tools or software to crop, flip or rotate images.</p>
<h3>Multi-Site Manager</h3>
<p>The new <a href="https://simplygoodwork.com/blog/use-cases-for-craft-multi-site">Multi-Site Manager</a> allows you to manage multiple websites through a single Craft 3 install, eliminating the need for numerous site logins for content edits. Your websites can share both channels and content types, or even have their own settings within the same Craft install.</p>
<p>Craft has also introduced a <a href="https://craftcms.com/features/all#plugin-store">new plugin store</a>, a soft delete feature that allows you to move items into the trash rather than permanently erasing them, and many other <a href="https://craftcms.com/features/">new and improved features in Craft 3</a>.</p>
<h2>Third-party Craft plugin updates</h2>
<p>Craft has committed to supporting bug and security fixes through January 2020 and 2021, but third-party plugin developers will decide their own end-of-life policies. Most plugin developers have begun moving to Craft 3, although some will continue to provide minimal support for existing Craft 2 plugins. Our team of developers at Good Work believe this is the most important reason to upgrade to Craft 3 sooner than later.</p>
<p>While plugins were previously managed and installed through code, Craft has released a <a href="https://plugins.craftcms.com/categories/integrations">new Plugin Store</a>, rich with new integrations and tools to make your website run as smooth as possible; all managed through the Control Panel.</p>
<h2>Scope and schedule your Craft 3 upgrade</h2>
<p>Now that the end-of-life date for Craft 2 has passed, and depending on the size and complexity of your website it’s good practice to start planning the upgrade process as soon as possible. Below are some helpful items to think through when estimating the time it will take to upgrade to Craft 3:</p>
<ul><li>Make sure your server meets the <a href="https://docs.craftcms.com/v3/requirements.html">Craft 3 requirements</a>, which are slightly different than Craft 2.<br /></li><li>Upgrade your website and plugins to Craft 2.6.2788 or newer before moving to Craft 3.</li><li>Audit all third-party plugins to make sure they have a Craft 3 version available. If they don't, contact the plugin developer to see if and when their plugins will be available for Craft 3. If they don't plan to upgrade their plugins, you'll need a different upgrade path for that particular feature of your website.</li><li>Check to see if you have any custom plugin(s) created specifically for your website. If so you'll need to update those custom plugin(s).</li><li>Review the instructions on Craft's website for <a href="https://docs.craftcms.com/v3/upgrade.html">performing the Craft 3 upgrade</a>.</li><li>Once you have a good idea of the time and effort it will take to upgrade your website be sure to schedule the upgrade as soon as possible now that the Craft 2 end-of-life date has passed.</li></ul>
<p>Further details can be found in the <a href="https://docs.craftcms.com/v3/upgrade.html#preparing-for-the-upgrade">Upgrading from Craft 2</a> section of the Craft 3 Documentation. Feel free to reach out if you have any questions.<br /></p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>Passing your Craft CMS data to Vue.js with Twig</title>
                <link>https://simplygoodwork.com/blog/passing-your-craft-cms-data-to-vue-js-with-twig</link>
                <pubDate>Fri, 15 Feb 2019 07:00:00 -0600</pubDate>
                <author>Jake Dohm</author>
                <guid>https://simplygoodwork.com/blog/passing-your-craft-cms-data-to-vue-js-with-twig</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/goodwork-article-image-craftcmsdatavuejstwig.jpg?w=1600&amp;h=900&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666883915&amp;s=2496ccde9398382ae257452749b86e3e" alt="Passing your Craft CMS data to Vue.js with Twig">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>One of the unique challenges of using Vue JS with <a href="https://simplygoodwork.com/craft-cms">Craft CMS</a> is how you get your data from Craft into Vue. Vue's whole model of reactive UI is based on having your data in Vue, and your markup reacting to changes in that data automatically. That means Vue must "own" the data required for your templates and components. But, if your data lives in Craft, how do you get that data into Vue?</p>
<p>There are multiple ways to tackle this problem, and choosing the best way depends on how your project is structured. If your project is a Single Page Application (SPA) you'll (most likely) need to create an API, and make HTTP requests to your API to get your data. But, if your project is a "traditional" server-side rendered website, then creating an API and delaying the render of your markup by waiting for an HTTP request to finish is usually not the best idea.</p>
<p>In this article, we'll cover two ways you can pass your data into Vue using just Twig templates and Vue components.</p>
<h2>Method #1: Passing your data into a component using props</h2>
<p>Vue components have the ability to receive external data using props, which is convenient when using Vue components on your Craft site. Using this pattern allows you to pass your data from Twig into a component, whether it's an object, array, string, or anything else. Here's an example:</p>
<pre>&lt;!-- page.twig --&gt;
{% set fruits = ['apple', 'banana'] %}
{% set fruitEmoji = { 'apple': '&#x1f34e;', 'banana': '&#x1f34c;' } %}

&lt;emoji-fruit-component 
 :fruits="{{ fruits | json_encode | raw }}"
 :fruitemoji="{{ fruitEmoji | json_encode | raw }}"&gt;
&lt;/emoji-fruit-component&gt;</pre>
<pre>/* page.js */
// create a component, and accept our data with props

Vue.component('emoji-fruit-component', {
 props: ['fruits', 'fruitEmoji'],
 template: '...'
})</pre>
<p>In the example above, we create two sets of data within our Twig templates: <code>fruits</code> (an array), and <code>fruitEmoji</code> (an object). Then we pass that data into our Vue component using props. Then in our JS, when we define our Vue component, we accept <code>fruit</code> and <code>fruitEmoji</code> both as props. Now the <code>fruit</code> and <code>fruitEmoji</code> data will be accessible within our Vue component.</p>
<p><strong>Tip:</strong> Use the <code>json_encode</code> filter to escape your data and make it JS-readable, then use the <code>raw</code> filter to allow HTML entities so characters like quotes are printed correctly.</p>
<h2>Method #2: Attaching data to the window, then loading it into Vue</h2>
<p>Another way to pass your data into Vue from Craft is to assign it as a global variable in JavaScript, then load that data into your Vue component or instance. Consider the following example.</p>
<pre>&lt;!-- page.twig --&gt;
{% set fruits = ['apple', 'banana'] %}
{% set fruitEmoji = { 'apple': '&#x1f34e;', 'banana': '&#x1f34c;' } %}

&lt;script&gt;
 window.craftData = {
 fruits: {{ fruits | json_encode | raw }},
 fruitEmoji: {{ fruitEmoji | json_encode | raw }},
 }
&lt;/script&gt;

/* fruit-page.js */
// load the data into your root Vue instance
new Vue({
 el: '#vue-app',
 data: window.craftData
})
// load the data into a single Vue component
Vue.component('emoji-fruit-component',{
 template: '...',
 data() { return window.craftData }
})</pre>
<p>Let me explain what I'm doing in the examples above:</p>
<ul> <li>First we create an object (<code>craftData</code>) that is attached to the global <code>window</code> object (which is globally available to all scripts).</li> <li>The <code>craftData</code> object contains any data that we need access to in Vue (or a specific component).</li> <li>Then when we instantiate our Vue instance (most likely in a JS file), or component, we tell it to pull the <code>craftData</code> object into our Vue instance as local data.</li></ul>
<h2>How to choose which method to use</h2>
<p>Now you know two methods to accomplish passing your data into Vue, but which one should you use? Well, it depends.</p>
<p>Here are a few thoughts to help you decide which method to use:</p>
<ul> <li>If you need your data in the root Vue instance (not a component), you'll need Method #2, because the root Vue instance cannot accept props.</li> <li>If you're not including the Vue template renderer in your bundle, you'll need to use Method #2. If you're unclear on what this means, check out this article on Avoiding DOM Templates: <a href="https://vuejsdevelopers.com/2017/09/17/vue-js-avoid-dom-templates/" target="_blank" rel="noreferrer noopener">https://vuejsdevelopers.com/2017/09/17/vue-js-avoid-dom-templates</a></li> <li>For any other scenario, I'd generally reach for Method #1, because to me it seems simpler and cleaner.</li></ul>
<h2>Real world examples</h2>
<p>The examples that we looked at above are using hard-coded data, but on your website you'll generally be pulling data from Craft so I wanted to provide some more relevant examples.</p>
<h3>Slider (Method #1)</h3>
<pre>{% set images = [] %}
{% for image in entry.images %}
 {% set images = images|merge([{
 url: image.one.url,
 alt: image.title
 }]) %}
{% endfor %}

&lt;vue-slider :images="{{ images | json_encode | raw }}"&gt;&lt;/vue-slider&gt;</pre>
<h3>Testimonials (Method #1)</h3>
<pre>{% set testimonials = [] %}
{% for block in entry.testimonials %}
 {% set testimonials = testimonials|merge([{
 quote: block.quote,
 name: block.name 
 }]) %}
{% endfor %}

&lt;testimonial-slider
 :testimonials="{{ testimonials| json_encode | raw }}"
 title="{{ entry.title }}"&gt;
&lt;/testimonial-slider&gt;</pre>
<h3>Blog post (Method #2)</h3>
<pre>{% set entries = craft.entries.section('blog').all() %}
{% set posts = [] %}
{% for post in entries %}
 {% set posts = posts|merge([{
 url: post.url,
 title: post.title,
 content: post.content
 }]) %}
{% endfor %}

&lt;script&gt;
 window.craftData = {
 posts: {{ posts | json_encode | raw }}
 }
&lt;/script&gt;</pre>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>Building modular websites with Craft CMS</title>
                <link>https://simplygoodwork.com/blog/building-modular-websites-with-craft-cms</link>
                <pubDate>Fri, 01 Feb 2019 10:00:00 -0600</pubDate>
                <author>Garrett Winder</author>
                <guid>https://simplygoodwork.com/blog/building-modular-websites-with-craft-cms</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/goodwork-article-image-modular_craftcms.jpg?w=1600&amp;h=900&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666883945&amp;s=5d53cd702ebfc7ec270578358734f801" alt="Building modular websites with Craft CMS">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>We were recently scoping out a website redesign project in <a href="https://simplygoodwork.com/craft-cms">Craft CMS</a> with one of our design agency partners. By no means was it a large website, but after going down the traditional route of defining the different templates that would need to be designed and developed we realized we needed to go back to the drawing board to stay within the client's timeline and budget.</p>
<p>Here are the templates we initially defined:</p>
<table>
 <thead>
 <tr>
 <th>Page</th>
 <th>Template</th>
 <th>Craft section type</th>
 </tr>
 </thead>
 <tbody>
 <tr>
 <td>Homepage</td>
 <td>Unique</td>
 <td>Single</td>
 </tr>
 <tr>
 <td>About</td>
 <td>Unique</td>
 <td>Single</td>
 </tr>
 <tr>
 <td>Team bio</td>
 <td>Unique</td>
 <td>Structure</td>
 </tr>
 <tr>
 <td>Capabilities</td>
 <td>Grid</td>
 <td>Structure</td>
 </tr>
 <tr>
 <td>Capabilities detail</td>
 <td>Unique</td>
 <td>(Generated by Capabilities channel)</td>
 </tr>
 <tr>
 <td>Process</td>
 <td>Grid</td>
 <td>Structure</td>
 </tr>
 <tr>
 <td>Process detail</td>
 <td>Unique</td>
 <td>(Generated by Process channel)</td>
 </tr>
 <tr>
 <td>Clients</td>
 <td>Grid</td>
 <td>Structure</td>
 </tr>
 <tr>
 <td>Contact</td>
 <td>Unique</td>
 <td>Single</td>
 </tr>
 </tbody>
</table>

<p>As you can see above, taking a traditional approach to scope out a project like this one would require 7 to 9 unique templates to build out the website. This particular client did not have the time or budget for this approach though, so we needed to try something else.</p>
<p>After a quick brainstorming session with our design agency partner, we landed on a modular approach that would be incredibly straight forward to develop in Craft CMS and would allow the content editor a lot of flexibility.</p>
<p>The idea was that we audit the content for the website to come up with a set number of modules to help build out a Master Template in Craft CMS, rather than a bunch of different unique templates for each page like in the table above. We'd make use of <a href="https://craftcms.com/features/all#matrix">Craft's Matrix Field</a> to allow the client full control of which modules they use on each page and in what order. This would all be done in one single <a href="https://craftcms.com/features/all#section-types">Structure section type</a> that we would call Pages.</p>
<p>With this approach, the client could easily build out pages in a unique way based on the content and the modules available to them as well as drag and drop their own taxonomy using the out of the box functionality that comes with Craft's Structure section type.</p>
<p>Lastly, they could build out and manage their own primary navigation with the <a href="https://plugins.craftcms.com/navigation">Navigation Plugin</a>.</p>
<p><em>How snazzy!</em></p>
<p>After the content audit, we came up with 14 different modules to build out the Master Template. We whittled this down even further by building out module configuration fields in Craft, but here's the full list for documentation's sake:</p>
<ul><li>Hero Module</li><li>3-Column Listing</li><li>Centered Text</li><li>2-Column Text</li><li>Client Testimonials</li><li>1/3 Image + Text</li><li>1/2 Image + Text</li><li>Client Logo Grid</li><li>Full-Width Image</li><li>Full-Width Video</li><li>5-Column Listing</li><li>Subdivision Toggle</li><li>1/2-Width Graphic + Text</li><li>Contact</li></ul>
<p>Using the Master Template approach, a content editor is able to create pages using any or all of the above modules in any order they'd like.</p>
<p>The end result was a single Structure section type powered by one Master Template with 14 optional modules for all types of content. Here's our updated table:</p>
<table>
 <thead>
 <tr>
 <th>Page</th>
 <th>Template</th>
 <th>Craft section type</th>
 </tr>
 </thead>
 <tbody>
 <tr>
 <td>All pages</td>
 <td>Master Template</td>
 <td>Structure</td>
 </tr>
 </tbody>
</table>
<p>Of course the flexibility you provide the content editor can vary. In this case we gave full flexibility to build out any page with any module, but you could still save time and money with a version of this approach while still having multiple section types and perhaps only allowing certain modules per sections, etc, to help put constraints on the content entry.</p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>Developing a Craft CMS website maintenance plan</title>
                <link>https://simplygoodwork.com/blog/craft-cms-website-maintenance-plan</link>
                <pubDate>Tue, 15 Jan 2019 10:00:00 -0600</pubDate>
                <author>Garrett Winder</author>
                <guid>https://simplygoodwork.com/blog/craft-cms-website-maintenance-plan</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/goodwork-article-image-postlaunchcms.jpg?w=1600&amp;h=900&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666883970&amp;s=473a50bcd10ca1aa8770887fded17869" alt="Developing a Craft CMS website maintenance plan">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>Over the years we’ve developed and maintained dozens of <a href="https://simplygoodwork.com/craft-cms">Craft CMS</a> websites. Sometimes we’re brought into the initial development phase and are able to create them from scratch, but more regularly we’re brought in post-launch as a company outgrows its existing development partner or their needs change. This happens for a number of reasons, but the most common scenarios are:</p>
<ol><li>Your Craft CMS site was created by a smaller, sometimes 1-person shop and your growing online initiatives outgrow the preferred working style or available capacity.</li><li>The company that built your Craft CMS site specializes in start-to-finish website design projects and strategically chooses to stay away from support and maintenance work.</li></ol>
<p>In both scenarios, it’s difficult to maintain websites after launch while juggling larger design and development projects if you don’t have an intentional plan in place. We’ve experienced this firsthand and it wasn’t until we developed <a href="https://simplygoodwork.com/monthly-website-maintenance-plans">our maintenance plans</a> a few years ago that we figured out how to manage ongoing support and maintenance projects successfully.</p>
<p>In this blog post, I'll explain the issues to solve in order to develop a website maintenance plan that scales and works for the long haul.</p>
<p>The first issue is the ability to fit small support projects and regular updates into your work schedule without derailing larger start-to-finish projects. At Good Work, at any given time each member of our development team could be on a 4, 6, or 8-week development project while tackling a handful of support projects (typically 1-8 hours) in parallel. This works alright until you get to the end of a larger project and realize you’re quite a bit behind from the context-switching required for the smaller projects. We tried a few things here: one person on website maintenance for set hours per month, week, etc., neither of which seemed to fully solve the problem. In the summer of 2017, we made the decision to start building a full-time maintenance team for the ability to handle support in parallel to larger projects without the issue of context switching and project derailment.</p>
<p>The second issue is that support and maintenance projects have the same overhead needs, just in smaller intervals, and should be treated the same as larger projects. They still need to be estimated, they still need kick-off calls and timelines, and so they should be split out into their own projects rather than all falling into a generic “Website X Support” in your project management and time-tracking tools. This problem was easier to solve, and more of a mindset change than anything else. All projects, whether 30 minutes or 12 weeks, go through our project onboarding process to ensure they’re clearly defined, estimated, and have a set timeline.</p>
<p>Another requirement to creating a good plan is that whether you’re a team of one or a team of one hundred, you should have a shared code and deployment convention so that anyone can hop in and understand how to set up and maintain the website with as little hassle as possible. At Good Work, we have a starter system as our baseline Craft CMS installation that we use for all websites that we create. For the websites we take on in a maintenance capacity we transition what we can into our convention and document anything out of the ordinary to streamline future development.</p>
<p>Lastly, your maintenance plan requires a significant amount of ongoing communication with the client. There are always bug fixes, new features, and CMS updates being prioritized and re-prioritized on a regular basis depending on the volume of work. What’s worked well for us is a combination of quick weekly status calls (sometimes even daily depending on the volume of work), monthly prioritization meetings, and a shared Trello board for progress transparency and project management.</p>
<p>In summary, developing a good support and maintenance plan is an important part of the web as a whole and can be done successfully with a good process in place. For our team that means:</p>
<ul><li>A full-time team to manage all website maintenance services</li><li>Treating maintenance projects the same as larger projects</li><li>A shared code and deployment convention across all projects</li><li>Regular communication and transparency of work-in-process</li></ul>
<p>By creating an intentional process around your maintenance plan you can maintain existing Craft CMS projects with the same quality, efficiency, and care as new builds in the long term.</p>
<p>You can learn more about our maintenance plans at: <a href="https://simplygoodwork.com/maintenance">simplygoodwork.com/maintenance</a></p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>4 years of Good Work</title>
                <link>https://simplygoodwork.com/blog/4-years-of-good-work</link>
                <pubDate>Sat, 03 Mar 2018 08:00:00 -0600</pubDate>
                <author>Garrett Winder</author>
                <guid>https://simplygoodwork.com/blog/4-years-of-good-work</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/goodwork-article-image-4years.jpg?w=1600&amp;h=900&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666108396&amp;s=ab5e11d2af7ead57265db7c21b1ceeef" alt="4 years of Good Work">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>It’s hard to believe this is the 4<sup>th</sup> Good Work birthday message. This time last year we went all in on being <em>the development team for design agencies</em>, and over the last few days, I've reflected on how we've done that as well as a few other highlights from the past 52 weeks.</p>
<h2>Spring<br /></h2>
<p>We started off the year launching quite a few websites, and at the end of March, we launched The Good Bracket, a fun little March Madness bracket we created for our clients and other friends in the digital community. <a href="https://www.instagram.com/p/BR85qH2hxg6/" target="_blank" rel="noreferrer noopener">I spoke at the ACU CEO Series for their School of Business</a>, followed by a two-week retreat to England. It's bad luck to go a year without a pint from <a href="http://www.castlerockbrewery.co.uk/pubs/keans-head/">The Kean’s Head</a>, so I went ahead and took care of that early. In May we began work with <a href="https://www.mizzenandmain.com/">Mizzen+Main</a>, an online men’s clothing brand that we now manage and maintain on an ongoing basis.</p>
<h2>Summer<br /></h2>
<p>Leading into summer Chris and Steve began working with <a href="https://hellobestow.com">Bestow</a>, a startup down the street from us in Dallas turning life insurance on its head. We worked alongside their design team developing the front-end of their React applications and their marketing website. In June we did an <a href="https://en.wikipedia.org/wiki/Austin,_Texas">ATX</a> tour, chatting to potential clients and telling our story. Things continued to get busier and busier and in late July we hired Ariel, our first full-time Studio Manager, and to help with the growth we made an over the top internal book called The Playbook to streamline how we operate, manage clients and fill our pipeline.</p>
<p>We closed out the summer by having the whole team out to Durango, Colorado where we ate, drank, tubed, and talked strategy.</p>
<h2>Fall<br /></h2>
<p>In September Chase and Jeff joined as the 7th and 8th members of our team. Ariel continued to step up our client services game and our development team spent the majority of the Fall deep in client projects. Steve launched our first iOS application and we began ideating on productizing websites for smaller markets. We partnered with ACU to help launch their Startup Madness event, and The Community Foundation of Abilene to create a website for their <a href="https://openroadabilene.com/">Open Road Series</a>, an event we're proud to have joined the ranks of our growing list of sponsorships.</p>
<h2>Winter<br /></h2>
<p>Leading into the holiday break we launched Hatch, a new productized web design service for smaller markets that feels more like a fully custom website than Wix or Squarespace. For more information, you can read the <a href="https://dallasinnovates.com/good-work-serves-up-accessible-web-dev-with-hatch/">Hatch write-up in Dallas Innovates</a>.</p>
<p>The new year started off more exciting than ever. Boots and Gavin launched <a href="https://criquetshirts.com/">Criquet Shirts</a> and we started new relationships with companies like <a href="https://www.freeman.com/">Freeman</a>, <a href="https://www.fritolay.com/">Frito-Lay North America</a> and <a href="https://www.migolondrina.com/">Mi Golondrina</a>.</p>
<hr />
<p>Here's to another year of partnering with design teams to bring new and exciting digital projects to life. Thank you to all of our clients and partners for another year of doing Good Work.</p>
<p>Read our previous birthday messages:</p>
<ol><li><a href="https://simplygoodwork.com/blog/an-introduction-to-good-work">An introduction to Good Work</a></li><li><a href="https://simplygoodwork.com/blog/1-year-of-good-work">1 year of Good Work</a></li><li><a href="https://simplygoodwork.com/blog/2-years-of-good-work">2 years of Good Work</a></li><li><a href="https://simplygoodwork.com/blog/3-years-of-good-work">3 years of Good Work</a></li></ol>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>Technical SEO checklist</title>
                <link>https://simplygoodwork.com/blog/technical-seo-checklist</link>
                <pubDate>Thu, 20 Apr 2017 07:25:00 -0500</pubDate>
                <author>Garrett Winder</author>
                <guid>https://simplygoodwork.com/blog/technical-seo-checklist</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/goodwork-article-image-seochecklist.jpg?w=1600&amp;h=900&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666884007&amp;s=1f87a20d4b984d8b43f537354baf829f" alt="Technical SEO checklist">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p><strong>Our Technical SEO Checklist is updated regularly to ensure it’s as accurate as possible.</strong></p>
<p>As the web grows in complexity, Technical SEO becomes more and more relevant. Everything from site speed to security, to overall website usability across a multitude of platforms, is relevant in modern-day SEO.</p>
<p>Technical SEO is the optimization work that needs to be done outside of content, link building and outreach. It's the strong foundation that gives you the ability to rank well in today's search engine landscape. Lastly, Technical SEO helps to check the boxes next to Google’s development-related ranking factors and plants the seed for search engine success.</p>
<p>Here's the Technical SEO Checklist we go through at Good Work with every website we launch for our clients. The list is broken down by usability items, on-page items, and third-party software integrations.</p>
<h2>Usability items</h2>
<p>First off, we have the usability-related items on the checklist. Google not only wants to return the best results, but also the fastest, most secure and user-friendly results. Here are the usability-related items on our checklist.</p>
<h3>Website speed and page load time</h3>
<p>Website speed is an important factor in user experience, and your website's users expect your website to load quickly.</p>
<p>We can check website speed and load times with <a href="https://developers.google.com/speed/pagespeed/insights" target="_blank" rel="noreferrer noopener">Google PageSpeed Insights</a>. PageSpeed Insights will spit out personalized recommendations for both mobile and desktop to speed up our website for an overall better user experience. Some examples of things PageSpeed Insights will recommend if we haven't already done so are:</p>
<ul><li>Leverage browser caching</li><li>Eliminate render-blocking JavaScript and CSS</li><li>Reduce server response time</li><li>Avoid landing page redirects</li><li>Enable compression on the web server</li><li>Minify HTML, CSS and Javascript</li><li>Optimize images</li></ul>
<p>These items can be taken care of either in the website codebase or the web server the website lives on. Most of this is done in the <code>.htaccess</code> file and a good <a href="https://vitejs.dev/" target="_blank" rel="noreferrer noopener">Vite</a> process.</p>
<h4>Website hosting</h4>
<p>Not all website hosting providers are created equal. Rather than using lower-end shared hosting on platforms like GoDaddy and MediaTemple, consider using a more <a href="https://simplygoodwork.com/services">modern hosting platform</a>.</p>
<h4>Use a content delivery network (CDN)</h4>
<p>To help optimize your website for high-speed delivery and faster load page times, use a CDN — like Amazon S3 — for static website assets and uploads, like images, PDFs and videos.</p>
<h4>Content management system (CMS) implementation</h4>
<p>CMS implementation is often an overlooked component when optimizing your website for speed and performance, but usually provides a better return than the usual suspects.</p>
<p>Consider configuring template caching where you can, and find ways to adjust your template logic to make fewer calls to the database.</p>
<h3>SSL certificate</h3>
<p>An SSL certificate is what secures your website and gives it that little green padlock you're used to seeing in your browser's URL bar. There are a lot of reasons to secure your website, but from a simple SEO standpoint, Google wants you to.</p>
<p>Back in September 2016, Google announced their plan for <a href="https://security.googleblog.com/2016/09/moving-towards-more-secure-web.html" target="_blank" rel="noreferrer noopener">a more secure web</a>, with a hint at their eventual "Not secure!" messages next to all websites that do not have SSL certificates. This was implemented in July 2018 with the release of Google Chrome 68.</p>
<p>Google has created documentation on <a href="https://developers.google.com/web/fundamentals/security/encrypt-in-transit/enable-https" target="_blank" rel="noreferrer noopener">enabling HTTPS on your web server</a> to help you add an SSL certificate to your website. This can also be done fairly quickly by magic development fingers.</p>
<h3>Mobile friendly</h3>
<p>People will be accessing your website from a wide range of devices, and Google expects your website to be optimized for those devices for a better user experience.</p>
<p>Google has also introduced <a href="https://webmasters.googleblog.com/2016/11/mobile-first-indexing.html" target="_blank" rel="noreferrer noopener">mobile-first indexing</a>, meaning their search results are based on the mobile version of your website.</p>
<p>Long story short, your website needs to be responsive and mobile-friendly.</p>
<h2>On page items</h2>
<p>Now that we've covered speed, security and mobile friendliness, we can jump to the portion of technical SEO directly related to your website's codebase.</p>
<p>The majority of the items below can be automated and/or managed through your website if your content management system is configured correctly. For instance, we regularly use <a href="https://simplygoodwork.com/craft-cms">Craft CMS</a> which has a great SEO plugin called SEOmatic.</p>
<h3>Title tags</h3>
<p>Make sure every page on your website has a unique title tag that describes the page in about 50-60 characters. Title tags are displayed on search engine result pages (SERPs) and should be simple and written as "Ad copy" for humans.</p>
<p>Title tags are not a factor in Google rankings but a well-thought-out title tag can lead to more organic traffic to your website.</p>
<h3>Meta descriptions</h3>
<p>Make sure every page on your website has a unique meta description that describes the page in about 160 characters. Just like title tags, meta descriptions are used as "Ad copy" in SERPS and are not a Google ranking factor.</p>
<p>It's worth noting that because Google highlights search words in search results, having the right keywords here in a human-readable way will help you stand out.</p>
<h3>Social meta tags</h3>
<p>Social meta tags allow you to have unique information show up when your content is shared on social media websites like Facebook and Twitter.</p>
<p>For example, here's what happens when you share a link on Twitter that has social meta tags in place: <a href="https://dev.twitter.com/cards/types/summary-large-image" target="_blank" rel="noreferrer noopener">a Twitter summary card with a large image</a>.</p>
<h3>Image alt tags</h3>
<p>Image alt tags help describe images for search engine bots as well as the visually impaired. Adding good, descriptive alt tags to your images ensures everyone can understand the images on your website.</p>
<h3>Structured data</h3>
<p>Structured data helps search engine bots better understand the content on your pages, and give you access to enhanced search results called rich snippets. Rich snippets in search results can significantly increase the number of people who visit your website.</p>
<p>Structured data can be used to markup things like articles, restaurant menus, events, and company information. To learn more about structured data, visit schema.org.</p>
<h3>Proper use of HTML elements</h3>
<p>We need to make sure we're using proper HTML elements to mark up our pages. H1s for page headings, unordered lists for lists, strong for bold, etc. This gives the content on our website a deeper meaning to search engines.</p>
<p>There are <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element" target="_blank" rel="noreferrer noopener">a lot of HTML elements</a>, and we need to make sure we're always using the most useful ones on our web pages.</p>
<h3>Internal linking strategy</h3>
<p>Internal links are links that go from one page on your website to another page on your website. A proper internal linking strategy with well-written anchor text establishes site architecture, spreads link equity, and aids in the flow of Google PageRank throughout your website.<br /></p>
<h3>Robots.txt</h3>
<p>Make sure your website has a robots.txt file. A robot.txt file tells search engines what pages to, and not to, include in search results.</p>
<p>You can learn more about robots.txt at <a href="http://www.robotstxt.org/robotstxt.html" target="_blank" rel="noreferrer noopener">robotstxt.org</a>.</p>
<h3>Sitemap</h3>
<p>Make sure your website has a sitemap.xml file. A sitemap is an XML file that lists all of the pages on your website, along with when they were last updated and the priority and frequency you'd like search engines to crawl them.</p>
<h3>Good URL structure</h3>
<p>Any modern content management system will be able to handle this out of the box, but we need to make sure we're using URLs like <code>website.com/products/furry-red-hat</code> instead of <code>website.com/product_id=873hfdn29o</code>. Cleaner URLs are easier to remember, help explain the content on the page and are a factor in search engine rankings.</p>
<h2>3rd party software integrations</h2>
<p>Lastly, we need to make sure we've added essential third-party integrations like <a href="https://analytics.google.com/analytics/" target="_blank" rel="noreferrer noopener">Google Analytics</a> and <a href="https://search.google.com/search-console/about" target="_blank" rel="noreferrer noopener">Google Search Console</a>. These allow us to begin <a href="https://simplygoodwork.com/blog/how-to-use-google-analytics-to-improve-your-website">tracking usage data</a> and help flag errors as they arise.</p>
<p>You're probably used to adding Google Analytics to your websites, but if you're not familiar with Google Search Console, here's what makes it shine:</p>
<ol><li>It’s the only place Google will give you direct feedback about specific things you need to do to improve your website. They do this through the "Messages" section and it's incredibly valuable.</li><li>It'll keep a list of crawl errors so you know what pages are causing trouble, and can fix them accordingly. For instance, pages on your site may have broken links that need to be fixed, or you may have 404 pages that need 301 redirects. </li><li>You can submit your sitemap regularly, and check to see the status of pages that are (and aren't) crawled by Google yet.</li></ol>
<p>It also has loads of other valuable tools, like how you're ranking for different search queries, etc.</p>
<hr />
<p>After going through the Technical SEO Checklist above, it's good practice to do one final technical site audit for errors before launch. You can do this with a tool called <a href="https://raventools.com/site-auditor/" target="_blank" rel="noreferrer noopener">Raven Site Auditor</a>. Raven is an SEO audit tool that will crawl your website and flag up anything we missed above.</p>
<p>Here are a few examples of warnings Raven can flag up for you:</p>
<ul><li>Mobile and desktop speed performance</li><li>Duplicate title elements and meta descriptions</li><li>On-page duplicate content</li><li>Low word count on pages</li><li>Images missing alt text</li><li>Pages missing structured data</li></ul>
<p>After crawling your website, Raven gives you a grade between 0 and 100, and marks all issues as "critical", "warning" or "needs attention" to help you prioritize.</p>
<p>Using the 80/20 rule you can typically get your grade up to 90-95, at which point your website is ready for liftoff!</p>
<p>Submit your sitemap to Google using the Google Search Console and vualá. Pat yourself on the back for a job well done.<br /></p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>The first Good Bracket</title>
                <link>https://simplygoodwork.com/blog/first-good-bracket</link>
                <pubDate>Fri, 31 Mar 2017 07:48:00 -0500</pubDate>
                <author>Garrett Winder</author>
                <guid>https://simplygoodwork.com/blog/first-good-bracket</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/goodwork-article-image-firstgoodbracket.jpg?w=1600&amp;h=900&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666884033&amp;s=05e37db3d266e8d1a00c4a70e758f8ad" alt="The first Good Bracket">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>Earlier this month we created our first annual Good Bracket  —  a March Madness starter kit for facilitating your design agency’s office pool. We sent the kit out to about 50 design agencies around the nation; a handful of current clients along with a very select group of agencies we could see ourselves working with in the future.</p>
<p>The idea came about over a cup of coffee the Monday morning before the 2017 March Madness schedule was announced. We were looking for ways to get our name out there as a <em>web and mobile development partner for design agencies</em> without using the standard car salesman tactics...vualá.</p>
<p>We were on a tight schedule so just like any project, we came up with a game plan, setup some milestones and hit the ground running.<br /></p>
<ul><li><strong>Monday</strong>: Order tubes to send the 24” × 36” master brackets in</li><li><strong>Tuesday</strong>: Design the brackets and come up with a game plan for printing</li><li><strong>Wednesday</strong>: Create content for, and design, instructions</li><li><strong>Thursday</strong>: Create custom labels for the tubes and create a website to feed everything through</li><li><strong>Friday</strong>: Package it all up and send it off!</li></ul>
<p>It was fun getting our hands dirty in a <em>physical</em> project for once, and we're looking forward to doing it again next year. We'll be able to do a lot more, too, since we’ll have more than 5 days to think it all through this time.<br /></p>
<p>Hip hip hooray to our friends at <a href="http://www.clampitt.com/">Clampitt Paper</a> for donating the <em>PosterColor X 180 matte</em> paper we printed the Master Brackets on this year.<br /></p>
<p>Here are some pictures of how it all turned out.</p>
<figure>
<img src="https://s3.amazonaws.com/simplygoodwork-com-assets/blog/good-bracket-2017/first-annual-good-work-bracket-1.JPG" alt="A stack of master brackets and instructions on the conference table" title="A stack of master brackets and instructions on the conference table" />
</figure>
<figure>
<img src="https://s3.amazonaws.com/simplygoodwork-com-assets/blog/good-bracket-2017/first-annual-good-work-bracket-2.JPG" alt="Close up of the instructions we sent along with the Good Bracket kit" title="Close up of the instructions we sent along with the Good Bracket kit" />
</figure>
<figure>
<img src="https://simplygoodwork.com/uploads/blog/first-annual-good-work-bracket-3.JPG" alt="A box of packaged up Good Brackets ready to be shipped off" title="A box of packaged up Good Brackets ready to be shipped off" />
</figure>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>3 years of Good Work</title>
                <link>https://simplygoodwork.com/blog/3-years-of-good-work</link>
                <pubDate>Fri, 03 Mar 2017 00:00:00 -0600</pubDate>
                <author>Garrett Winder</author>
                <guid>https://simplygoodwork.com/blog/3-years-of-good-work</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/goodwork-article-image-3years.jpg?w=1600&amp;h=900&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666108384&amp;s=7eccad5ee392d0a833d0a804eaa9f8d6" alt="3 years of Good Work">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>Happy birthday Good Work, you’re 3.</p>
<blockquote>You survived your terrible twos, you can walk, talk, and more food is ending up in your mouth than on the floor. You’re not quite running yet, but that’ll be here before you know it.</blockquote>
<p>I spent the last few days thinking about where we came from, where we’re at, and where we’re going.</p>
<p><a href="https://simplygoodwork.com/blog/1-year-of-good-work">Year one</a> was all about validating the idea that people will pay us enough money to keep the lights on and finding our broad focus. Making it to <a href="https://simplygoodwork.com/blog/2-years-of-good-work">year two</a> confirmed that idea, so we started to transition from project-to-project contractors to taking on a few full time employees. We tightened our focus a little more. This past year was all about getting things organized, delegated and <em>really</em> narrowing our focus. Year 1. Validate, 2. Commit, 3. Narrow. 4. Not sure yet.</p>
<p>Jaime took over scheduling and “air traffic control” in March. When a project comes in, she onboards it into Accounting, Trello, Harvest, Forecast, etc. We wrote more about our <a href="https://simplygoodwork.com/blog/automating-our-project-onboarding-process">project onboarding process</a> back in March 2016 in our first attempt to automate it.</p>
<p>In April our dear Covington went out and bought himself a <a href="https://www.stupidgoodcoffee.com/">coffee shop</a>, so we spent a few months as a team of three again. We took 3 long months to find his replacement, but instead, we found two that were well worth the wait.</p>
<p>In May we started our <span class="redactor-unlink"></span>“monthly” Hackdays.</p>
<p>Steve joined the team at the beginning of August and Gavin started at the end. <a href="https://simplygoodwork.com/about">And then we were a team of five</a>. We were now a full team encompassing design (Gavin), front-end development (everyone, <em>especially Boots!</em>) and back-end development (Steve) — yeehaw.</p>
<p>Shortly after Steve and Gavin joined, Chris took on the role of Development Director. This was inevitable, and behind the scenes already true, but we made it official.</p>
<p>We launched our first <a href="https://simplygoodwork.com/blog/donkeytail-plugin-craft-cms">Craft CMS plugin, Donkeytail</a> — a product of Chris’s brain. This was a huge feat. Launching internal projects as a client services agency is hard, and we did it. Big pats on the back ensued.</p>
<p>Over the last few years, our work with design agencies has steadily grown to the point that it’s now the majority of our business. We work with about a dozen design agencies here in Dallas, and a handful more across the US and UK. So, in the Fall we put our foot in the sand and said that’s all we’re going to do. We’re a development partner for agencies. It’s funny, once we said that out loud, what needed to be done became a lot more clear.</p>
<p>If you’ve ever read <a href="http://www.winwithoutpitching.com/the-manifesto/">The Win Without Pitching Manifesto</a>, Blair Enns speaks about this exactly. Narrow your focus and it all becomes more clear. Easier said than done, especially in the beginning, but as soon as we decided that what we do is simply “help design agencies build things for web and mobile”, it finally made sense. Narrowing in year one would have felt like a giant cut in opportunity. Now it feels like a giant leap in opportunity.</p>
<p>Once this was all said and done, I couldn’t get an updated Good Work website launched fast enough. Team Good Work was head down in client work for months, so I brought (best) friends Phil Swan and <a href="http://christophrauscher.de/">Christoph Rauscher</a> in. I wrote the copy and attempted to communicate a vision, and voila: a new <a href="https://simplygoodwork.com/"><strong>simplygoodwork.com</strong></a>. The new us.</p>
<p>Year three ended with a trip over the pond to England. We spent a week with the UK team (Chris, Gavin and Steve), and got to re-remember where this whole thing started, the Lace Market in Nottingham, UK. I love that town and everything about it. We’re headquartered in Dallas, but I’m 95% certain the idea of Good Work happened at <a href="https://www.castlerockbrewery.co.uk/pubs/keans-head/">The Kean’s Head</a> over a pint of Harvest Pale with Phil.</p>
<p>This year I’m looking forward to where our newfound focus takes us. To serving our current partners better, bringing on new ones, and continuing to make Good Work a better place than it was the year before.</p>
<p>Read our previous birthday messages:</p>
<ol><li><a href="https://simplygoodwork.com/blog/an-introduction-to-good-work"> An introduction to Good Work</a><br /></li><li><a href="https://simplygoodwork.com/blog/1-year-of-good-work">1 year of Good Work</a></li><li><a href="https://simplygoodwork.com/blog/2-years-of-good-work">2 years of Good Work</a></li></ol>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>Inaugural Craft CMS meetup in Dallas</title>
                <link>https://simplygoodwork.com/blog/inaugural-craftcms-meetup-in-dallas</link>
                <pubDate>Thu, 15 Sep 2016 00:00:00 -0500</pubDate>
                <author>Boots Highland</author>
                <guid>https://simplygoodwork.com/blog/inaugural-craftcms-meetup-in-dallas</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/craft-cms-meetup.jpg?w=900&amp;h=900&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666884058&amp;s=a96e6140056d3e521ef784d3b38a947e" alt="Craft CMS meetup in Dallas">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>Yesterday we hosted the inaugural #CraftCMS Dallas meetup by our friends at <a href="http://www.busynoggin.com/" target="_blank" rel="noreferrer noopener">Busy Noggin</a> — complete with lots of pizza, Twig and general website chatter. A good time was had and we're looking forward to being a part of the growing <a href="https://simplygoodwork.com/craft-cms">Craft CMS</a> community here in Dallas.</p>
<p>If you missed it but are into Craft, don't fret - there'll be plenty more to come.</p>
<p>If you’ve not used Craft but are curious about it’s benefits over other CMS platforms, by all means, you come too. We’ll fill you in.</p>
<p><a href="http://www.meetup.com/DFW-Craft-CMS-Meetup/" target="_blank" rel="noreferrer noopener">Watch this space for future meetups</a>.</p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>Bob’s your uncle!</title>
                <link>https://simplygoodwork.com/blog/bobs-your-uncle</link>
                <pubDate>Mon, 22 Aug 2016 08:00:00 -0500</pubDate>
                <author>Garrett Winder</author>
                <guid>https://simplygoodwork.com/blog/bobs-your-uncle</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/welcome-gav-and-steve.png?w=667&amp;h=388&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666884089&amp;s=01f1fff084134991f9f746d543a120b7" alt="Welcome Gavin and Steve">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>A hearty welcome to the latest additions to <a href="/about">our growing family</a>, Steve Sharpe and Gavin Platt. Steve’s in Nottingham with Chris, and Gavin’s from wherever he’s calling home this week (though his mailing address is in Leeds).</p>
<p>Steve’s our new in-house engineer — building anything from complex enterprise applications to native apps for iOS and Android. Gavin joins us after 10 years as a self employed web designer and is heading up our visual design efforts as well as assisting our front-end world domination initiatives.</p>
<p>And as they say, the rest is history.</p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>Why our clients love Craft CMS</title>
                <link>https://simplygoodwork.com/blog/why-our-clients-love-craft</link>
                <pubDate>Mon, 16 May 2016 09:00:00 -0500</pubDate>
                <author>Covington Doan</author>
                <guid>https://simplygoodwork.com/blog/why-our-clients-love-craft</guid>
                <description><![CDATA[
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p><strong>This article was written in 2016. You can find more recent Craft CMS articles that we have written on our <a href="https://simplygoodwork.com/blog/craft-cms">Craft Blog</a>.</strong></p>
<p>More and more people are discovering <a href="https://simplygoodwork.com/craft-cms">Craft CMS</a>. With big names like the AirBnb, PBS Kids, Netflix, and Sonos moving to Craft, the future looks bright. </p>
<hr />
<p>There's a lot out there on what makes Craft great from a web development standpoint, but Craft is great for non-technical users, too. </p>
<p>Here are the biggest reasons our clients love Craft:<br /></p>
<h2>Live Preview + Matrix Fields</h2>
<p>This is a formidable 1-2 combo.</p>
<p><abbr title="What You See Is What You Get">WYSIWYG</abbr> editors make the promise of being able to create beautiful page layouts, but are often a hassle to work with. You're constantly switching between views and re-dragging-and-dropping. And all the while you're hoping you don't have to click that dreaded "HTML Source" button...</p>
<p><a href="https://craftcms.com/features/live-preview">Craft's Live Preview feature</a> combined with <a href="https://craftcms.com/features/matrix">Craft Matrix fields</a>, give you the flexibility to create your own layouts without the fear of "messing things up". </p>
<p>Craft Matrix fields are made up of blocks and you can have many different block types. Blocks can be added, deleted, and reordered as needed, which gives authors the flexibility to create unique layouts that look professional and considered. </p>
<p>Here’s an example for one of our clients:</p>
<figure><img src="https://simplygoodwork.com/uploads/blog/menu-builder-matrix.jpg" alt="Screenshot of a Craft CMS entry edit page next to the actual web page" title="Screenshot of a Craft CMS entry edit page next to the actual web page" /></figure>
<p>We used Matrix fields to help our client create custom restaurant menus.</p>
<p>Craft's Live Preview feature lets you see how your content will look before it goes live. You can also share your work with others to get feedback before publishing to the live site. Craft gives you a special link to view the page (without requiring a login). </p>
<div><figure><iframe id="vimeo-111679726" class="vimeo" src="//player.vimeo.com/video/111679726?api=1&amp;player_id=vimeo-111679726"></iframe></figure></div>
<p>These two features make it a breeze for our clients to create and manage their content.</p>
<h2>Simple and Intuitive Backend</h2>
<p>Craft is simple and straightforward through and through.</p>
<p>The control panel is simple and intuitively organized. The controls are easy to use on any device. So you can make minor changes or additions even when you're away from the office. </p>
<figure><img src="https://simplygoodwork.com/uploads/blog/craft-on-the-go.jpg" alt="A person holding a phone showing the mobile friendly Craft CMS admin panel" title="A person holding a phone showing the mobile friendly Craft CMS admin panel" /></figure>
<h2>Quick and Easy Updates</h2>
<p>Because Craft provides so many features right out of the box, we can reduce the amount of third-party code/plug-ins, which makes updating Craft a breeze. Updates usually take seconds instead of hours. </p>
<p>To summarize, Craft delivers one of the best client CMS experiences and we love making sites with Craft.</p>
<p>If you're interested in learning more, we've written about the history of Craft, with included links to resources and milestones on our <a href="https://simplygoodwork.com/craft-cms">Craft CMS page</a>.</p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>Automating our project onboarding process</title>
                <link>https://simplygoodwork.com/blog/automating-our-project-onboarding-process</link>
                <pubDate>Tue, 22 Mar 2016 19:00:00 -0500</pubDate>
                <author>Garrett Winder</author>
                <guid>https://simplygoodwork.com/blog/automating-our-project-onboarding-process</guid>
                <description><![CDATA[
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>We use quite a few web apps at Good Work to help simplify our day to day life. On the operations side, that's <a href="https://trello.com/garrettwinder/recommend">Trello</a>, <a href="http://try.hrv.st/1-086169">Harvest</a> and <a href="https://www.getharvest.com/forecast">Forecast</a>. We use Trello as our project management software, Harvest for time tracking and reporting, and Forecast for resource management.</p>
<hr />
<p>Here's our project onboarding checklist for new projects and how that works with the 3 systems above.</p>
<ol>
<li>A templated email goes out to our master queue list with the client name, project name, budget and any pre-project details we have about the job. This email comes from the project manager, and goes out to me and the bookkeeper.</li>
<li>The project manager adds a card to the Planning column in our "Master Queue" Trello board with the details from the email, and assigns themselves to the card<br /></li>
<li>They add the project to <a href="http://try.hrv.st/1-086169">Harvest</a></li>
<li>They add the project to Forecast and schedule it with the appropriate team members</li>
<li>Lastly, they go to the card on the Trello board, add whoever is going to actually do the work, add a deadline and move the card to the “To do” column.</li>
</ol>
<p>Once the project is complete, it goes to the "Done" column.</p>
<p>It's a good process, so I don't want to change it, but it takes a minimum of 6 to 8 minutes to complete. A week or so ago I started thinking about how much time that actually is per year, gagged a little, and then started thinking about how we could automate our project onboarding process to make things easier on ourselves.</p>
<p>First, I went into <a href="http://try.hrv.st/1-086169">Harvest</a> to see how many projects have come through the queue in 2016. For us, projects are anything from a 30 minute job on a legacy project to a full website redesign. They all start with the onboarding checklist mentioned above.</p>
<p>Just shy of 3 months into 2016 and that number is a shocking 175 projects. With some quick math we can assume that's at least 70 hours per year. Woah! Time to whip something together.</p>
<p>I quickly scrapped together a prototype with <a href="http://www.wufoo.com/">Wufoo</a> + <a href="https://zapier.com/">Zapier</a> that automates step 1 through 3 for us, and we’ve been using it for a few days now. It's been a good way to help test out and realize how we'll go about automating our process when making the real deal.</p>
<p>It's always good practice to take a step back to see where you can save time and money by automating some of your repetitive, day to day tasks.</p>
<p>Now, what to do with all of this extra time?</p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>2 years of Good Work</title>
                <link>https://simplygoodwork.com/blog/2-years-of-good-work</link>
                <pubDate>Thu, 03 Mar 2016 18:00:00 -0600</pubDate>
                <author>Garrett Winder</author>
                <guid>https://simplygoodwork.com/blog/2-years-of-good-work</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/2-years-of-good-work.png?w=2430&amp;h=900&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666108371&amp;s=884e919057e2bdaada6e6700f5d11389" alt="2 years of Good Work">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>Year 2 was a big one for us. We matured from an international team of contractors to a full time staff of 4. We went all in on <a href="https://simplygoodwork.com/craft-cms">Craft CMS</a> and even got to throw in a ski trip at the end to close it all out. :birthday:</p>
<hr />
<p>I'm going to start out on a low, honest note but then we'll go right back up to happy town, so bear with me.</p>
<p>Part of the reason for these yearly posts is so I can go back and look at them -- so I don't want to leave anything out. Year two started pretty grim, and it stayed that way for a few months. Ding, ding. Round 1 of growing pains, etc. Come to find out that's a pretty normal checkpoint in the services business and eventually the sun started shining again. Phew!</p>
<p>In early spring we closed the book with the Erskine Design brand and put up a landing page that we'll hopefully leave up forever. Shortly thereafter Good Work was shortlisted in the 2015 Net Awards for new agency of the year alongside quite the company. It was an honor! We also moved into 2701 Fairmount street, our cozy hoffice in the Uptown neighborhood in Dallas that we share with our friends at Switch Creative.</p>
<p>We spent the summer working on a few bigger projects. One was with <a href="https://www.pentagram.com/work/hazen-and-sawyer">Pentagram</a> on the <a href="http://hazenandsawyer.com/">new Hazen and Sawyer website</a>, and the other was a <a href="https://simplygoodwork.com/blog/endsleigh-50-year-anniversary-digital-timeline">50th anniversary campaign for Endsleigh Insurance</a>. Toward the end of the summer Phil got to come to Dallas via Nottingham for a quick week of launching cool stuff and kicking off a new project with CareNow.</p>
<p>By late summer / early fall (at about month 18), things really started picking up and with no end in sight. Throughout the year we'd been partnering with design agencies all over the city to help out with front-end development and Craft CMS integration, and a few of them had started to lean 100% on us for their development needs. Chris and Covington joined the team in October, and Boots came on board in November.</p>
<p>It wasn't long after adding all these cool dudes that we had a folder full of shell scripts to do basically anything you can imagine. It was a good move. :nerd:</p>
<p>The winter was a blur of building websites, learning to work as a team and fully committing to the <a href="https://simplygoodwork.com/craft-cms">Craft content management system</a>. We closed out year two in Durango, Colorado on a 4 day company ski trip. We skied, snowmobiled, tubed, ate, drank and just about everything else that doesn't involve the internet. It was fantastic.</p>
<p>All in all, it's been a great year for Good Work, and we really started to hit our stride. We've got a fantastic team and some great clients and partners. This year I see us growing a little slower, introducing a few pet projects and maybe even updating this blog every once in a while.</p>
<p>Happy Anniversary, Good Work.</p>
<p>Read last year’s birthday message:</p>
<ol><li><a href="https://simplygoodwork.com/blog/an-introduction-to-good-work">An introduction to Good Work</a></li><li><a href="https://simplygoodwork.com/blog/1-year-of-good-work">1 year of Good Work</a></li></ol>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>A campaign website for Endsleigh’s 50th Anniversary</title>
                <link>https://simplygoodwork.com/blog/endsleigh-50-year-anniversary-digital-timeline</link>
                <pubDate>Wed, 12 Aug 2015 19:00:00 -0500</pubDate>
                <author>Garrett Winder</author>
                <guid>https://simplygoodwork.com/blog/endsleigh-50-year-anniversary-digital-timeline</guid>
                <description><![CDATA[
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>Together with Endsleigh Insurance, the UK’s leading student insurance company, we created a digital timeline to showcase milestones, quotes and media from the archives of their 50 years of history.</p><blockquote><p>"To support our 50th anniversary Jubilee marketing campaign we needed a striking website, but were constrained by an immovable launch date. Good Work absolutely came through for us and delivered a striking site, on time and on budget."</p> <cite>— Iain Harper, Former Digital Transformation Lead at <a href="http://endsleigh.co.uk">Endsleigh Insurance</a></cite></blockquote><hr /><figure class="figure--wide"> <img src="https://s3.amazonaws.com/simplygoodwork-com-assets/blog/endsleigh-jubilee/endsleigh-jubilee-screens.jpg" alt="Screenshots of the Endsleigh Jubilee website" title="Screenshots of the Endsleigh Jubilee website" /></figure><p>Though we were up against quite the deadline, the project was a blast to work on -- weighing in at just under a month from start to finish. We began by sifting through archives of content, deciding on the most important and prototyping a solid site structure to hold it all together.</p><p>Once we got some high level design deliverables signed off, we broke the to-do list into manageable chunks and ran (<em>sprinted!</em>) through nine cycles of design and development iterations to get the project ready for launch.</p><p>The highlight of it all was probably getting to press the big red "launch button" under one roof, which is a rare occasion for Good Work as our team is located across the US, England, and France.</p><p>As a nice mid-project touch, we also created custom icons to tile the backgrounds of the decades -- from peace signs and lava lamps to emojis and hashtags.</p><p>We launched this project in 2015, shortly after completing a full website redesign project for endsleigh.co.uk with Erskine Design. View more of our recent work on <a href="https://simplygoodwork.com/work">our work page</a>.</p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>Shortlisted in the 2015 Net Awards</title>
                <link>https://simplygoodwork.com/blog/shortlisted-in-the-2015-net-awards</link>
                <pubDate>Wed, 20 May 2015 15:42:00 -0500</pubDate>
                <author>Garrett Winder</author>
                <guid>https://simplygoodwork.com/blog/shortlisted-in-the-2015-net-awards</guid>
                <description><![CDATA[
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>We're excited to announce that we've been shortlisted in the 2015 Net Awards for "new agency of the year". Thank you so much to all of our clients and peers -- it's a real honor and we wouldn't have made the list without you.</p>
<hr />
<p>If you dig our work, please spread the word and vote for us. You have until July 13th to cast your votes.</p>
<p>Voting is over, but you can read more on Creative Bloq’s <a href="http://www.creativebloq.com/web-design/10-best-new-web-design-agencies-2015-61515073">The 10 best new web design agencies of 2015</a> article.</p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>Nailing the basics</title>
                <link>https://simplygoodwork.com/blog/nailing-the-basics</link>
                <pubDate>Tue, 24 Mar 2015 19:00:00 -0500</pubDate>
                <author>Garrett Winder</author>
                <guid>https://simplygoodwork.com/blog/nailing-the-basics</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/goodwork-article-image-nailingthebasics.jpg?w=1600&amp;h=900&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666884133&amp;s=e9cf21e4f15adea029064a551b11c112" alt="Nailing the basics">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>The magic bullet to a successful digital project is readable content, usable forms and intelligent website structure. Nail these basics and you’ve nailed your digital project, whatever it is.</p><hr /><p>People won't be able to put their finger on what they love about the site or app, but they’ll love it. They’ll love it because they can quickly consume content, find what they’re looking for and do what they came to do.</p><p>Every two years or so I dust off my copy of <a href="https://basecamp.com/books">REWORK</a> and spend an afternoon blazing through it. For those of you who aren’t familiar with REWORK, it’s a book that goes against what every other business book says about businessing. Some of it is a bit extreme, but for the most part it’s a good refresher to bring you back to Cool Town™.</p><p>There’s one chapter in the book called “Starting at the epicenter” that I think about all the time when starting a new digital project.</p><blockquote> There’s the stuff you could do, the stuff you want to do, and the stuff you have to do. The stuff you have to do is where you should begin.<br /> <cite><a href="https://basecamp.com/books">REWORK</a></cite></blockquote><p>And not only "where you should begin", but more importantly, the part you absolutely must get right. People use websites and web applications to consume content and fill out forms. That’s a website’s epicenter.</p><p>Sweat over the details of typography, headings and vertical rhythm so people can consume content quicker and more naturally. Spend time really thinking through complex forms and how they should be laid out so people can fill them out without having to think. Build a website structure that makes sense for the long run so it doesn’t break the first time you have to change something.</p><p>Once you get this stuff right you can pat yourself on the back. You’re now in the top 5% of the website building industry.</p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>1 year of Good Work</title>
                <link>https://simplygoodwork.com/blog/1-year-of-good-work</link>
                <pubDate>Tue, 03 Mar 2015 14:19:00 -0600</pubDate>
                <author>Garrett Winder</author>
                <guid>https://simplygoodwork.com/blog/1-year-of-good-work</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/1-year-of-good-work.png?w=2430&amp;h=900&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666108343&amp;s=7e924d6f761291f480e5a86b6306b7fe" alt="1 year of Good Work">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>1 year ago today I sat down at my home office in Houston, Texas for day 1 of Good Work. The few months before were spent hunting down digital projects outside of a full-time job, with the first to start on March 3rd, the first Monday of March in 2014.<br /></p>
<hr />
<p>It's been a wild ride, to say the least. 18 new project launches, 10 others improved, a move to Dallas, a new office and we even brought the Erskine Design brand into the family.</p>
<p>I took yesterday afternoon to sit back and document a quick summary of the first 12 months.</p>
<p>For the first 4 or so months, the focus was to have no focus. I wanted the specialization to naturally happen based on what projects were the most enjoyable and that we did the best work on. Taking on anything and everything as long as there was a reasonable budget for digital services. This isn't a very traditional route, but I do recommend it. It's an easy way to quickly figure out what projects you are and are not suited for, while still bringing home the bacon.</p>
<p>It's worth noting that at this point, aside from a few ideas in the form of WhatsApp messages between Phil and me, the company was still nameless. It wasn't until somewhere around month 4 that we got a name (<a href="https://one.simplygoodwork.com">and a website!</a>).</p>
<p>About halfway through the year, the work started to naturally fall pretty evenly into two primary buckets: custom software projects like registration systems and intranets, and production work like content management system integrations and front-end development. At any given time one side of the business could be working on a custom internal communications hub for an enterprise client while the other is doing front-end development for a few marketing websites where we were handed over design files.</p>
<p>This is where we've been for the last 6 months or so, and it's obvious that there's a future in modern software design and development for Good Work, so we're gonna stick to it. This year I'd like to get serious about the software side of the business, both for clients as well as creating products of our own. On the production side, I'll be a lot pickier about the projects we take on, but I'd like to keep it around -- it's a nice change of pace from the stresses that come with building business-critical software.</p>
<p>So, that's where we are.</p>
<p>There's a sales pipeline, there are projects on the table, most clients pay on time and there have been more green months than red. I can't complain.</p>
<p>Happy Anniversary, Good Work. Here's to another year of keeping this ship afloat.</p>
<p>Read our first post in this yearly series, <a href="https://simplygoodwork.com/blog/an-introduction-to-good-work">an introduction to Good Work</a>.</p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>How to hire a Web Design Company</title>
                <link>https://simplygoodwork.com/blog/how-to-hire-a-web-design-company</link>
                <pubDate>Thu, 17 Jul 2014 15:18:00 -0500</pubDate>
                <author>Garrett Winder</author>
                <guid>https://simplygoodwork.com/blog/how-to-hire-a-web-design-company</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/meeting-around-table.jpg?w=1215&amp;h=450&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666884155&amp;s=f9e89a2c0b6089bb851330301b194a19" alt="Meeting around table">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>Hiring a web design company to assist your organization in an upcoming website design, app or other digital project can be a daunting task, but if you fully understand the process and how to find the right company beforehand, it's not so bad.</p>
<hr />
<p>This article aims to answer your questions about hiring a third party for your next digital project. From getting all your ducks in a row before you start the search, to finding the right agency for your organization and what to expect during the project process. By the end of this article, you should have a much better understanding of what to expect while working with a web design company.</p>
<p>Let’s discuss what all you need to get in order before seeking out a design partner of your own.</p>
<h2 id="toc_0">Everything you need to know before you hire a web design company</h2>
<p>Before you start searching for the best web design company for your organization, you need to get a few things in order. You should understand your project in the form of business goals rather than features, you should have plenty of time set aside to assist during the project and you need to have a realistic budget.</p>
<h3 id="toc_1">Understanding your business goals</h3>
<p>You need to have a good understanding of the goals you wish to achieve and the problems you're trying to solve with your upcoming digital project. Being able to articulate your needs and expectations clearly is something that professional web design companies expect. You can do this with a simple project summary.</p>
<p>Your project summary doesn't need to be super detailed, and can be achieved with a page or so of a few well written paragraphs. If at all possible, steer clear of the long winded <a href="http://en.wikipedia.org/wiki/Request_for_proposal">RFP</a> that states exactly what you need and how it should work. A key component of a successful digital project is that your the web design company you choose is <a href="https://simplygoodwork.com/blog/low-risk-onboarding-consultancy-projects">involved from the very beginning</a>. As soon as you understand your needs and goals and can articulate them in a few paragraphs, it's time to bring in outside help.</p>
<p>Web design companies solve business problems with digital solutions on a day-to-day basis, and including them as soon as you understand your needs will result in a better project in the long run.</p>
<h3 id="toc_2">Digital projects require your time, too</h3>
<p>There are quite a few things that you'll be in charge of during a digital project, and depending on the scope of work, the amount of time you'll need to make yourself readily available can vary.</p>
<p>For instance, if you haven't hired a content creator, you'll most likely be in charge of content. And if your site includes things like blogs, news and case studies this can add up to quite the pile of work. There's also all the other digital assets your website feeds into, like email newsletters and social media accounts, that need to be setup and working prior to launch.</p>
<p>Lastly, you need to get used to answering lots of questions, giving feedback on mockups and making all kinds of other decisions related to the digital project in a timely manor. For small projects you can probably set aside as little as a day per week and be fine, but bigger projects can require anywhere from one to ∞ full time client side (your) staff.</p>
<p>Your digital presence is a big commitment, but it's worth it. As long as you can set aside enough of your own time and be readily available when needed you'll be fine.</p>
<h3 id="toc_3">Setting a realistic budget</h3>
<p>You'll want to be completely transparent about your budget from the first conversation you have with your potential design partner. A web design company's job is to make the best use of your budget, and if they know it up front they can offer solutions that will work for you.</p>
<p>If you're not sure how much a digital project typically costs, you can start by asking a few potential web design companies about their typical project budgets. Size and scope of digital projects can obviously vary wildly, but this way you can get a better idea of what you'll need.</p>
<p>A digital project is not a product. You're not buying a widget off of a shelf. The pricing for a digital project is essentially the cost of a highly experienced team of designers, developers, and digital project managers for a set amount of time. The size of team you'll need depends on the scope and timeline of your project. This may sound expensive, but the value an experienced web design company brings to the table compared to recruiting, hiring and training your own internal team is damn near limitless. Not to mention less risky for your organization in the long run.</p>
<h2 id="toc_4">To summarize</h2>
<p>Here's a quick recap on everything you need to know before you start the search for a web design partner.</p>
<ul>
<li>Understand your high level business goals for the project, write them down, and wait until you find the right design partner to flesh out the details.</li>
<li>Be sure you have enough internal time and resources to commit to a digital project and can be readily available to answer questions and provide feedback in a timely manor.</li>
<li>Set aside a realistic budget for your digital project. Remember, you're paying for a team of experienced designers, developers and strategists to work full time for your organization for a set period of time.</li>
</ul>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>It&#039;s time for enterprise software to catch up</title>
                <link>https://simplygoodwork.com/blog/its-time-for-enterprise-software-to-catch-up</link>
                <pubDate>Fri, 11 Jul 2014 15:07:00 -0500</pubDate>
                <author>Garrett Winder</author>
                <guid>https://simplygoodwork.com/blog/its-time-for-enterprise-software-to-catch-up</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/touchscreen-cashier.jpg?w=1215&amp;h=450&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666884188&amp;s=82578a1ba444a041da7ee8e2bef20acb" alt="Its time for enterprise software to catch up">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>We live in a world where digital has completely changed the way we interact with just about every major industry. From booking our travel, airfare and hotels online to calling a cab and ordering pizza from an app on our phone.</p><p class="standfirst">And design and usability are at the heart of it.</p><hr /><p>We could go on for days on how digital has transformed consumer facing products and services, but what's more interesting is what can be done with the less shiny, behind the scenes business platforms that seem to be mostly ignored by the <em>design driven world</em> mentality.</p><p>Last month we published an article on <a href="https://simplygoodwork.com/blog/value-of-user-experience-in-enterprise-software">the value of design in custom enterprise software</a>. The moral of the story was that well designed, easy-to-use internal software leads to a better employee experience, which in turn leads to a better culture, higher employee retention rates and a happier workplace. That's a lot of positives.</p><h2 id="toc_0">Why is enterprise software so bad?</h2><p>So why is it that I can still peek over at my local cashier's computer screen only to see what looks to be an early prototype of <a href="http://en.wikipedia.org/wiki/Pong">Pong</a>?</p><p>Good question. Here are a few possible answers:</p><h3 id="toc_1">1. It's enterprise, it's supposed to be difficult.</h3><p>The first and hopefully most likely answer is that companies have no idea this is an issue. Enterprise software has never been known for its ease-of-use, and until we educate otherwise businesses and organizations won't know any better. Luckily for us, modern technology has made the design and development of custom business platforms much more feasible and cost-effective than it was ten years ago.</p><h3 id="toc_2">2. We didn't realize the potential of well designed internal software.</h3><p>The second possible answer is that companies don't realize they should spend an equal amount of effort on internal digital products and services as external ones. It's really obvious that spending money on well designed and easy to use outward-facing websites is a positive for any business. It's not as obvious that spending money on internal business platforms will create a better workplace experience and save time and money in the long run.</p><h3 id="toc_3">3. We understand, but we don't care!</h3><p>Lastly, some businesses might completely understand the value in good internal software, but don't care enough about the people doing the work to act on it. I like to think this isn't ever the answer, but it is. The problem with these companies is that the time and money saved by cutting corners on internal software is lost 10x in productivity and morale over the long-term.</p><h2 id="toc_4">To summarize</h2><p>What all three of these possible answers have in common is that the businesses and organizations behind them are missing out on a great investment for their workforce. We should take some of the time and effort we're putting towards marketing websites and email campaigns, and put it towards our less shiny, internal software as well.</p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>Low-risk onboarding consultancy projects</title>
                <link>https://simplygoodwork.com/blog/low-risk-onboarding-consultancy-projects</link>
                <pubDate>Mon, 30 Jun 2014 19:00:00 -0500</pubDate>
                <author>Garrett Winder</author>
                <guid>https://simplygoodwork.com/blog/low-risk-onboarding-consultancy-projects</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/girl-writing-notes-in-a-journal.jpg?w=1215&amp;h=450&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666884214&amp;s=70a13c01ec44ae3d828fc9ae421729e2" alt="Low-risk onboarding consultancy projects">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>Before jumping into a long-term relationship with a new client, I like to start with a small week or two long onboarding consultancy to test the waters. It's a low-risk way to introduce our potential client to user-centered design and really see the value in working with us.</p>
<p>It's also a great way for both parties to ensure the relationship is a good fit.</p>
<h2 id="toc_0">A quick lesson on user-centered design</h2>
<p>At Good Work we practice a design methodology called <a href="http://en.wikipedia.org/wiki/User-centered_design">user-centered design</a>, which is really just a fancy way of saying that all decisions we make during the project process are on behalf of the project's target audience -- which doesn't always turn out to be the same as our client's initial requirements. That's a good thing though, as it ensures we're making the <em>right</em> thing, not just <em>a</em> thing. And it ensures we're building something of value for our target audience!</p>
<p>Taking a user-centered design approach means we typically have a chunk of research, early prototyping and validation to do at the start of every project. Yes, our potential client probably already came to us with a specific set of wants and needs, but we have to validate them for ourselves before we can move forward.</p>
<blockquote>
 While it is common practice in the creative professions to prescribe solutions without fully and accurately diagnosing the problem, in almost every other profession such a sequence would render the professional liable for malpractice.<br />
 <cite>Blair Enns, <a href="http://www.winwithoutpitching.com/the-manifesto/">The Win Without Pitching Manifesto</a></cite>
</blockquote>
<h2 id="toc_1">The onboarding consultancy process</h2>
<p>This whole process of up-front research, validation and using our expertise to figure out the right way forward works as a great, low-risk onboarding project with our potential clients.</p>
<p>Our onboarding consultancy process is a one week project to advise, validate and scope the needs and goals of the potential engagement. We focus on the humans that the project is for -- figure out who they are, their experience levels and what they potentially expect to get out of the finished product. We brainstorm and prototype ideas, and come up with a solid plan to make the <em>right</em> thing, a road map to move forward and a prototype to reference for the future of the project, whether that's with Good Work or another digital agency.</p>
<h2 id="toc_2">To summarize</h2>
<p>Taking a user-centered approach to our work ensures we're creating the <em>right</em> digital product or service for our clients. The work involved in our onboarding consultancy needs to be done regardless in order to create a successful digital project, whether during its own project or as the first phase of a larger one, but by unbundling it from our potential primary engagement we can make the purchasing process a lot less daunting for potential clients, and ensure our relationship is a good fit.</p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>Custom enterprise software user experience</title>
                <link>https://simplygoodwork.com/blog/value-of-user-experience-in-enterprise-software</link>
                <pubDate>Sun, 15 Jun 2014 19:00:00 -0500</pubDate>
                <author>Garrett Winder</author>
                <guid>https://simplygoodwork.com/blog/value-of-user-experience-in-enterprise-software</guid>
                <description><![CDATA[
                                        <figure>
                        <img src="https://optimise2.assets-servd.host/good-work/production/blog/hero-images/designer-arranging-notes.jpg?w=1215&amp;h=450&amp;auto=compress%2Cformat&amp;fit=crop&amp;dm=1666884241&amp;s=6b1052d2b50a8e32f0602013188d238f" alt="Custom enterprise software user experience">
                    </figure>
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>It's no secret that investing in your workplace proves just as valuable, if not more valuable, than investing in outward-facing marketing projects. Take enterprise software, for instance.</p><hr /><p>Aside from websites and email campaigns, another really valuable use of digital is in its ability to transform long-winded business processes into easy to use workflows that we can carry around in our pockets.</p><p>In the book <a href="http://amzn.com/B00GPU7SJA">A Brandful Workforce</a>, Julia Gometz talks about how being a brandful company doesn't just mean investing in your consumer-facing brand, but more importantly, your workforce.</p><p>Where the value of our primary marketing website might be to increase brand awareness and save capacity on business development and sales, the obvious value of enterprise software is in its ability to decrease training time, human error and time spent on every day operational tasks at the office like project management. Simply put, digitalizing our business processes can open up wasted capacity to work on the outward-facing things that really matter, like the quality of our products and services. This is huge in itself but doesn't take into account the not so obvious by-products of well-designed enterprise software with good user experience.</p><figure> <img src="https://simplygoodwork.com/uploads/blog/planning-website-with-sticky-notes.jpg" alt="People planning out a digital project with sticky notes at a table" title="People planning out a digital project with sticky notes at a table" /></figure><p>Designed well, digitalizing our operational workflows into custom software does more than just save time and money, it leads to a better employee experience, too.</p><blockquote> The quality of experience employees have with their employer’s operations is key to their ability to feel trust and comfort at work, and in turn, the desire to stick around.<br /> <cite><a href="https://www.tlnt.com/good-hr-tech-always-makes-for-a-happy-employee/">Good HR Tech Always Makes For A Happy Employee</a></cite></blockquote><p>Good operations are the foundation of a good company culture, and investing in a high-quality custom enterprise application for that foundation is a great place to start. People don't want to sit around all day working inside of legacy software or in a windowless room filing paperwork in an actual filing cabinet. That's not a job people want to do and it's definitely not a job they'll naturally advertise to the world.</p><p>With today's technology we can modernize our businesses in ways that focus on the employee experience and make us more productive.</p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
                                            <item>
                <title>An introduction to Good Work</title>
                <link>https://simplygoodwork.com/blog/an-introduction-to-good-work</link>
                <pubDate>Sun, 18 May 2014 19:00:00 -0500</pubDate>
                <author>Garrett Winder</author>
                <guid>https://simplygoodwork.com/blog/an-introduction-to-good-work</guid>
                <description><![CDATA[
                                                                <div class="richtext max-w-2xl mx-auto md:prose-figure:-mx-16">
  <p>In 2007 I started a small web design company with my college roommate. We got an office downtown a few days after graduating and went door to door looking for business. I was the website guy, he was the business guy. We weren't quite sure what we were doing but we were having fun and we went all in.</p>
<hr />
<p>We ran the company for about four years, and learned a ton along the way, but started to feel like jumping straight into our own business was the wrong route for us. We felt like we needed more experience to really do things right, so a few months later we went and got ourselves some bosses.</p>
<p>I went to <a href="http://erskinedesign.com">Erskine Design</a> in Nottingham, UK for a little over three years. Working with companies like the <a href="http://bbc.co.uk">BBC</a> and <a href="http://endsleigh.co.uk">Endsleigh</a> I learned how big, complex digital projects work. I learned what a team of really smart, quality focused people are capable of. How to work better with clients, money, operations, etc. I learned how to run an international <em>small</em> business.</p>
<p>So, in early 2014, I started Good Work. A no-nonsense, highly experienced digital client services agency. Over the years I've gained a unique perspective on how different tasks and situations in an agency environment are handled internationally v.s. here in the states, and I'm excited to create a hybrid between the two. I want to design a place that people want to be a part of; both clients and employees.</p>
<p>Since starting the company a few months ago, we've worked on some cool, challenging projects, and have even more in the works. I want to work on the projects that matter -- whether that be client projects or our own. Less temporary campaign websites and more digital products and services that people rely on every day. The ones that make or break the trustworthiness and usefulness of an organization.</p>
<p>I believe if you do good, quality work, communicate well and invest in an environment that people want to be a part of, all the rest will fall into place. That's the goal anyway.</p>
</div>

                                        <hr/>
                    <p><a href="https://simplygoodwork.com/newsletter">Sign up for our newsletter</a>. We send one email every month with helpful articles, resources and company updates for people who manage and make websites.</p>
                ]]></description>
            </item>
            </channel>
</rss>