<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Gijs Nelissen / Lifelog - All blog posts]]></title><description><![CDATA[All of my long-form thoughts on programming, leadership, product design, and more, collected in chronological order.]]></description><link>undefined</link><image><url>https://www.lifelog.be/images/avatar.jpeg</url><title>Gijs Nelissen / Lifelog - All blog posts</title><link>undefined</link></image><generator>RSS for Node</generator><lastBuildDate>Sun, 08 Mar 2026 04:40:36 GMT</lastBuildDate><atom:link href="undefined/rss.xml" rel="self" type="application/rss+xml"/><item><title><![CDATA[How (Prezly) features travel from customer to production]]></title><description><![CDATA[<link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/44fc4612-bcff-4b82-b8d1-1672be5aeb21/-/resize/1200/-/format/auto/Screenshot%20at%20December%20%2013%20-%20001380%202%402x.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/3481a8b6-2f80-4d72-8c62-12b4ff197a43/-/resize/1200/-/format/auto/Screenshot%20at%20December%20%2013%20-%20001380%402x.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/d16d62b6-761a-4141-ac58-7ec1bc99d8df/-/resize/1200/-/format/auto/Screenshot%20at%20December%20%2015%20-%20001390%402x.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/4b3dc5f8-ab4f-4a4b-8a2f-1933c68cdbb8/-/resize/1200/-/format/auto/Screenshot%20at%20December%20%2013%20-%20001384%402x.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/a0240a54-10c4-4d6e-bfa6-0176cc57479c/-/resize/1200/-/format/auto/Screenshot%20at%20December%20%2015%20-%20001391%402x.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/37296425-763d-4d48-a436-1a548d94c57c/-/resize/1200/-/format/auto/Screenshot%20at%20December%20%2015%20-%20001393%402x.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/4a187e1f-42a7-41e9-bbf5-d5a6e47e1149/-/resize/1200/-/format/auto/Screenshot%20at%20December%20%2015%20-%20001392%402x.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/32d47f22-e718-4efe-b9f7-5f2b55d1b198/-/resize/1200/-/format/auto/Screenshot%20at%20December%20%2015%20-%20001394%402x.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/f92887e1-533a-4cba-96a3-941178e55756/-/resize/1200/-/format/auto/Screenshot%20at%20December%20%2015%20-%20001396%402x.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/59f772cc-04ce-4155-8418-8830084f7566/-/resize/1200/-/format/auto/Screenshot%20at%20December%20%2015%20-%20001397%402x.png"/><div class="ContentRenderer_renderer__tPJbs"><section class="prezly-slate-document" data-version="0.50"><img src="https://cdn.uc.assets.prezly.com/44fc4612-bcff-4b82-b8d1-1672be5aeb21/-/resize/1200/-/format/auto/Screenshot%20at%20December%20%2013%20-%20001380%202%402x.png" alt="Image"/><figcaption> </figcaption><h2> </h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">&#x27;Listen to your customers&#x27;, &#x27;focus on your clients&#x27; problems&#x27; – recurring advice you&#x27;ll recognise from pretty much every startup book on the market. It&#x27;s solid guidance. And for anyone running a tech company? A persistent challenge. </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">The problem is that there are so many different information channels, that trying to make sense of them all requires a near inhuman degree of attention, organisation, and consistency. Meanwhile the feedback loop, if neglected for even a short while, disintegrates. </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">At Prezly, I don&#x27;t think we&#x27;re listening to our customers enough. </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">And because one man&#x27;s dirty laundry is another&#x27;s chance to learn how to wash up, I&#x27;ve decided to analyse our current process to try to find ways to close the feedback loop and apply customer insights across all the various parts of our company and product.</p><h1>Our client feedback toolset</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Here is a list of the tools we use when it comes to processing customer feedback:</p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.intercom.com/" target="_blank" rel="noreferrer">Intercom</a>: Live chat and email support</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://slack.com/" target="_blank" rel="noreferrer">Slack</a>: Internal team conversations</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://zoom.us/" target="_blank" rel="noreferrer">Zoom</a>: Calls (both internal and external)</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.notion.so/" target="_blank" rel="noreferrer">Notion</a>: Knowledge base</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.vitally.io/" target="_blank" rel="noreferrer">Vitally</a>: Our customer success CRM</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.productboard.com/" target="_blank" rel="noreferrer">Productboard</a>: Feature prioritisation and insight processing</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://linear.app/" target="_blank" rel="noreferrer">Linear</a>: Project management/delivery</span></li></ul><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">That&#x27;s quite a few tools and, what&#x27;s worse, that&#x27;s not all. Three years ago <a class="prezly-slate-link" href="https://www.reddit.com/r/SaaS/comments/o1x0yk/the_cost_to_run_a_saas_platform_with_a_few/" target="_blank" rel="noreferrer">I wrote a much more detailed post on Reddit</a> about the different tools (and associated costs) we use to run our business.</p><h1>From conversation to feature</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Often the clearest way to depict a process is through a workflow diagram, so that&#x27;s where I started my dissection. </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">The yellow section on the left shows all the different sources through which we receive feedback. It could be something a customer complains about on our live chat, a suggestion from a team member in Slack, a customer call, and so on.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">In addition to these more continuous insight streams, we also have an archive of notes logged in our customer success CRM (<a class="prezly-slate-link" href="https://www.vitally.io/" target="_blank" rel="noreferrer">Vitally</a>), and a small database of user research notes that we logged several months ago as part of interviews aimed at solving a positioning challenge.</p><img src="https://cdn.uc.assets.prezly.com/3481a8b6-2f80-4d72-8c62-12b4ff197a43/-/resize/1200/-/format/auto/Screenshot%20at%20December%20%2013%20-%20001380%402x.png" alt="Image"/><figcaption> </figcaption><h2>Processing feature feedback</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">We try to store all feature-related feedback as notes in Productboard. Those notes are then processed by someone from product, usually either myself or a member of the design team. Every note can include multiple feature ideas, as Productboard lets you highlight different sections of a single note and associate each to a particular feature or feature idea.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Here is an example of a processed note where one insight (a user interview) resulted in three different features ideas.</p><img src="https://cdn.uc.assets.prezly.com/d16d62b6-761a-4141-ac58-7ec1bc99d8df/-/resize/1200/-/format/auto/Screenshot%20at%20December%20%2015%20-%20001390%402x.png" alt="Image"/><figcaption>How a note (Now called Insight in Productboard) turns into features</figcaption><h2>Organising feature ideas</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">All those different feature ideas are organized in a huge feature tree that can span different product areas and components. This helps keep things organised and easy to find.</p><img src="https://cdn.uc.assets.prezly.com/4b3dc5f8-ab4f-4a4b-8a2f-1933c68cdbb8/-/resize/1200/-/format/auto/Screenshot%20at%20December%20%2013%20-%20001384%402x.png" alt="Image"/><figcaption>Example Feature Tree showing Effort/Prioritization score</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">All features automatically get assigned a &#x27;user impact score&#x27; based on how you scored the importance of that feature in the initial note. You can also fill in the &#x27;effort score&#x27; (i.e. how hard a feature is to build) and stack this against multiple user impact scores (how important it is for your customers) to generate an overall &#x27;prioritization score&#x27;, which can be very useful for deciding which features to work on when.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">These numbers (together with a lot of other meta data) can then be used to slice and dice your feature tree, sort them by importance, and kick off development. That&#x27;s the idea, at least. Some examples of slicing/dicing/viewing that data:</p><img src="https://cdn.uc.assets.prezly.com/a0240a54-10c4-4d6e-bfa6-0176cc57479c/-/resize/1200/-/format/auto/Screenshot%20at%20December%20%2015%20-%20001391%402x.png" alt="Image"/><img src="https://cdn.uc.assets.prezly.com/37296425-763d-4d48-a436-1a548d94c57c/-/resize/1200/-/format/auto/Screenshot%20at%20December%20%2015%20-%20001393%402x.png" alt="Image"/><img src="https://cdn.uc.assets.prezly.com/4a187e1f-42a7-41e9-bbf5-d5a6e47e1149/-/resize/1200/-/format/auto/Screenshot%20at%20December%20%2015%20-%20001392%402x.png" alt="Image"/><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">In reality, I find that we use <a class="prezly-slate-link" href="https://www.productboard.com/" target="_blank" rel="noreferrer">Productboard</a> much like a filing cabinet that we dip into from time to time when we suddenly remember to do some research.</p><h2>Turning insights into Specifications/Planning</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">We have been using Basecamp&#x27;s Shape-Up method <a class="prezly-slate-link" href="/multiple-product-teams" target="_blank" rel="noreferrer">for over a year now at our company</a>, and it has served us well. I recommend <a class="prezly-slate-link" href="https://basecamp.com/shapeup" target="_blank" rel="noreferrer">having a look for yourself</a>, but long story short, it allows anyone in the wider team to pitch product ideas.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Ideally, those product ideas come out of speaking with customers, using the product for yourself, seeing what a competitor is doing, noticing an evolution in technology, or going through logged customer insights. In actuality, most pitches are the result of a more direct thinking process: &#x27;This would be cool to build, so we should build it!&#x27;</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">To tackle some of this problem, we encourage people to sprinkle their project pitches with insights/feature requests from Productboard. This is particularly relevant to the problem statement part of the pitch, which is best seen through the words of a customer (i.e. Productboard insights).</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Often, multiple different feature ideas/insights can be combined into a single pitch. For example, when we decided that we were going to explore automatic story translation (at the time of writing, a work in progress), it was through a combination of 14 insights on various features:</p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Feature: Google Translate Integration (6 insights)</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Feature: Make translator accounts free (1 insight)</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Feature: AI-powered translations (4 insights)</span></li></ul><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">If a feature is small enough and easy to build, we will skip the Shape-Up pitching process and plan the work straight in our task management tool, Linear, where the CARE team can pick it up as and when they are able (the CARE team consists of developers and designers not currently assigned to an active project).</p><h2>Picking which projects to build</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">I could (and perhaps should) dedicate an entire post on the complexity of the betting session. In our Shape-Up FAQ we try to answer the question for the team</p><img src="https://cdn.uc.assets.prezly.com/32d47f22-e718-4efe-b9f7-5f2b55d1b198/-/resize/1200/-/format/auto/Screenshot%20at%20December%20%2015%20-%20001394%402x.png" alt="Image"/><figcaption>Criteria for picking a project</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Reading this now I feel that this is missing some specifics. Here are all the things that go into betting:</p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">What are the most important problems?</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Team allocation/holiday?</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Is this project something &#x27;exciting&#x27; we can do marketing with?</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">How long has this problem been lying around?</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Is there any time-pressure to pick this project now?</span></li></ul><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">We&#x27;ve recently opened the betting sessions from a 2-person co-founder meeting, to a 4-person recorded betting session. That recording is then shared with the team and notes are shared with the authors of pitches that were discussed during that betting session.</p><h2>The development stage</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">This could be a blog post all of itself, but to keep things brief: we use Linear to organise our work. We have different teams in product and every picked Shape-Up project gets its own project in Linear.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">With a few exceptions, we prefer short projects usually spanning a two-week cycle. During the execution of the project, the team assigned to it writes regular updates that are automatically shared in the relevant Slack channels.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">As a rule of thumb, we break projects into separate components that are deployed whenever the team feels there is enough value for our customers. A six-week project, for instance, will ideally have multiple different components going live throughout its timeline.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">For features that we&#x27;re less certain about, we use feature flags to enable their functionality for a subset of customers and see how things progress. If we want more eyes on a feature, we promote it to the &#x27;feature labs&#x27; part of our tool so that clients can enable and test it for themselves.</p><h2>Informing customers</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Every time I speak to a customer, I am surprised how little they are aware of our new features. Although we try with <a class="prezly-slate-link" href="https://www.prezly.com/help/best-practices/prezly-roundup" target="_blank" rel="noreferrer">our monthly newsletter</a>, <a class="prezly-slate-link" href="https://www.prezly.com/changelog" target="_blank" rel="noreferrer">a public changelog</a>, an in-app changelog, and a &#x27;what&#x27;s new&#x27; section on <a class="prezly-slate-link" href="https://rock.prezly.com/login" target="_blank" rel="noreferrer">the login page</a>, it&#x27;s clear that we still have a long way to go when it comes to informing our customers about our new features. </p><img src="https://cdn.uc.assets.prezly.com/f92887e1-533a-4cba-96a3-941178e55756/-/resize/1200/-/format/auto/Screenshot%20at%20December%20%2015%20-%20001396%402x.png" alt="Image"/><figcaption>What&#x27;s new on login page</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Part of this is remembering that people in general feel themselves time-poor, and are unlikely to seek out information – or even open a company newsletter – unless they&#x27;re really invested in what&#x27;s going on. It&#x27;s something we&#x27;re working on.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">When it comes to launching a new feature or an update, it makes sense to contact directly our most relevant audience – i.e. the people who requested that feature in the first place. This is where Productboard again comes in very useful, since it&#x27;s easy to see any insights linked to a feature request and create a mailing list accordingly. </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">So we reach out to those people, tell (or better, show) them the new feature, and ask them to try it out and let us know what they think. This is incredibly useful in helping us understand whether we&#x27;ve correctly identified a common customer problem and presented an adequate solution – something that is great after the fact and indispensable during smaller rollouts along the longer six-week project timelines. </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">On paper, it reads like a solid plan, but even as I write this I&#x27;m painfully aware that speaking with customers is the weakest link in our entire feedback flow. Specifically as we&#x27;re currently struggling with positioning and the question &#x27;<em>what makes Prezly different vs..?</em>&#x27; I think that the our the answers are in deeper/better conversations with our customers which we simply don&#x27;t do it enough.</p><h1>The challenges</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">As mentioned in the introduction, I feel that we aren&#x27;t learning enough from our interactions with customers. It became even more obvious when <a class="prezly-slate-link" href="chrome-extension://blaaajhemilngeeffpbfkdjjoefldkok/blocked.html?1&amp;https://twitter.com/ekatemari" target="_blank" rel="noreferrer">my colleague Kate</a> started this conversation in our internal Discourse:</p><img src="https://cdn.uc.assets.prezly.com/59f772cc-04ce-4155-8418-8830084f7566/-/resize/1200/-/format/auto/Screenshot%20at%20December%20%2015%20-%20001397%402x.png" alt="Image"/><figcaption>Discourse Convo: Are we speaking with our customers?</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">I think that a lot of the interactions we have with our customers are one-directional. For example, we invite customers for a user research session mostly because we want to learn what to build. That sounds logical, but it isn&#x27;t how relationships work. </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">At no point do we deliberately try to build a partnership where we listen to their challenges, try to come up with the best possible solution, and then return to them to validate and/or iterate.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">And there began the idea for this blog post. </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Going forward, I want to rethink our process with new requirements:</p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Work on the most important problems that our customers face (assuming they fit our mission)</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Always inform customers when we build something they asked for</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Make it easy for anyone to follow up on what happened with their feedback </span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Turn insight discussions/debates into company-wide conversations (for people that want to participate)</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Better spot recurring problems and work on those </span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Make insights an important input of planned work (context for developers and designers)</span></li></ul><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">With that in mind, I&#x27;m going to play around with the Productboard integrations, research what techniques and tools are out there to help us take this to the next level, and share my findings here. My hope is that this approach will help me organise my thoughts as well as bring you into the conversation, and as a byproduct, maybe even save other founders some of this pain. </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">As always, any advice or experience you want to share – I&#x27;m all ears. </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Gijs</p></section></div>]]></description><link>undefined/how-prezly-features-travel-from-customer-to-production</link><guid isPermaLink="true">undefined/how-prezly-features-travel-from-customer-to-production</guid><pubDate>Fri, 15 Dec 2023 08:41:00 GMT</pubDate></item><item><title><![CDATA[If you're afraid of deploying on Friday you should be scared of deploying on weekdays as well]]></title><description><![CDATA[<link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/4ee5927b-ed10-4903-87ba-eda17098720b/-/resize/1200/-/format/auto/sigmund-SZGdof7rk7g-unsplash.jpg"/><div class="ContentRenderer_renderer__tPJbs"><section class="prezly-slate-document" data-version="0.50"><img src="https://cdn.uc.assets.prezly.com/4ee5927b-ed10-4903-87ba-eda17098720b/-/resize/1200/-/format/auto/sigmund-SZGdof7rk7g-unsplash.jpg" alt="Image"/><figcaption> </figcaption><h2> </h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">If you&#x27;re in a software or product company I&#x27;m sure you have heard the advice of &quot;don&#x27;t deploy on Friday.&quot; This is both reasonable and has merit. However, this isn&#x27;t great advice in 2023. </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">By now you&#x27;ve had plenty of time to invest in tooling around your deployment pipeline. I can hear you now, &quot;But Friday is a good day to deploy because everyone is off and I don&#x27;t have to worry about users seeing my mistakes.&quot;, in that case I don&#x27;t know what to say. </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">The phrase &quot;Don&#x27;t deploy on Friday&quot; is shorthand for some sort of a Fridayphobia mantra that has no place in modern product companies. It&#x27;s an old belief that persists among many developers: deploying on a Friday would bring bad things...</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">I am going to talk about why this advice came about in the first place, why it&#x27;s not relevant anymore (there are exceptions), and what can be done instead.</p><h2>Bugs will be in production longer</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">The rule came about from a time when deployment was much harder and a big deal. Software teams would plan releases weeks in advance where often big pieces of code were deployed all in one go. Chances to break stuff were significant.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">And obviously, we want to make sure that your team can enjoy their deserved weekend and not have to spend their Friday evening debugging just because someone decided to deploy a big change right about when you were packing your bag for a camping trip.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Or maybe the whole process of deploying code is cumbersome and error prone and you don&#x27;t want to risk having to stay around later and figure stuff out.</p><h2>Why is this a problem?</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">One primary drawback of avoiding deployments on Friday is the slowdown in the shipping capabilities. By following a stupid &quot;no-Friday deploy&quot; policy, valuable time on the calendar is lost each week. With each passing Friday, you miss out on the opportunity to deliver value and stay ahead.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Furthermore, avoiding deployments on Friday can contribute to a decrease in team trust. Modern development practices have solved this problem. When a team consistently refrains from Friday deployments, it sends a message that there is a lack of confidence in the overall system.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">And although an important component of efficient companies is to be risk-averse that does not apply here. The risk management should be done by breaking up features in workable, deployable chunks that can be deployed and provide learning oppertunities.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">In summary, refraining from deploying on Friday will slow the company down and undermine team trust.</p><h2>The obvious solution - make deployments boring.</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">The obvious solution, then, is to make deployments constant and robust. You want to make deployment as boring as possible. That way it&#x27;s a low-barrier activity and a boring process of pushing code to a server and having it run in exactly the same way whether you&#x27;re deploying on Friday afternoon or at 3 on Monday morning (or any other time). </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">That means automating every aspect of deployment from start to finish - from triggering the deployment, building the new version of your app in CI/CD, provisioning servers, etc., all the way until making sure everything still works correctly when deployed. </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">This is the approach we&#x27;re taking at Prezly which is working pretty well. In addition to a PR review (by another human) we have a set of tests and automation that makes sure everything is working as expected. Additionally, we have a lot of alerts in place that are triggered automatically based on application logs, error codes and speed reports we all capture in our logging datastore. We are able to deploy code dozens of times a day without disrupting users or causing problems. </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">The advantage of making deployment boring is that product teams start to use that to their benefit where they constantly ship small iterations and improvements instead of large chunks of code.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">And although this gets you a long way, it&#x27;s not a silver bullet. You should never be 100% confident in your deployments just because you have tests.</p><h2>Easy rollback</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Mistakes will happen. The question isn&#x27;t how often mistakes are made but rather how well they are being handled.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">A great CI pipeline should have a &#x27;rollback&#x27; button somewhere that switches the application to a previous/working version of the app. This should keep in account any database/schema migrations and have a good mechanism (database migrations) to rollback any changes you made to the database.</p><h2>Apply the &#x27;no Friday&#x27; rule when it makes sense</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">For the reasons laid out in this post I think the no-shipping-on-friday rule is generally bad, it is important to ackowledge that there can be legitimate exceptions to this rule. </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Sometimes there will be changes/improvements/upgrades where there is more uncertainty. Although I&#x27;d still argument to try and find a way to decrease that uncertainty ​ there might be a good case to wait for Monday.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Some examples:</p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Upgrading the database version. This might introduce unexpected effects that are hard to estimate only by having a good testing suite</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Decommissioning a feature. Lets say you&#x27;ve been testing a whole new layout for the app and are happy with the feedback/experiment by a % of your users. Setting this as a new default and enabling it for all customers might be better on Monday as you can expect an increase in feedback/conversations</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Huge feature releases. Although we try to avoid this there are cases where an event or build-up of a new feature (please don&#x27;t say AI) will result in an one-off hocus pocus ta-da moment. For any case where you&#x27;re pushing a large PR/changeset to your production database i think if you have the choice it&#x27;s better not to do it on Monday.</span></li></ul><h2>Conclusion</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Now that you know this rule isn&#x27;t just outdated, it&#x27;s also counterproductive. </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">You can take the same approach to deployments that you do with everything else: make them routine, plan for them in advance, and prepare your team for success by eliminating siloed environments and automating as much as possible.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"> </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Good reads:</p><p><a href="https://builtin.com/software-engineering-perspectives/friday-deploys">Are Friday Code Deploys Bad for Work-Life Balance? | Built In</a></p><p><a href="https://medium.com/openclassrooms-product-design-and-engineering/do-not-deploy-on-friday-92b1b46ebfe6">Do not deploy on Friday!</a></p><p><a href="https://rnelson0.com/2016/03/23/no-deploy-friday-is-a-sign-of-it-maturity/">“No Deploy Friday” is a sign of IT Maturity</a></p><p><a href="https://hackernoon.com/deploy-on-fridays-or-dont-qg2y32jk">Deploy on Fridays, or Don&#x27;t. | HackerNoon</a></p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"> </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"> </p></section></div>]]></description><link>undefined/if-youre-afraid-of-deploying-on-friday-you-should-be-scared-of-deploying-on-weekdays-as-well</link><guid isPermaLink="true">undefined/if-youre-afraid-of-deploying-on-friday-you-should-be-scared-of-deploying-on-weekdays-as-well</guid><pubDate>Tue, 22 Aug 2023 07:47:00 GMT</pubDate></item><item><title><![CDATA[A simpler LTV (Life Time Value)]]></title><description><![CDATA[<link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/2abcadc6-7bf1-490b-b353-3e26dbdefc92/-/resize/1200/-/format/auto/Screenshot%20at%20May%20%2031%20-%20000558%402x.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/865dbcb8-0d3f-4ce0-afc6-76820ec15a6f/-/resize/1200/-/format/auto/Screenshot%20at%20May%20%2031%20-%20000560%402x.png"/><div class="ContentRenderer_renderer__tPJbs"><section class="prezly-slate-document" data-version="0.50"><h2> </h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Recently I had to answer some data questions around our ideal customer so I needed a way to calculate LTV. In the past I&#x27;ve done my fair share of heavy data lifting to get the most accurate value of Life Time Value. </p><img src="https://cdn.uc.assets.prezly.com/2abcadc6-7bf1-490b-b353-3e26dbdefc92/-/resize/1200/-/format/auto/Screenshot%20at%20May%20%2031%20-%20000558%402x.png" alt="Image"/><figcaption>Example formula of LTV</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Alternatively we&#x27;ve used platforms like <a class="prezly-slate-link" href="https://baremetrics.com/" target="_blank" rel="noreferrer">Baremetrics</a> or <a class="prezly-slate-link" href="https://chartmogul.com/" target="_blank" rel="noreferrer">ChartMogul</a> to do the math for us. ​ But reality is that we don&#x27;t obsess over those numbers and just don&#x27;t look at them enough to account for the cost.</p><h2>Lacking the data</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">In our case, calculating lifetime value (LTV) per account is difficult because we don&#x27;t store historical subscription data. We use Stripe for the bulk of the work, so we mostly just keep track of the current active subscriptions and don&#x27;t store information about past changes in subscription for each customer.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Additionally we don&#x27;t have the best insight in Subscribed Acquisition Cost (or CAC) per channel. And even if we did that starts <a class="prezly-slate-link" href="https://www.lifelog.be/solving-marketing-attribution-using-segment" target="_self">the whole conversation about marketing attribution</a>.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">A lot of reasons why we just don&#x27;t have the best view on our customer Lifetime Value.</p><h2>A much simpler way</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">What we do have in our database is a list of all invoices (and credit notes) synced to a single table. It has the history of every outgoing invoice spanning multiple billing systems from something self-built, Xero all the way to Stripe.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">The invoices table is looks a little like this where every invoice has a period and is linked to a customer in the customer table.</p><img src="https://cdn.uc.assets.prezly.com/865dbcb8-0d3f-4ce0-afc6-76820ec15a6f/-/resize/1200/-/format/auto/Screenshot%20at%20May%20%2031%20-%20000560%402x.png" alt="Image"/><figcaption>Illustration of the invoice &lt;&gt; customer data model</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">To get an approximation of Life Time Value I did nothing more than summing up all the invoices per customer which presented me with a pretty good understanding of who are our most valueable customers.</p><hr class="prezly-slate-divider"/><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">I know this calculation doesn&#x27;t look ahead and underestimates the LTV. But it did the job of comparing the most valuable customers. Plus, LTV isn&#x27;t always the perfect solution either.</p><blockquote class="prezly-slate-quote prezly-slate-quote--align-inherit">Some people wield the LTV model as if they were Yoda with a light saber; “Look at this amazing weapon I know how to use!” Unfortunately, it is not that amazing, it’s not that unique to understand, and it is not a weapon, it’s a tool. Companies need a sustainable competitive advantage that is independent of their variable marketing campaigns. You can’t win a fight with a measuring tape.<br/>​<!-- -->​<br/>​<!-- -->From: <a class="prezly-slate-link" href="https://abovethecrowd.com/2012/09/04/the-dangerous-seduction-of-the-lifetime-value-ltv-formula/" target="_blank" rel="noreferrer">The Dangerous Seduction of LTV.</a></blockquote><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"> </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"> </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"> </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"> </p></section></div>]]></description><link>undefined/a-simpler-ltv-life-time-value</link><guid isPermaLink="true">undefined/a-simpler-ltv-life-time-value</guid><pubDate>Wed, 31 May 2023 07:05:00 GMT</pubDate></item><item><title><![CDATA[What we learned in 3 months of using the Shape-up approach]]></title><description><![CDATA[<link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/bda0691a-5a9f-4f15-8a89-8798861b190b/-/resize/1200/-/format/auto/Screenshot%20at%20October%20%2026%20-%20000025.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/439cdfb3-4af0-4839-8a3c-217dd3d2978f/-/resize/1200/-/format/auto/Screenshot%20at%20October%20%2026%20-%20000027.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/ee1dafe5-0a8b-4ce9-bc44-7afb5189a3a8/-/resize/1200/-/format/auto/Screenshot%20at%20October%20%2026%20-%20000026.png"/><div class="ContentRenderer_renderer__tPJbs"><section class="prezly-slate-document" data-version="0.50"><h2> </h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"><a class="prezly-slate-link" href="https://www.lifelog.be/multiple-product-teams" target="_self">Adopting Basecamps &#x27;Shape-Up&#x27; method at Prezly</a> transformed our company. In an <a class="prezly-slate-link" href="https://www.youtube.com/watch?v=h_8M23wVjXk" target="_blank" rel="noreferrer">introductory video</a> by Ryan Singer (author of the method) he talked about the three main reasons people are interested in the method</p><ol class="prezly-slate-list prezly-slate-list--numbered prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><u>We&#x27;re growing</u>. Help me run multiple, parallel product teams</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><u>We&#x27;re slowing down</u>. Help us get back to shipping fast</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><u>There&#x27;s got to be a better way.</u> </span></li></ol><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Looking back I think we were struggling with all three. Although we tripled the product team we never really got the performance we knew we could have. </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">And on the company retreat, someone that recently joined the company asked me if I had ever read or tried Shape-Up which I think she used at a previous company. After coming home I immediately ordered the book and started reading it. </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"><a class="prezly-slate-link" href="https://basecamp.com/shapeup/0.3-chapter-01" target="_blank" rel="noreferrer">The introduction chapter</a> opened my eyes and I wanted to give it a go before even fully finishing the book. I did take a few more days to process the book and read any additional information I could find.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Just to give you an idea about all big stuff we shipped in the last 3 months:</p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Multi-workspace support (<a class="prezly-slate-link" href="https://www.prezly.com/changelog/manage-multiple-prezly-accounts--switch-between-them-anytime" target="_blank" rel="noreferrer">anouncement</a>)</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Theme showcase (<a class="prezly-slate-link" href="https://www.prezly.com/themes" target="_blank" rel="noreferrer">/themes on website</a>)</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Allowing customers to trial a newsroom (live / not live status)</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Improve the editor (ability to add blocks) (<a class="prezly-slate-link" href="https://www.lifelog.be/building-an-editor-decreasing-the-time-to-publish-by-44" target="_blank" rel="noreferrer">blog post</a>)</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Newsroom Analytics through Plausible Analytics (<a class="prezly-slate-link" href="https://www.prezly.com/changelog/analytics-dashboard-now-in-testing" target="_blank" rel="noreferrer">announcement</a>)</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Snippets (<a class="prezly-slate-link" href="https://www.prezly.com/changelog/save-frequently-used-content-as-snippets-and-use-them-in-stories-and-emails" target="_blank" rel="noreferrer">announcement</a>)</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Editor Placeholders (<a class="prezly-slate-link" href="https://www.prezly.com/changelog/placeholders-for-content-in-stories-and-emails" target="_blank" rel="noreferrer">announcement</a>)</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Get rid of the newsroom picker (<a class="prezly-slate-link" href="https://www.prezly.com/changelog/newsroom-statuses--other-fixes--improvements" target="_blank" rel="noreferrer">announcement</a>)</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Comparing Prezly to our competitors on the website (<a class="prezly-slate-link" href="https://www.prezly.com/vs/mailchimp" target="_blank" rel="noreferrer">/vs/mailchimp on website</a>)</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Rebuild the gallery feature (<a class="prezly-slate-link" href="https://www.prezly.com/changelog/introducing-the-new-media-galleries-page" target="_blank" rel="noreferrer">announcement</a>)</span></li></ul><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">This is a huge list and I couldn&#x27;t be prouder of the team and the quality of the work they shipped even though it was the holiday season and our team was severely impacted by the war in Ukraine and events in Iran.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Here are a few things we learned from the book that I hope can help you to ship faster and better.</p><h1>Stick to the (shaping) process</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">It&#x27;s natural for founders and people with influence on the betting process to push for the things they believe in. That is the whole concept of &#x27;<a class="prezly-slate-link" href="https://basecamp.com/shapeup/2.2-chapter-08" target="_blank" rel="noreferrer">the betting process</a>&#x27;. But the most important thing is to follow all due steps.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">I&#x27;ve caught myself and my co-founder rushing certain pitches and making them ready for betting when they are not. I mean how can we decide to improve the /help section on the website without thoroughly consulting with the Customer Success team? One time I was writing a new pitch on the night before we had the betting session hoping to include my own awesome idea.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Following the process means involving the right people, getting smart people to try and find some gaps in your pitch and giving everyone enough time to provide feedback.</p><h1>Don&#x27;t be too negative</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">It&#x27;s easy to try and poke holes when you&#x27;re the first one going in to review a pitch. Be aware that it&#x27;s often the first time people are formally writing down their idea.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">You want to encourage people to write more.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">So make sure to find the right tone in your message. My personal communication style is often too short/direct which might gets interpreted as killing the pitch. Don&#x27;t be that guy!</p><img src="https://cdn.uc.assets.prezly.com/bda0691a-5a9f-4f15-8a89-8798861b190b/-/resize/1200/-/format/auto/Screenshot%20at%20October%20%2026%20-%20000025.png" alt="Image"/><figcaption>A much better example!</figcaption><h1>Be ready to cancel a project</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">At the beginning of adopting Shape-up, we were oftentimes under or over-shaping the projects. This allowed poor pitches to make it to the product team which is a recipe for failure.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Some signals that there is something wrong with the pitch:</p><ol class="prezly-slate-list prezly-slate-list--numbered prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Team members are very confused in the beginning (scoping) of the project</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Open comments/concerns in the pitch that were not addressed by the author</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">A long list of documented Rabbit holes</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">The solution is too vague. &#x27;<em>Build a calendar&#x27; </em>or &#x27;<em>Implement a notification system&#x27;</em> is not enough direction for the team to act on</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">The assigned team has major concerns/thoughts not addressed in the pitch</span></li></ol><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">At one point we decided to cancel a project a few days after we started it because there were just too many unknowns.</p><img src="https://cdn.uc.assets.prezly.com/439cdfb3-4af0-4839-8a3c-217dd3d2978f/-/resize/1200/-/format/auto/Screenshot%20at%20October%20%2026%20-%20000027.png" alt="Image"/><figcaption>Announcing the stop of a project</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">In the meanwhile, this project has been re-shaped and made it through a more thorough review process. <a class="prezly-slate-link" href="https://www.prezly.com/changelog/introducing-the-new-media-galleries-page" target="_blank" rel="noreferrer">And it&#x27;s live now</a>!</p><h1>Collaborative Shaping = gold</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">I found the best pitches to be written by multiple people. It often starts with a rough idea that someone writes down - a problem statement and a concept solution and other people start pitching in with different ways to solve this problem.</p><img src="https://cdn.uc.assets.prezly.com/ee1dafe5-0a8b-4ce9-bc44-7afb5189a3a8/-/resize/1200/-/format/auto/Screenshot%20at%20October%20%2026%20-%20000026.png" alt="Image"/><figcaption>This is what you want to see</figcaption><h1>Make the team accountable</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">The whole concept only works if you make the team responsible for the outcome and take away as many distractions as possible. No interruptions.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">But accountability works both ways.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"><em>(this part sounds passive-aggressive reading it now so let me add some more context). ​<br/>​<!-- -->​<br/>​</em>What I am trying to say is that as a pitch author and voter you have a responsibility to make sure the pitch is coherent, well-defined and generally makes sense.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">But as a product team, you have the responsibility of taking that input (the pitch document) as an important guideline and starting point.</p><hr class="prezly-slate-divider"/><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">In one project we had the team dismiss a key part of the solution. ​ Not only did they drop a part of the solution, but they also didn&#x27;t communicate that until the end of the project.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">When the final project was announced I learned that they felt that one part of the pitch was not critical and too challenging within the appetite (two weeks) of this project. And because we repeated a lot teams can make their own decisions (<a class="prezly-slate-link" href="https://basecamp.com/shapeup/3.1-chapter-10" target="_blank" rel="noreferrer">Chapter 10. Hand over responsability</a>) the team assumed that that was ok. My opinion as an author of the pitch was that it was not ok.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">This started an interesting conversation with unanswered questions:</p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><em>Can the team leave out parts of the &#x27;solution&#x27; part of a pitch?</em></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><em>Does the author of the pitch need to be consulted in that case?</em></span></li></ul><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">The answers are probably even more complex because it depends on the pitch itself and how essential this component is to address the initial problem outlined at the start of the pitch.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Once I learned about this I sent some feedback to the team:</p><blockquote class="prezly-slate-quote prezly-slate-quote--align-inherit">Hi team, today (two days before the project is finishing) I learned that you decided to drop a key part of the documented solution. </blockquote><blockquote class="prezly-slate-quote prezly-slate-quote--align-inherit">This is not the way to do it though. The pitch was reviewed by some of you before the project started and that component was a key part of addressing the project&#x27;s problem statement.</blockquote><blockquote class="prezly-slate-quote prezly-slate-quote--align-inherit">If you want to drop a part of the solution you need to do it at the beginning of the project and properly communicate about it. </blockquote><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Two weeks later I still think this was the right call but I am also more aware that I need to communicate better about why we&#x27;re working on a pitch and the boundaries of freedom when it comes to the building phase.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">In this specific example, we solved it <a class="prezly-slate-link" href="https://basecamp.com/shapeup/3.5-chapter-14#when-to-extend-a-project" target="_blank" rel="noreferrer">by extending the project by a few days</a> and the team worked on the missing part and completed the full project in 2.5 weeks instead of the 2 allocated weeks. We are still working out how best to communicate scope changes during projects to avoid surprises - it’s a learning experience for all.</p><h1>Spend enough time on the problem</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">I&#x27;ve created a template for pitches that provides some format when writing a pitch. It contains 4 chapters: Problem, Solution, Rabbit Holes and No-Gos. But on numerous occasions I found myself crafting a pitch to only spend a few minutes on the problem part of the pitch. But how can you come up with a good solution without fully understanding the problem, to begin with? </p><blockquote class="prezly-slate-quote prezly-slate-quote--align-inherit">It’s critical to always present both a problem and a solution together. It sounds like an obvious point but it’s surprising how often teams, our own included, jump to a solution with the assumption that it’s obvious why it’s a good idea to build this thing. <em>(From </em><a class="prezly-slate-link" href="https://basecamp.com/shapeup/1.5-chapter-06#ingredient-1-problem" target="_blank" rel="noreferrer"><em>the Basecamp book)</em></a></blockquote><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">I&#x27;ve created a template for pitches that provides some format when writing a pitch. It contains 4 chapters: Problem, Solution, Rabbit Holes and No-Gos. But on numerous occasions I found myself crafting a pitch to only spend a few minutes on the problem part of the pitch. But how can you come up with a good solution without fully understanding the problem, to begin with? </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Looking back on all the projects we&#x27;ve been working on <strong>I am not 100% sure these are the most impactful things for us to work on</strong>. But these were the only pitches that were ready for betting.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">ℹ An important part of the betting process should be discussing the importance of a problem and how it&#x27;s impacting the business. The answer to that question will determine the likelihood of a project being picked. Instead, we find ourselves discussing the pitched solution most of the time without taking enough time to talk about the problem this pitch would be solving.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Secondly, I don&#x27;t think we have enough ways to remind team members and ourselves to work on the most important company problems. It&#x27;s much easier to scope a pitch to improve an existing feature than to write a pitch about something experimental with a much larger potential. </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">In the past, we&#x27;ve been careful with more experimental/wild ideas because we didn&#x27;t want those projects to get out of control (larger scope, take much longer than anticipated). But with the new approach and <a class="prezly-slate-link" href="https://basecamp.com/shapeup/2.2-chapter-08#the-circuit-breaker" target="_blank" rel="noreferrer">the concept of circuit-breaker vs appetite</a>, we need to push ourselves to get back to more daring ideas that might address some of the core issues we&#x27;ve identified for our company.</p><h1>No-gos are super important</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">People will try to hijack a project to introduce some changes they always wanted which aren&#x27;t always tied to the pitch. And that&#x27;s ok. The whole idea is based on empowering the teams to make their own decisions.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">But you want to limit that.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">That&#x27;s why I think it&#x27;s important to explicitly try and forecast that dynamic and to list things that you do not want to see people go into as part of the project.</p><hr class="prezly-slate-divider"/><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">We&#x27;ll continue to make slight adjustments to the way we work while we&#x27;re exploring how to use this new approach in other parts of the business like Marketing, Sales or Customer Success.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"> </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"> </p><h1> </h1></section></div>]]></description><link>undefined/what-we-learned-in-3-months-of-using-the-shape-up-approach</link><guid isPermaLink="true">undefined/what-we-learned-in-3-months-of-using-the-shape-up-approach</guid><pubDate>Wed, 26 Oct 2022 12:26:00 GMT</pubDate></item><item><title><![CDATA[Building an Editor: Decreasing the time to publish (by 44%)]]></title><description><![CDATA[<link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/ed91ce3e-0297-45de-bd57-acffb2937e01/-/resize/1200/-/format/auto/Screenshot%20at%20October%20%2018%20-%20000017.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/671d5cff-44c0-4ec8-a397-e9624df64929/-/resize/1200/-/format/auto/image.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/e40212b1-49e7-412e-b1a0-d08930b0f5b5/-/resize/1200/-/format/auto/Screenshot%20at%20October%20%2018%20-%20000018.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/5fdb468e-d1fe-4cf3-9f68-c22242f2e305/-/resize/1200/-/format/auto/Screenshot%20at%20October%20%2018%20-%20000019.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/e5d8f2e8-58d5-4e04-b041-559783236293/-/format/auto/CleanShot%202022-03-07%20at%2015.39.55.gif"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/305ad2fb-d46a-4203-8249-80a64d2bf267/-/format/auto/Screenshot%20at%20October%20%2018%20-%20000012.gif"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/a9d5558c-4dff-44c6-9f71-b3db338c0699/-/resize/1200/-/format/auto/Screenshot%20at%20October%20%2018%20-%20000015.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/2853cda7-5834-431a-ab8a-168ace3e2b65/-/resize/1200/-/format/auto/Screenshot%20at%20October%20%2018%20-%20000016.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/d0f0695b-fd55-4658-9f51-f759a16c13df/-/resize/1200/-/format/auto/image.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/09b87df9-77f1-4e42-a0a9-81fc5a5827af/-/resize/1200/-/format/auto/image.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/76e39d83-7454-42ec-88ea-c10c13590a06/-/resize/1200/-/format/auto/image.png"/><div class="ContentRenderer_renderer__tPJbs"><section class="prezly-slate-document" data-version="0.50"><h2> </h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Writing and publishing a blog post or press release is at the core of the Prezly product and we want to make it better, faster, more powerful and easier to use.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">But building an editor is bloody hard and in a post last year <a class="prezly-slate-link" href="https://www.lifelog.be/create-an-editing-experience-people-love" target="_blank" rel="noreferrer">I listed a number of things I find important</a> when it comes to the writing experience.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Since then we&#x27;ve been spending a lot of time on improving the Prezly editor. One of the ways to measure our progress is to look at the time it takes for our customers to complete the journey from creating the draft to the final publication of that story.</p><img src="https://cdn.uc.assets.prezly.com/ed91ce3e-0297-45de-bd57-acffb2937e01/-/resize/1200/-/format/auto/Screenshot%20at%20October%20%2018%20-%20000017.png" alt="Image"/><figcaption>Time to publish a story (in minutes)</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">In about 1 year we have decreased the time from an average of 33.8 minutes to 22.6 today. In this post, I am going to highlight the many changes we made.</p><h1>Adding blocks to a story</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">One of the main ways to insert anything else than text is to use what we call &#x27;<em>the plus menu</em>&#x27; which is a lot of CMS/content editing platforms perhaps like Notion.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">We noticed through qualitative and quantitative feedback that some of our customers didn&#x27;t know that there is a [+] menu in the first place. That&#x27;s why we improved the empty state and added a tooltip and improved copy to encourage customers to try it.</p><img src="https://cdn.uc.assets.prezly.com/671d5cff-44c0-4ec8-a397-e9624df64929/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption>Empty state</figcaption><h1>The [+] plus menu</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">The menu is a powerful tool to mix text with any of the other blocks that are available in Prezly like galleries, videos, file attachments or regular embeds.</p><img src="https://cdn.uc.assets.prezly.com/e40212b1-49e7-412e-b1a0-d08930b0f5b5/-/resize/1200/-/format/auto/Screenshot%20at%20October%20%2018%20-%20000018.png" alt="Image"/><figcaption>Different variations of the [+] plus menu</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">We looked at 100s of sessions of how people were using the + menu and made a lot of small/improvements:</p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Improved positioning of the menu on different viewports or when scrolling</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Better (fuzzy) search</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Support alternative keywords (aliases) for blocks. Searching &#x27;<em>youtube</em>&#x27; will find the video block</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Added a suggestions menu with the most used/important blocks</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Smarter positioning of the flyout menu (when scrolling). See below.</span></li></ul><h1>In-between content</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Once you have a story with some content you might want to add some multimedia in the middle. One of the challenges is that the + menu icon only shows up on an empty paragraph. And to add an empty paragraph you need to move your cursor to the beginning or end of a paragraph and hit <em>enter</em>.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">This works if it&#x27;s a paragraph but becomes annoying if you want to add a block between two other blocks and even impossible if the first element in the story is a multi-media block 😱.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Initially, we wanted to solve this with icons that allow you to create an empty paragraph before/after similar <a class="prezly-slate-link" href="https://ckeditor.com/ckeditor-5/demo/" target="_blank" rel="noreferrer">to how CKEditor is solving it.</a></p><a href="https://ckeditor.com/ckeditor-5/demo/#balloon"><img src="https://cdn.uc.assets.prezly.com/5fdb468e-d1fe-4cf3-9f68-c22242f2e305/-/resize/1200/-/format/auto/Screenshot%20at%20October%20%2018%20-%20000019.png" alt="Image"/><figcaption>CKEditor - Insert before/after</figcaption></a><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">But the prototype we built came with some challenges and looked messy with the existing options/block menu we already have. </p><img src="https://cdn.uc.assets.prezly.com/e5d8f2e8-58d5-4e04-b041-559783236293/-/format/auto/CleanShot%202022-03-07%20at%2015.39.55.gif" alt="Image"/><figcaption> </figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">We landed on some virtual whitespace before/after a block that can be used to insert a new paragraph. </p><img src="https://cdn.uc.assets.prezly.com/305ad2fb-d46a-4203-8249-80a64d2bf267/-/format/auto/Screenshot%20at%20October%20%2018%20-%20000012.gif" alt="Image"/><figcaption>Insert before/after</figcaption><h2>Keyboard Shortcuts</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">In addition to a workflow that involves touching your mouse we also added support for keyboard shortcuts:</p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><strong>Ctrl + Enter</strong> (<strong>Cmd + Enter </strong>on<strong> 🍏</strong>) to insert <em>below</em> the current block</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><strong>Ctrl + Shift + Enter</strong> (<strong>Cmd + Shift </strong>on<strong> 🍏</strong>) to insert <em>above</em> the current block</span></li></ul><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">The goal is to add additional keyboard shortcuts for common-used actions like inserting a video, linking the selected text, etc...</p><h1>Component Controls + Placeholders</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">We cleaned up the UI of the component controls and made them dark. There was a lot of discussion around the dark UI but the main idea that ended up making it was that this way it contrasts with the rest of the editing experience highlighting that the dark menus are extra things/settings you can do with every editor block.</p><img src="https://cdn.uc.assets.prezly.com/a9d5558c-4dff-44c6-9f71-b3db338c0699/-/resize/1200/-/format/auto/Screenshot%20at%20October%20%2018%20-%20000015.png" alt="Image"/><figcaption>(dark) UI of the different editor components</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">With that, we also touched the text menu and the campaign composer menu to all be dark and provide a consistent editing experience.</p><img src="https://cdn.uc.assets.prezly.com/2853cda7-5834-431a-ab8a-168ace3e2b65/-/resize/1200/-/format/auto/Screenshot%20at%20October%20%2018%20-%20000016.png" alt="Image"/><figcaption>(dark) text formatting menu</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Additionally, we made the behaviour to add blocks more consistent where every time you want to insert a block we add a &#x27;placeholder&#x27; in the editor. This placeholder can be used to provide more guidance/help links and implement some draggable zones where an image (or multiple images) can be dragged on top of the placeholder.</p><h1>Pick a site before you start</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Because Prezly supports multiple sites it&#x27;s important to know in which space you are currently editing, because some settings and editing options are tied to the context. </p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">The available languages/translations are linked to the newsroom settings and defaults</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Newsroom contacts (think Author cards) are tied to the context of the newsroom</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Preview URLs are different</span></li></ul><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">For any customer that had more than one space, we had some magic/hard-to-explain rules and combinations that guessed the site you wanted to create this story in. The problem was that sometimes we guessed wrong which made the editing experience much harder than it should be.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">We&#x27;d see editors trying to change the language of their story, or insert a contact card that wasn&#x27;t there. All because we picked the wrong site.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">The decision to solve this was quite simple:</p><h2><strong>1) Pick your newsroom</strong></h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">The idea is to add a little friction to the flow to create a new story but avoid some headaches down the line. </p><img src="https://cdn.uc.assets.prezly.com/d0f0695b-fd55-4658-9f51-f759a16c13df/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption>Pick a site before creating</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Obviously, customers with only one site don&#x27;t see this picker.</p><h2><strong>2) Show which space you&#x27;re in</strong></h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Instead of having a super-weird UX pattern where one dropdown (site dropdown) would serve as both a breadcrumb and a &#x27;change your newsroom&#x27; flow was utterly confusing.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">So we moved the &#x27;change newsroom&#x27; to an advanced settings pane and made the site indicator prominent and read-only so there is no more confusion as to which space you&#x27;re editing in.</p><img src="https://cdn.uc.assets.prezly.com/09b87df9-77f1-4e42-a0a9-81fc5a5827af/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption>Site breadcrumb (when editing story)</figcaption><h1>Image Uploader</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Behind the scenes, we&#x27;re using <a class="prezly-slate-link" href="http://uploadcare.com" target="_blank" rel="noreferrer">uploadcare.com</a> for all uploads like attachments, videos, media galleries and pictures. This is a tremendous help as they provide uploading tools but make it easy to transform and serve those assets through their CDN. </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">We have a deep integration of Uploadcare within Prezly but the most noticable integration for our customers is the upload modal.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"> </p><img src="https://cdn.uc.assets.prezly.com/76e39d83-7454-42ec-88ea-c10c13590a06/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption>Upload Modal</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">So we looked at a lot of sessions where people were using this modal and came up with a list of improvements:</p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Improve copy of the different tabs + text</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Provide quick access to help docs</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Allow reordering image galleries during upload</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Implement a &#x27;recently uploaded&#x27; tab to avoid having to upload the same asset</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Shortcuts to set the image description based on the file name</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Bring the UI closer to our design system</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Add a &#x27;newsroom media&#x27; tab enabling editors to pick content from their site media kit</span></li></ul><hr class="prezly-slate-divider"/><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">We&#x27;re not done yet. But between now and my previous post on building an editor-friendly writing experience we&#x27;ve made good progress.</p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">✅ Auto-save to avoid losing work</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Awesome linking experience</span><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Easily link to other content in the same CMS</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Allow different type of links</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Highlight (and upgrade) broken links</span></li></ul></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">✅ Use good typography</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">✅ Great support for lists</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">✅ Show pasted images inline</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">✅ Essential features done right</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">✅ Wrap long lines</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">✅ Make it fast (speed/performance)</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">✅ Support text-correction extensions</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Undo/Redo (with shortcuts)</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Good pasting behaviour</span></li></ul><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">We&#x27;re currently working on a new interface for Story editing that goes beyond the Prezly editor (Snowbird). This will hopefully address most of the issues I listed <a class="prezly-slate-link" href="https://www.lifelog.be/redesigning-the-writing--publishing-experience-tcdet7" target="_blank" rel="noreferrer">in this previous post.</a></p><div style="background:#FEE;border:1px solid red;color:red;padding:1em;margin:1em 0"><strong>[@prezly/content-renderer-react-js]</strong> Unknown node type encountered:<div style="font-family:monospace">{&quot;type&quot;: &quot;story-bookmark&quot;, &quot;children&quot;: [...], &quot;uuid&quot;: &quot;77679d6f-d91f-4d2d-a956-99c8e9d09d8d&quot;, &quot;story&quot;: {&quot;uuid&quot;:&quot;6e477dba-3bca-4243-8db9-73b5b6d93cbd&quot;}, &quot;show_thumbnail&quot;: true, &quot;layout&quot;: &quot;horizontal&quot;, &quot;new_tab&quot;: false}</div></div><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Are there any improvements you&#x27;d like to see? </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"> </p></section></div>]]></description><link>undefined/building-an-editor-decreasing-the-time-to-publish-by-44</link><guid isPermaLink="true">undefined/building-an-editor-decreasing-the-time-to-publish-by-44</guid><pubDate>Mon, 17 Oct 2022 08:54:00 GMT</pubDate></item><item><title><![CDATA[The spammer that was able to send 4 million emails]]></title><description><![CDATA[<link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/16930e23-7d62-4ef0-8651-89e88b3e0534/-/resize/1200/-/format/auto/image.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/7a996f2b-8d22-459e-bfa5-66229d981724/-/resize/1200/-/format/auto/image.png"/><div class="ContentRenderer_renderer__tPJbs"><section class="prezly-slate-document" data-version="0.50"><h2>We&#x27;ve had a free trial form for over a year now and we&#x27;re constantly fighting people that sign up to abuse our system.</h2><h1>What happened?</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Last weekend someone was able to sign-up for a Prezly trial and send out over 4 million emails unnoticed. I mean, we did notice it after the weekend but then it was too late.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">This will increase our SendGrid bill but that&#x27;s not the worst. It also affects our sending reputation which is slowly recovering after the hotfix on Monday.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"><em>TLDR: The &#x27;send a test email&#x27; functionality allowed comma-separated multi-send and was hijacked to send out spam (with [TEST] prefix).</em></p><h2>How could this happen?</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">We have a number of limits in place for trial accounts: Any account that has not entered their credit card details can not interact with DNS (newsroom domain, DKIM/SPF sender domain verification) and there are time-based volume limits in place with regard to email sending.<br/>​<!-- -->​<br/>​<!-- -->The truth is that we didn&#x27;t build these limits for trial accounts but rather for some high-usage customers and found out later that the same validation should be applied to trials. </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">This weekend on Saturday night we had a ton of incoming trial requests with similar email addresses that looked sketchy. As we&#x27;ve become more confident in the automatic enforcement of account limits we don&#x27;t manually check logs/verify account activity (anymore). </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">These trials hijacked the &#x27;send a test email&#x27; functionality in the email composer that allows customers to enter a comma-separated list of addresses to send a few people a sample email campaign. The email subject is prefixed with [TEST] - though.<br/>​<!-- -->​<br/>​<!-- -->The spammers abused this feature to enter a very long string of email addresses (up to 10k email addresses per submission) and do that over and over. </p><img src="https://cdn.uc.assets.prezly.com/16930e23-7d62-4ef0-8651-89e88b3e0534/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption>One of the fullstory sessions pasting ton of email addresses</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">After doing more research about what exactly went down I believe later some automation was used where we were seeing multiple accounts exploit the same vulnerability at the same time.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">4 million emails. Sigh...</p><h2>Patching the hole</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">After Jesse noticed something weird happened over the weekend it took a few lines of code to add additional validation to prevent this from happening. But as we didn&#x27;t want to remove that functionality we decided that trial users can only send test emails to their own email addresses.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">We&#x27;re aware this is not the perfect solution and some of the higher-quality trial accounts might be annoyed by this limitation. </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">In the long-term, I think we&#x27;ll implement some kind of scoring system where those limitations are applied based on some (automated or manual) qualification/risk score.</p><h2>What else could go wrong?</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Taking a step back from this specific case I took some time to think about other potential ways a trial account could harm our system or significantly increase <a class="prezly-slate-link" href="https://www.lifelog.be/the-cost-to-run-a-saas-with-a-few-million--arr" target="_blank" rel="noreferrer">our cost for running Prezly</a>. </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Here is what I came up with:</p><ol class="prezly-slate-list prezly-slate-list--numbered prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Use our newsroom/CDN to host files</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Overload the system by importing huge/corrupt contact files</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Use the API to create a huge amount of content increasing our Algolia charges</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Trigger a shit-ton of `identify()&#x27; calls to increase volume-based MTU billing in for example segment.com</span></li></ol><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Although I am aware that only scenario 1. will provide value to the attacker with more incentives than the other more malicious scenarios, I think this is something to be aware of.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"> In Scenario 1) we do have some kind of measures where we clean up old/sleeping accounts and thus there would be no long-term benefits of using Prezly as trustworthy file storage.</p><h1>Going Forward</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">This case has reminded me again that we should probably do even more to protect our customers and reputation. And while I want to make sure that good leads/PR agencies and brands that sign up for a Prezly trial have an awesome first experience. That experience is impacted by some of the limitations we put in place to protect ourselves from bad actors.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Some ideas and things I will be exploring in the next few weeks. For some of the larger ideas, I will create <a class="prezly-slate-link" href="https://www.lifelog.be/multiple-product-teams" target="_blank" rel="noreferrer">a Shape-Up/Scoping document</a> and pitch them in the next betting session.</p><h2>Use our Trial Qualification</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">We are already manually qualifying all incoming trials in the Prezly app. This allows us to run other automation and playbooks based on the quality of the lead.</p><img src="https://cdn.uc.assets.prezly.com/7a996f2b-8d22-459e-bfa5-66229d981724/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption>Manual Qualification (first column)</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">As our sales team is manually going through those leads, connecting with them on LinkedIn, and figuring out if this is a real company vs a bot, I think this is a good indicator of how much we can trust those accounts.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">We could keep all the trial limitations (and the extra limitation we built in for this spammer) in place for low/unqualified accounts where we get out of the way for trials that were manually marked as having higher potential.</p><h2>Improve monitoring &amp; Alerts</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">We only send automated alerts (SMS/slack messages/phone calls) if there are reliability issues with our systems. An increase in error rates, failure to connect with backstream systems, and issues with load or pods crashing.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">But we don&#x27;t proactively monitor and alert customer behaviour. This means that creating 100k stories or importing 5 million contacts would probably go unnoticed unless it would trigger any reliability alerts due to a slower database or the application being unable to keep up.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">But because we have some components that auto-scale the damage might already be done before we even notice it.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Going forward I think we need to proactively monitor total system usage with things like:</p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Number of emails sent</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Number of stories published</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Number of newsrooms created</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Amount of domains verifications failed</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Total amount/size of uploads on CDN</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Contact import records being processed</span></li></ul><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">After we have some baseline metrics we could set up certain thresholds and alert the right people if the number is exceeding &#x27;normal&#x27; app usage. It would probably have helped a lot in noticing this issue a little earlier.</p><h2>Isolate the email reputation for Trial Accounts</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Almost all customers (outside of some Enterprise customers) share the same IPs and email-sending infrastructure. We do a lot to protect our reputation:</p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Warning customers of increased spam rates</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Forcing unsubscribes. No way to revert a recipient&#x27;s unsubscribe</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Dropping soft bounces for future campaigns</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Discouraging &#x27;email all&#x27; behaviour</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Suspending accounts that smell like spam</span></li></ul><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">This enabled us to keep our sending reputation high as landing in the inbox is one of the key concerns for new customers trying our product.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">But every software has bugs or oversights. And I think it&#x27;s safe to say there will be similar situations in the future.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">So wouldn&#x27;t it be good to isolate the sending behaviour of trial accounts, and maybe for newly joined customers on lower plans, to their own sending IPs and email reputation?</p><h2>Ask for Credit Card</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Some of my favourite SaaS companies ask for a credit card during the sign-up process and talked about it (<a class="prezly-slate-link" href="https://youtu.be/zwtdU7QK4GI?t=801" target="_blank" rel="noreferrer">Nathan Barry/Convertkit</a>). I am pretty confident requiring a CC would do what you&#x27;d expect:</p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Lower conversion rate</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Increase usage for trials</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">More efficient funnels for trials</span></li></ul><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">And although this would probably discourage bad actors from trying to exploit Prezly it comes with a price. Because now you have fewer trials together with less information on what people do when they are first activating their account.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">So I&#x27;m not sure about credit cards yet. And <a class="prezly-slate-link" href="https://www.indiehackers.com/post/asking-for-credit-cards-upfront-changed-my-business-ec400440da?commentId=-Mvz0cohE4pnjA699E0q" target="_blank" rel="noreferrer">this discussion on Indiehackers</a> proves that I&#x27;m not the only one with that concern.</p><hr class="prezly-slate-divider"/><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">In an ideal world, I would not have to spend time on this and focus on building an awesome product and company. Yesterday I learned <a class="prezly-slate-link" href="https://techcrunch.com/2022/08/25/heroku-announces-plans-to-eliminate-free-plans-blaming-fraud-and-abuse/?guccounter=1&amp;guce_referrer=aHR0cHM6Ly93d3cuZ29vZ2xlLmNvbS8&amp;guce_referrer_sig=AQAAAGgdVdSvxAif_f3tfDdt4-yovw34kZldxdWZdrT6bjnvSbyIrxcGDaJVZkhCzyRl42Y5pkJx0QBPvYhyzOcO3C2d10i1oKDREvYshq86Z82dgCIstvTeOpb6UhOSqilay5WOKyerIBlCT1wsLvki8zj9ufcd0xFrKFAnxksvNgxU" target="_blank" rel="noreferrer">about Heroku shutting down their free plans stating &#x27;abuse&#x27; as the main reason. </a>So I&#x27;m sure we&#x27;re not the only ones struggling with this.</p><h2> </h2><h2> </h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"> </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"> </p><h2> </h2></section></div>]]></description><link>undefined/the-spammer-that-was-able-to-send-4-million-emails</link><guid isPermaLink="true">undefined/the-spammer-that-was-able-to-send-4-million-emails</guid><pubDate>Thu, 01 Sep 2022 07:08:32 GMT</pubDate></item><item><title><![CDATA[Our road to building better product teams]]></title><description><![CDATA[<link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/99aed992-115f-4748-9a77-72140595f274/-/resize/1200/-/format/auto/image.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/bdae480e-4e3d-4a62-be77-73c3103e7149/-/resize/1200/-/format/auto/image.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/24217bd9-d558-439d-b14a-6dba7beb710a/-/resize/1200/-/format/auto/image.png"/><div class="ContentRenderer_renderer__tPJbs"><section class="prezly-slate-document" data-version="0.50"><h2> </h2><blockquote class="prezly-slate-quote prezly-slate-quote--align-inherit">Two steps forward, one step back</blockquote><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">This would be my most accurate one-liner of what it feels like to build <a class="prezly-slate-link" href="https://www.prezly.com/" target="_blank" rel="noreferrer">a company</a> from a three-person founding team to a few-million revenue/30+ headcount business.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">And the same is true for the product team where we&#x27;ve evolved from early years of rapid experimentation (&quot;let&#x27;s try agile&quot;, &quot;adopt Jira company-wide&quot;, &quot;idea + execution on the same day&quot;) to a more stable and well-functioning product development pace which has been paying off.</p><h1>Break up into three teams</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">In the last 12 months, we&#x27;ve broken down the product team into three autonomous teams with their own projects and tasks. This meant we had to hire at least four more people for the product team. We <a class="prezly-slate-link" href="https://careers.prezly.com/" target="_blank" rel="noreferrer">still have some open roles</a>.</p><img src="https://cdn.uc.assets.prezly.com/99aed992-115f-4748-9a77-72140595f274/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption>The product team split into 3 teams</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">So now every team has a dedicated product designer and a mix of frontend and backend developers.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"><em>Fun fact: our team uses Elvis Presleys song titles: Mystery Train, Tutti Frutti and Hot Dog. </em></p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Breaking up those teams was a logical decision to further scale the product team. Many business books mention the &#x27;autonomous teams&#x27; approach which certainly feels like the right way forward.</p><img src="https://cdn.uc.assets.prezly.com/bdae480e-4e3d-4a62-be77-73c3103e7149/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption>Before/After breaking up the product team (into three teams)</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">The outcome of this change is that team members work together more closely and are better focused on the projects assigned to their respective teams. </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">We&#x27;ve also carried through that team split in Linear, where every team has its own space, projects and stories (that have a different prefix). This change has resulted in more collaboration (within teams) and a more predictable pace. Two steps forward!</p><h2>One step back</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">But there are some downsides to this approach:</p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><strong>Everyone stays in the same team</strong>. This impacts the overall social dynamics and reduces the amount of information sharing.</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><strong>More work to assign and plan issues</strong>. Because bugs now belong to a team there is more work in triaging/allocating the right person as one needs to think about which team is responsible for that part of the product.</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><strong>Harder to deal with holidays. </strong>If a person in a 4-5 person team takes a holiday you lose 25% productivity. That planning is almost impossible if that person is the designer or the only backend developer in that team.</span></li></ul><h2>Company challenges</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">And reflecting a bit more on the recurring problems we&#x27;ve been experiencing as a company I keep coming back to three main areas:</p><ol class="prezly-slate-list prezly-slate-list--numbered prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><strong>Doing too many things simultaneously: </strong>Both <a class="prezly-slate-link" href="https://www.jailhouse.be/" target="_blank" rel="noreferrer">Jesse</a> and I have a hands-on approach which I believe gets us to start too many things with no clear end in sight.</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><strong>Being founder driven:</strong> You must have heard this quote &#x27;<em>going from 0 to 1 million ARR is a lot easier than going from 1 to 5 million</em>. That is because you can get to the first million with a few talented individuals (and you don&#x27;t need management skills).</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><strong>Working/Overspending on stuff that&#x27;s not that important: </strong>I have many projects that I am 100% sure took us way more time, energy, and resources than we’d ever wanted to spend upfront. Heck, we should have probably never even tried if we knew it would take that long.</span></li></ol><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">And 1. and 3. can kill motivation as team members feel like projects are going on and on with no end in sight.</p><h1>The company we want to be</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">We&#x27;re big believers in &quot;the calm company&quot; approach where teams are given enough freedom and responsibility to plan their own work. In this flat structure, work is organised by the people rather than a top-down command-and-control leadership style.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">But while it&#x27;s easy to hand out copies of &#x27;<a class="prezly-slate-link" href="https://basecamp.com/books/calm" target="_blank" rel="noreferrer">It does not have to be crazy at work</a>&#x27; it&#x27;s much harder to implement. I have discovered that this is a long-term transformation that touches many aspects of the business: hiring, mission/vision, and most importantly an internal transformation going from management to leadership which are two entirely different things.</p><h1>Product team reorganisation</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">I&#x27;m not the biggest fan of being too strict about applying so-called &quot;proven methodology&quot;. We use a set of concepts from different methodologies where we cherry-pick and adopt the stuff that works for us.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Still, I was pondering how to improve the way we work together and ship stuff within Prezly and I found inspiration in two books/concepts:</p><h2>Shape-Up (by Basecamp)</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"><a class="prezly-slate-link" href="https://basecamp.com/shapeup" target="_blank" rel="noreferrer">Shape-up is a project/product management method by Basecamp</a> with good principles and guidelines on how to work together as a product team. </p><blockquote class="prezly-slate-quote prezly-slate-quote--align-inherit">As software teams start to grow, some common struggles appear:<br/>​<!-- -->​<br/>​<!-- -->- Team members feel like projects go on and on, with no end in sight.<br/>​<!-- -->- Product managers can’t find time to think strategically about the product.<br/>​<!-- -->- Founders ask themselves: “Why can’t we get features out the door like we used to in the early days?”<br/>​<!-- -->​<br/>​<!-- -->From <a class="prezly-slate-link" href="https://basecamp.com/shapeup/0.3-chapter-01#growing-pains" target="_blank" rel="noreferrer">Basecamp book Chapter 1: Growing Pains</a></blockquote><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">This spoke to me a lot. In fact, it&#x27;s a better-written version of some of the challenges I highlighted in the company challenges part. And there are three things I think we should implement within Prezly:</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"><strong>1) Strong focus on scoping (shaping)</strong></p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Everyone who wants to suggest a change/improvement needs to spend time on shaping/defining the problem well. </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">In practice, it is mostly senior people or me/Jesse that start shaping ideas. But having an explicit process (shapings documents, betting table) enables us to think about the problem enough and let the team work on the solution (within certain constraints).</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"><strong>2) Circuit Breaker / Appetite</strong></p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">The idea is that every project comes with a certain appetite which reflects how much time/money/resources you want to spend on a problem. Teams get a fixed amount of time to work on an issue; after that, the &#x27;circuit breaker&#x27; mechanism kicks in, forcing the team to stop working.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">This concept is extremely empowering for the people pitching and shaping the idea. </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"><strong>3) The Betting Process</strong></p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">When first reading the Shape-Up book, I internalised the betting process as some kind of democratic/point-based voting system where the pitch with the most points wins.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">But it&#x27;s nothing like that.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">The betting process is more like a conversation that keeps many different aspects of the business into account:</p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Who would be the right person to work on this?</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Is that person free right now? Do they have a holiday planned?</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">How well does this project align with current business objectives?</span></li></ul><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">These are simple questions to answer individually, but together they create some kind of puzzle that is hard to explain.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">In the video, Ryan mentions that the betting process probably deserves its own book which I think is much harder to write as I it&#x27;s more of an art than a technique.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">In the first betting session, I noticed that the conversation creates alignment between leadership. The conversation is not about who is right (because no one knows) but about which experiment we&#x27;re doing first and how much we want to spend.</p><h1>Reduce team distractions</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">You want to avoid any distractions for a team that is allocated to a shaped project. This is critically important as a team accepts the challenge of solving a specific business problem within the provided timeframe (appetite). ​<br/>​<!-- -->​<br/>​<!-- -->But, if you&#x27;re going to distract that team by assigning P1 issues or allocating them to client todos there is a big chance the whole shape-up method will fail. But then again, some things can&#x27;t wait.</p><h1>Quick Reaction Force (QRF Model)</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">A while back I read a great medium article about creating a dedicated team for interruptions which they call the QRF (Quick Reaction Force).</p><p><a href="https://medium.com/engineering-manager-hub/engineering-org-structures-the-qrf-team-model-7b92031db33c">Engineering Org Structures— The QRF Team Model</a></p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">This model will work well with our Shape-Up experiment as it will ensure we have an available team for interruptions.</p><blockquote class="prezly-slate-quote prezly-slate-quote--align-inherit">The truth is, some things can’t wait. Compliance demands, a new employee onboarding, a large customer’s tiny configuration change — these are activity-generated work that just needs to get done with some sort of time-sensitive cadence.<br/>​<!-- -->​<br/>​<!-- -->From <a class="prezly-slate-link" href="https://medium.com/engineering-manager-hub/engineering-org-structures-the-qrf-team-model-7b92031db33c" target="_blank" rel="noreferrer">Medium.com - The QRF Team Model</a></blockquote><h1>The model that works</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">By combining the Shape-Up method and the QRF Team Model the structure of the product team will look a bit like this:</p><img src="https://cdn.uc.assets.prezly.com/24217bd9-d558-439d-b14a-6dba7beb710a/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption>Multiple Product teams + Quick Reaction Force</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">I&#x27;m confident this combination will address some of the issues raised by the team during the last retrospectives. Additionally, the QRF model might create room to work on essential tasks (refactoring, admin tools) that currently do not get enough attention and might never be planned/shaped.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">At the end of each cycle, we form new project teams and move people around based on availability/expertise. I believe this rotation might positively impact team culture and knowledge sharing, but that&#x27;s all to be confirmed.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">I will post back in a few months with better insights.<br/>​<!-- -->​<br/>​<!-- -->Inspiration/Good reads:</p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://basecamp.com/shapeup" target="_blank" rel="noreferrer">Shape-Up</a> (by Basecamp)</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://medium.com/engineering-manager-hub/engineering-org-structures-the-qrf-team-model-7b92031db33c" target="_blank" rel="noreferrer">The QRF Model</a> by <a class="prezly-slate-link" href="https://jgefroh.medium.com/" target="_blank" rel="noreferrer">Joseph Gefroh</a></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://linear.app/method" target="_blank" rel="noreferrer">Linear.App - Method</a></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.chameleon.io/blog/spotify-squads" target="_blank" rel="noreferrer">Why Squads are a Popular Failure for product teams</a> by Spotify</span></li></ul><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"> </p></section></div>]]></description><link>undefined/multiple-product-teams</link><guid isPermaLink="true">undefined/multiple-product-teams</guid><pubDate>Tue, 02 Aug 2022 11:21:00 GMT</pubDate></item><item><title><![CDATA[10 tips for better product analytics]]></title><description><![CDATA[<link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/d40e72e3-d991-4104-bd7f-695a5439a1d3/-/resize/1200/-/format/auto/image.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/0af89af9-f94b-47b1-afa8-0a79403c6d28/-/resize/1200/-/format/auto/image.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/2180aa34-2f32-4b0a-847b-2afce98a3875/-/resize/1200/-/format/auto/image.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/31d904c3-664f-4543-acc9-e55680656671/-/resize/1200/-/format/auto/image.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/9d4ffdd7-7e63-478b-99bf-ecf01fcb6778/-/resize/1200/-/format/auto/image.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/795117ff-8d33-4eb5-ac1d-484e8f304cb6/-/resize/1200/-/format/auto/image.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/a601055f-829c-4acc-b228-e6e3f87eec08/-/resize/1200/-/format/auto/image.png"/><div class="ContentRenderer_renderer__tPJbs"><section class="prezly-slate-document" data-version="0.50"><h2> </h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"><em>Disclaimer: I am no expert in product analytics and definitely not claiming to be. I did spend the last 5 years playing with a lot of different analytical tools and made a lot of mistakes. With this post I hope other people can avoid some of those.</em></p><hr class="prezly-slate-divider"/><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">While most startup books and marketing series talk about being &#x27;<em>data driven</em>&#x27;, I&#x27;ve come to understand that it&#x27;s easier said than done. ​<br/>​<!-- -->​<br/>​<!-- -->I&#x27;ve done my fair share of product analytics and I have found myself trying to convince people that the only way the project could be successful if we would <strong>measure and evaluate it. </strong>But that isn&#x27;t always that simple.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">In the last 10 years, <a class="prezly-slate-link" href="https://www.lifelog.be/solving-marketing-attribution-using-segment" target="_self">I&#x27;ve built my own tracking stack</a>, became a segment.com product expert and have used over 30 integrations <a class="prezly-slate-link" href="https://segment.com/catalog/" target="_self">from the segment.com catalog</a>.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Here are some things I learned to get better at (product) analytics:</p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.lifelog.be/10-tips-for-better-product-analytics#define-what-you-want-to-report-on" target="_self">Define what you want to report on</a></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.lifelog.be/10-tips-for-better-product-analytics#use-a-tracking-standard-analyticsjs" target="_self">Use a tracking standard</a></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.lifelog.be/10-tips-for-better-product-analytics#pick-good-event-names" target="_self">Pick good event names</a></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.lifelog.be/10-tips-for-better-product-analytics#dont-use-event-names-if-you-can-use-event-traits" target="_self">Don&#x27;t use event names if you can use event traits</a></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.lifelog.be/10-tips-for-better-product-analytics#dont-count-on-page-calls" target="_self">Do not count on page() calls</a></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.lifelog.be/10-tips-for-better-product-analytics#choose-tools-that-support-group" target="_self">Choose tools that support group()</a></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.lifelog.be/10-tips-for-better-product-analytics#mix-server-and-client-side-calls" target="_self">Mix server and client side calls</a></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.lifelog.be/10-tips-for-better-product-analytics#document-your-tracking-schema" target="_self">Document your tracking schema</a></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.lifelog.be/10-tips-for-better-product-analytics#teach-your-team-analytics" target="_self">Teach your team analytics</a> </span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.lifelog.be/10-tips-for-better-product-analytics#integrate-tracking-in-your-stack" target="_self">Integrate tracking in your stack</a></span></li></ul><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Let me know if you have any other important tips I can learn from.</p><hr class="prezly-slate-divider"/><h2>Define what you want to report on</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">This is the mistake I made the most: </p><blockquote class="prezly-slate-quote prezly-slate-quote--align-inherit">Look at all these cool/powerful reports we can make</blockquote><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Before you think about tracking or product analytics, try to define the thing you want to measure as simple as possible. <a class="prezly-slate-link" href="https://en.wikipedia.org/wiki/KISS_principle" target="_blank" rel="noreferrer">KISS</a>. I recommend to formulate it in a question format:</p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><strong>Bad: </strong>How much better is our new account activation wizard?</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><strong>Good</strong>: How long does it take on average to go from step 1 to step 5 of the account activation wizard?</span></li></ul><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"> </p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><strong>Bad: </strong>Can you create a dashboard of the features each customer uses?</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><strong>Good</strong>: How many of our active customers (non-trial) have used feature X at least once in the last month?<br/>​</span></li></ul><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Defining the question up front (<a class="prezly-slate-link" href="https://www.metabase.com/docs/latest/users-guide/04-asking-questions.html" target="_self">one of the key concepts of Metabase</a>) works well to keep it simple.</p><h2>Use a tracking standard (analytics.js)</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">When we started out we had different integration code for Mixpanel, Customer.io and other platforms we wanted to send data to. Which meant that we had to maintain those tracking calls separately.</p><img src="https://cdn.uc.assets.prezly.com/d40e72e3-d991-4104-bd7f-695a5439a1d3/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption>Customer.io Tracking call - Mixpanel Tracking call</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Note that the more integrations you use (we currently use 6) the more code you need to maintain. Abstracting this all in one tracking language/standard was the main reason for switching to segment (using <a class="prezly-slate-link" href="https://segment.com/docs/connections/sources/catalog/libraries/website/javascript/" target="_blank" rel="noreferrer">analytics.js</a>) at that time.</p><img src="https://cdn.uc.assets.prezly.com/0af89af9-f94b-47b1-afa8-0a79403c6d28/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption>same calls in analytics.js standard</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">The analytics library (<a class="prezly-slate-link" href="https://github.com/segmentio/analytics.js/" target="_blank" rel="noreferrer">available in open-source</a>) will translate that payload into the format your integrations require. </p><h2>Pick good event names</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Install a consistent naming scheme for your events. We stick with the following rules:</p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Human Readable</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Split words by spaces</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">[Entity] [Action]</span></li></ul><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Which leads to events like:</p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Recipient Added</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Story Published</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Story Removed</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Contact Tag Applied</span></li></ul><h2>Don&#x27;t use event names if you can use event traits</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Regardless of which integrations you have enabled there is always a limit on the number of events you can use. <a class="prezly-slate-link" href="https://www.intercom.com/help/en/articles/5245634-event-limits-troubleshooting-and-f-a-q" target="_self">Intercom has a default limit of 120 events</a> so at some point you&#x27;re going to hit limits.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">That&#x27;s why you&#x27;ll find yourself balancing when to use a dedicated event vs adding more context in the tracking payload.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">An example:</p><img src="https://cdn.uc.assets.prezly.com/2180aa34-2f32-4b0a-847b-2afce98a3875/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption>Dedicated Events vs Tracking Properties</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">But that decision also depends on which integrations you have enabled. While Intercom only allows setting up automation based on the event name, other tools like Customer.io are much more powerful.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Mixpanel allows you to use that tracking payload to <a class="prezly-slate-link" href="https://help.mixpanel.com/hc/en-us/articles/115004562246-Combine-Events-To-Create-A-Custom-Event" target="_self">create Custom Events</a>.</p><img src="https://cdn.uc.assets.prezly.com/31d904c3-664f-4543-acc9-e55680656671/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption>Custom Events in Mixpanel</figcaption><h2>Don&#x27;t count on page() calls</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Most tracking libraries (as well as analytics.js) will start tracking data right away based on page paths or routing changes (SPA libs). That means that you immediately have interesting data to use.</p><img src="https://cdn.uc.assets.prezly.com/9d4ffdd7-7e63-478b-99bf-ecf01fcb6778/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption>Example Page() calls in Segment debugger</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">I learned that this data is oftentimes not that trustworthy or useful:</p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Route changes (changing urls) mess up historic reports</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Often lacks context (tracking properties)</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Variations of content (non-canonical pages) need extra thought</span></li></ul><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">That&#x27;s why today we&#x27;re not tracking or using any page() calls in the app anymore but rather use our own events.</p><h2>Choose tools that support group()</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Most SaaS businesses have the concept of one account that is linked multiple user accounts. When we started using product analytics all events and tracking properties could only be linked to the user entity and thus also every report was tied to a user.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">To work around this we found ourselves adding grouping tracking properties to the user analytics payload:</p><img src="https://cdn.uc.assets.prezly.com/795117ff-8d33-4eb5-ac1d-484e8f304cb6/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption>company traits going to identify()</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">These properties allowed us then to create reports for all trials` or grouping certain reports by company...</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"><strong>Introducing group()</strong></p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">There is a better way to do it and that&#x27;s using group() calls which is much more inline with most SaaS businesses` user/grouping model.</p><img src="https://cdn.uc.assets.prezly.com/a601055f-829c-4acc-b228-e6e3f87eec08/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption>Using a group() call</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">This way we&#x27;re splitting up user and company properties in their own calls:</p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><em>Identify()</em> properties → Traits/properties that belong to a user</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><em>Group()</em> properties → Tying the user to a group + traits/properties that belong to a company</span></li></ul><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">These group() calls <a class="prezly-slate-link" href="https://github.com/segmentio/analytics.js/commit/48370278ba1cd808a5f9c4ba9958e1bc843adea7" target="_self">were first introduced in 2013</a> and while most integrations have caught up make sure to double check that your integration supports group() calls. It makes product analytics so much easier!</p><h2>Mix server and client side calls</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">You can&#x27;t fully count on client side tracking calls for important reports. That is because: </p><ol class="prezly-slate-list prezly-slate-list--numbered prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Users might have ad blocking browser/extensions </span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Something might go wrong with the tracking call (CORS, network issue, JS error...)</span></li></ol><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">That&#x27;s why we&#x27;re using a mix of server side and client side calls. Important calls like &#x27;Trial Account Activated&#x27; are triggered both on the server and the client to make sure that any automations also trigger for people that don&#x27;t want tracking.</p><h2>Document your tracking schema</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">I have yet to see a company with a clean tracking plan. As time goes by people add tracking properties, rename certain traits or create events that are not named properly. What about &#x27;test&#x27; events?</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">That&#x27;s why I&#x27;d suggest creating some kind of tracking document (<a class="prezly-slate-link" href="https://help.mixpanel.com/hc/en-us/articles/360001307806-Lexicon-Overview" target="_self">Mixpanel has the tracking lexicon</a>, <a class="prezly-slate-link" href="https://segment.com/docs/protocols/tracking-plan/create/" target="_blank" rel="noreferrer">segment has tracking plans and protocols</a>) to keep track of your events and user/company traits.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Bonus points for keeping some kind of status to deprecate/clean up old events and getting everyone to use this!</p><h2>Teach your team analytics</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">For any business to embrace data driven decision-making, your team needs to understand what&#x27;s going on and be able to make better calls using data.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Here are some things I do to encourage people to use data:</p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Create a document explaining analytics at your company</span><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Include the tools (mixpanel, amplitude) they can use</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Highlight which data is where</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Link to the tracking schema</span></li></ul></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Give everyone full access to segment/analytics tools</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Set up dashboards/reports for your team and teach them how to use it</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Ask for success criteria when defining/starting projects</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Argue using Data. Participate in conversations linking to a report/chart/data to back you up.</span></li></ul><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Even if you do all of the above, it&#x27;s not a guarantee that people in the company will take data as serious as you want them to.</p><h2>Integrate tracking in your stack</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">While most analytics platforms require you to load their javascript/sdk on your page I ​ strongly recommend making the tracking components part of your build pipeline. This will bundle all analytics interactions as part of the main application and will be much more reliable. <a class="prezly-slate-link" href="https://github.com/segmentio/analytics-next/#-using-as-an-npm-package" target="_self">Analytics v2 has an npm package</a> you can import in your project.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">In combination with that, you can proxy your analytics calls. This will turn third-party tracking calls (to external domains) to a first-party XHR call similar to how most applications interact with their API making it practically impossible to block by browsers or blocking extensions.</p><hr class="prezly-slate-divider"/><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Because we&#x27;re doing an extensive feature audit I am going to write more about the different ways we use product analytics to make roadmap decisions. In absence of a subscribe box you can <a class="prezly-slate-link" href="https://twitter.com/digitalbase" target="_self">follow-me on twitter for updates</a>.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"><em>Preview image </em><a class="prezly-slate-link" href="https://unsplash.com/@isaacmsmith" target="_blank" rel="noreferrer"><em>by Isaac Smith</em></a><em> on Unsplash</em></p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"> </p></section></div>]]></description><link>undefined/10-tips-for-better-product-analytics</link><guid isPermaLink="true">undefined/10-tips-for-better-product-analytics</guid><pubDate>Thu, 17 Mar 2022 11:51:00 GMT</pubDate></item><item><title><![CDATA[Redesigning the writing & publishing experience]]></title><description><![CDATA[<link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/88a7192d-ef7f-4c5b-8921-120786942254/-/format/auto/new-button.gif"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/4a5a82c4-9055-4c59-b1b4-321504575f7b/-/resize/1200/-/format/auto/image.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/bd800a38-294a-4bfe-8625-f2ec88eaf50e/-/resize/1200/-/format/auto/image.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/ad50f44f-18ab-436f-8987-d6a866b90762/-/resize/1200/-/format/auto/image.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/c0a02e1b-fdc9-486d-bad9-826136c3ffa8/-/resize/1200/-/format/auto/image.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/5237e87d-9bf5-431f-b574-1359747e78d3/-/resize/1200/-/format/auto/image.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/f0412fc1-22fa-4e11-9afc-326d089c9055/-/resize/1200/-/format/auto/image.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/4f812949-e7d4-421f-b3d8-89a78d9589f4/-/resize/1200/-/format/auto/image.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/17aea632-9ca5-45ae-b382-2e0f688ad227/-/resize/1200/-/format/auto/image.png"/><div class="ContentRenderer_renderer__tPJbs"><section class="prezly-slate-document" data-version="0.50"><h2>The interface in which I am writing this blog post is over 5 years old and has UX issues. A quick write-up of what we&#x27;re thinking about and what we are struggling with.</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">This project can be broken up in three different components:</p><ol class="prezly-slate-list prezly-slate-list--numbered prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">The writing experience / Editor itself</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">CMS / The story editing interface</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">The publication flow</span></li></ol><h2>The editing experience</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Turns out that building a good editor in 2022 is not as easy as it sounds. While Google Docs, Dropbox Paper, Notion and Coda have their own proprietary solutions there is nothing out there that comes close to that level of quality.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">In our research, when it comes to open-source projects, there is only really <a class="prezly-slate-link" href="https://www.slatejs.org/examples/richtext" target="_self">SlateJs</a> (24k stars) and <a class="prezly-slate-link" href="https://tiptap.dev/" target="_self">TipTap</a> (14k stars) worth considering to build an experience on.</p><p><a href="https://twitter.com/digitalbase/status/1400440530610315271">Gijs Nelissen on Twitter</a></p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">I&#x27;ve wrote about this in a previous blog post:</p><p><a href="https://www.lifelog.be/create-an-editing-experience-people-love">Create an editing experience people love</a></p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">We&#x27;ve been investing in <a class="prezly-slate-link" href="https://github.com/prezly/slate" target="_self">our version of slate editor</a> and we&#x27;ve come a long way including keyboard shortcuts, a new + menu, embeds/website bookmark, auto-formatting/detection and improved text-alignment.</p><img src="https://cdn.uc.assets.prezly.com/88a7192d-ef7f-4c5b-8921-120786942254/-/format/auto/new-button.gif" alt="Image"/><figcaption>Check out the + menu or inserting bookmark functionality</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">We still have long way to go but a solid plan how to get there. Short/mid term improvements include:</p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">better linking (link to internal references)</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">improve the support for pasting from GDocs, PDF, ...</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">placeholder components</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">drag-dropping components</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">more customisation on sizing/alignment of galleries</span></li></ul><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Most best practices can be borrowed from popular editors like Coda, Google Docs, Notion and even Microsoft Word. Oh, did you know the most requested editor feature is text-justification (for the web)! 🤯</p><h2>CMS / The story editing interface</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Turns out that this is a much harder problem to solve. Here is an overview of the story editing interface for a multilingual story with 2 translations in an account that has multiple newsrooms.</p><img src="https://cdn.uc.assets.prezly.com/4a5a82c4-9055-4c59-b1b4-321504575f7b/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption>Current Editing interface - two languages and multiple newsrooms</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Although we do not have any major complaints (it&#x27;s been in use for over 5 years) and is being used 1000x per day with over 300k stories published I feel there is a lot of room for improvement.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Some of the issues we might want to address:</p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">The left sidebar draws a lot of attention taking away attention from the content</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Language settings everywhere. The sidebar has a language switcher while translations and switching translations happens in the &#x27;manage&#x27; dropdown</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Publication settings like visibility and publication date are in the left sidebar but the flow to finally publish a story is in the right top corner</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Newsroom picker is a setting but was lifted as some kind of super setting. On other pages it acts as a filter/navigation but on this page it&#x27;s a setting</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">General page canvas. The combination of the sidebar, sub-navigation and manage tab makes the interface overwhelming</span></li></ul><h2>The publication flow</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">In today&#x27;s interface the publication flow is mixed in with the rest of the settings and the writing interface. And because some of the settings (scheduling, embargo, private story) affect the publishing behaviour this comes with some confusion.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">To work around this we have introduced a &#x27;great job publishing&#x27; success modal together with dynamic labels on the main publish button.</p><img src="https://cdn.uc.assets.prezly.com/bd800a38-294a-4bfe-8625-f2ec88eaf50e/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption>Indicating what to expect</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">The more we work on the story edit and gather more information through desk research and customer interviews the more we are realizing that it might be better to break up the publication flow all together.</p><h1>We&#x27;re stuck</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">At this point I feel we&#x27;re stuck. We&#x27;ve looked at all our competitors, the best CMS systems out there and have browsed the web for inspiration.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">It feels like we&#x27;ve dug our hole too deep and are trying to solve too many things at the same time. Please send help!</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Here is a list of assets/attempts (please note that these are just random picks from a larger project including low fidelity wireframes or idea sketches)</p><img src="https://cdn.uc.assets.prezly.com/ad50f44f-18ab-436f-8987-d6a866b90762/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption>Accordeon</figcaption><img src="https://cdn.uc.assets.prezly.com/c0a02e1b-fdc9-486d-bad9-826136c3ffa8/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption>Coda Style Accordeon</figcaption><img src="https://cdn.uc.assets.prezly.com/5237e87d-9bf5-431f-b574-1359747e78d3/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption>Icon Based Navigation panel</figcaption><img src="https://cdn.uc.assets.prezly.com/f0412fc1-22fa-4e11-9afc-326d089c9055/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption>Fixed menu - Toggle Right</figcaption><img src="https://cdn.uc.assets.prezly.com/4f812949-e7d4-421f-b3d8-89a78d9589f4/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption>Different variations of the sidebar</figcaption><img src="https://cdn.uc.assets.prezly.com/17aea632-9ca5-45ae-b382-2e0f688ad227/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption>More sidebar variations</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"> </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"> </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"> </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"> </p></section></div>]]></description><link>undefined/redesigning-the-writing--publishing-experience-tcdet7</link><guid isPermaLink="true">undefined/redesigning-the-writing--publishing-experience-tcdet7</guid><pubDate>Thu, 10 Feb 2022 17:59:00 GMT</pubDate></item><item><title><![CDATA[How Prezly Uses Prezly to run Prezly]]></title><description><![CDATA[<link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/c8ae11f1-a8aa-4b12-b592-1680cf8b0a1b/-/resize/1200/-/format/auto/image.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/0d341e5e-11f9-4bd6-a2b3-510fc27ce4b0/-/resize/1200/-/format/auto/image.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/0f6e6892-7e74-42a4-9b0d-5d5039bce499/-/resize/1200/-/format/auto/image.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/260369a9-9de5-4eff-a81b-140175a49b8e/-/resize/1200/-/format/auto/image.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/ce6e33e0-5718-4e38-abb3-7a245957e1aa/-/format/auto/send_help.gif"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/3dd8632e-e05e-403c-bed0-0dc171af559e/-/resize/1200/-/format/auto/image.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/50066783-f311-4771-8f1e-bff56d9584bd/-/resize/1200/-/format/auto/image.png"/><div class="ContentRenderer_renderer__tPJbs"><section class="prezly-slate-document" data-version="0.50"><h2> </h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">I&#x27;ve been thinking for a while that I needed to document the different ways we use Prezly to run Prezly. Browsing twitter today I saw Peter Suhm started <a class="prezly-slate-link" href="https://www.reform.app/blog/dogfooding/" target="_self">a great trend.</a></p><p><a href="https://twitter.com/petersuhm/status/1486326156836098052">Peter Suhm on Twitter</a></p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">So figured it was time for me to do the same. Let&#x27;s go!</p><h1>#1 We send our customer newsletters through Prezly</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Every month we send out a wrap-up of what&#x27;s going on with Prezly. The entire content of the newsletter is added to the body of the email while they are published <a class="prezly-slate-link" href="https://www.prezly.com/help/best-practices/prezly-roundup" target="_self">in the help section.</a></p><img src="https://cdn.uc.assets.prezly.com/c8ae11f1-a8aa-4b12-b592-1680cf8b0a1b/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption>Prezly roundup help section</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">The goal of this monthly newsletter is to let our customers and prospects know what we&#x27;ve been working on together with some quick tips and pointers on where they read more.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Throughout the website, there are a number of subscription forms, together with the trial sign-up those email addresses are going to our accounts contact database and labelled with the &#x27;newsletter&#x27; tag.</p><h1>#2 The changelog is powered by Prezly</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Within Prezly we have a dedicated &#x27;changes&#x27; newsroom that is updated every time we change something worthwhile in the product. That content is then going to 3 places:</p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Our website <a class="prezly-slate-link" href="https://www.prezly.com/changelog" target="_self">/changelog</a></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Within the app on /changelog (different UI, see screenshot)</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Reminder (small icon) there is something to read in the notification centre</span></li></ul><img src="https://cdn.uc.assets.prezly.com/0d341e5e-11f9-4bd6-a2b3-510fc27ce4b0/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption>Prezly in-app changelog</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">As we continuously change the app and make minor changes it&#x27;s important our staff and customers are informed about what&#x27;s new. </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"><em>Note</em>: this page is mainly accessed by power users that spend significant time in the app. Similar to how I&#x27;m personally reading everything the @linear team <a class="prezly-slate-link" href="https://linear.app/changelog" target="_self">posts in their changelog</a>.</p><h1>#3 Most parts of the website are powered by Prezly</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">One of the goals was &#x27;drink our own champagne&#x27; (a better version of eat our own dog food). This is because it&#x27;s the only way we encourage Prezlians to use our own content editing tools (the editor).</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">How we did this might become a little technical so feel free to skip this part:</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">The website is nextjs powered by Contentful headless CMS. This allows us to build complex pages composed of different components and UI elements. Not something we do at Prezly.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">But we did want some content-heavy pages (/academy, /news, and /help) to be written/maintained from Prezly. That&#x27;s why we came up with a hybrid approach where we have 3 newsrooms in Prezly:</p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">/academy → <a class="prezly-slate-link" href="https://www.prezly.com/academy" target="_self">www.prezly.com/academy</a></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">/help → <a class="prezly-slate-link" href="https://www.prezly.com/help" target="_self">www.prezly.com/help</a></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">/news → <a class="prezly-slate-link" href="https://www.prezly.com/news" target="_self">www.prezly.com/news</a></span></li></ul><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">These newsrooms hold all the content the make up this website and are pushed to contentful in their own content type (PrezlyStory and PrezlyCategory) on every update. Using the <a class="prezly-slate-link" href="https://github.com/prezly/content-renderer-react-js" target="_self">PrezlyContentRendererReact</a> we then turn these articles into beautiful pages like this example.</p><img src="https://cdn.uc.assets.prezly.com/0f6e6892-7e74-42a4-9b0d-5d5039bce499/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption>Outdated flow diagram of syncing code from Prezly to contentful</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">The advantage of this approach is that everyone in Prezly (customer success, marketing, product people, ...) needs to work with the Prezly editor/CMS at least a few times per week.</p><img src="https://cdn.uc.assets.prezly.com/260369a9-9de5-4eff-a81b-140175a49b8e/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption>From left to right: academy, help section, /news</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Additionally, we can use Prezly articles in newsletters, sales follow-up and pitches as they are all sent from Prezly too (see #4)</p><h1>#4 Sales follow-up and outreach</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">We try to make sure that all stakeholders (Prezlians, family/friends, alumni, customers, prospects, partners) are all organised within the Prezly CRM. </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">This allows us to send updates all from the same platform. Because most of the content is already in Prezly (see #3) it&#x27;s super easy to build the content we need.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"> Some examples:</p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">after a sales demo, a customer asks to follow up with some specific articles about the product</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">preparing a customer review we notice they are using feature X or Y wrong</span></li></ul><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Here is a quick recording of what that flow looks like with everything being in the same system:</p><img src="https://cdn.uc.assets.prezly.com/ce6e33e0-5718-4e38-abb3-7a245957e1aa/-/format/auto/send_help.gif" alt="Image"/><figcaption>Using Prezly to follow-up with content</figcaption><h1>#5 Internal Communication - Heartbeat</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">For any major team announcements, we use what we call &#x27;heartbeat&#x27;. It&#x27;s a secured newsroom (need to sign in with Google Auth) that has a timeline (the heartbeat) of everything that is important to know.</p><img src="https://cdn.uc.assets.prezly.com/3dd8632e-e05e-403c-bed0-0dc171af559e/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption>Heartbeat - Current Homepage</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Oftentimes we also set up an email campaign notifying people of that update and copy-paste the URL in Slack. </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">A nice addition we added to heartbeat is a way to comment/start a conversation (<a class="prezly-slate-link" href="https://www.discourse.org/" target="_self">in discourse</a>) around every post. That conversation is then embedded below the heartbeat story and available on discourse (slow/thoughtful conversation).</p><img src="https://cdn.uc.assets.prezly.com/50066783-f311-4771-8f1e-bff56d9584bd/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption> </figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"> </p><h1>#5 This blog</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">This blog is powered by our own product. Although the frontend (NextJs, Vercel hosting) is entirely disconnected from the the CMS it is being used as a headless CMS.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">I&#x27;ve <a class="prezly-slate-link" href="https://www.lifelog.be/how-i-built-this-blog" target="_self">written about how I build this blog before.</a> (<a class="prezly-slate-link" href="https://www.lifelog.be/new-blog-theme" target="_blank" rel="noreferrer">Switched to a new theme later</a>). </p><hr class="prezly-slate-divider"/><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Those are the main ways we use Prezly at Prezly. As Peter mentioned, it would be great if other product people wrote a similar post about their own products. I&#x27;ll make sure to keep a list here:</p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.reform.app/blog/dogfooding/" target="_self">How Reform uses Reform</a></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.lifelog.be/how-prezly-uses-prezly-to-run-prezly" target="_self">How Prezly uses Prezly</a></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.debugbear.com/blog/dogfooding" target="_self">How DebugBear uses DebugBear to run DebugBear</a></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://zipmessage.com/dogfooding-zipmessage" target="_self">How ZipMessage Uses ZipMessage to run ZipMessage</a></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.eduflow.com/blog/how-eduflow-uses-eduflow-to-run-eduflow" target="_self">How Eduflow uses Eduflow to run Eduflow</a></span></li></ul><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Thanks for reading along! 🙏 And kudos <a class="prezly-slate-link" href="https://twitter.com/petersuhm" target="_self">to Peter</a> for the great initiative!</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"> </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"> </p></section></div>]]></description><link>undefined/how-prezly-uses-prezly-to-run-prezly</link><guid isPermaLink="true">undefined/how-prezly-uses-prezly-to-run-prezly</guid><pubDate>Wed, 26 Jan 2022 15:40:00 GMT</pubDate></item><item><title><![CDATA[Account Sharing and Free Coca-Cola Refills]]></title><description><![CDATA[<div class="ContentRenderer_renderer__tPJbs"><section class="prezly-slate-document" data-version="0.50"><h2> </h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">You know how you have one Netflix account shared within your immediate family, a few colleagues, that couple you met on holiday and your family physician? So, that&#x27;s called <strong>account sharing</strong>. We&#x27;ve all done it at one point or another, and by and large, most people see it as a victimless crime since the only ones put out by it are big, faceless corporations who make too much money and probably test their products on puppies or babies or something equally defenseless and small.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">The thing is, it&#x27;s been happening at Prezly in some form for about as long as Prezly has existed, and we haven&#x27;t tested anything on a puppy in years. Even so, the problem has never been huge.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">So why do we care now?</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Earlier this year, <a class="prezly-slate-link" href="https://www.prezly.com/news/now-you-can-start-using-prezly-for-less" target="_self">we changed our pricing model</a> to scrap the user minimum and instead price each subscription per user, with the option to pay more if you want extra features like additional newsrooms. This meant that our cheapest plan went from €240 to just €40 per month. It also meant that bootstrapped startups and one-person NGO teams could use the same tools as the biggest agencies and enterprise powerhouses. We counted that as a win 🎉</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">But even with subscriptions stripped back to about a third of what they had been, account sharing went up. People will always try to lower the price; it&#x27;s in our nature.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Why pay for three seats when you can get one and share the login?</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Honestly, we often look the other way if there are only a couple of people involved, or if the activity is limited. I get the feeling that many companies do the same. There&#x27;s no way the people at Netflix buy that the members of my household habitually travel between Leuven, Brussels, London, New York and the Hague.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">But even if the cost of lost subscriptions isn&#x27;t that high in the grand scheme of things – Prezly has been generating a healthy revenue for years and continues to do so – there are ​ other hits you will take by allowing account sharing to take place: it&#x27;s harder to give support, security issues, misuse of team resources, a drop in quality for all users, and a potential loss of trust.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Let&#x27;s use an example to illustrate what I mean.</p><h1><strong>Refill your soft drink</strong></h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Walk into any McDonald&#x27;s in the US or Canada and you can get a coca-cola with the promise of free refills for the duration of your meal.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">The concept is similar to <a class="prezly-slate-link" href="https://www.prezly.com/pricing" target="_self">the pricing model we have at Prezly</a>: you pay a set amount to use our software for the month or the year, and fill the CRM with as many contacts as you like, send out however many campaigns you need to, publish all the stories you want. Endless multimedia, unlimited comms, and support are always there when you need it.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">To ensure that everyone wins, it&#x27;s generally understood that some baseline rules go unspoken.</p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">It&#x27;s ok to have a sip of your husband&#x27;s drink</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">We&#x27;ll close an eye if we see two students piggybacking on one soda to save a few $</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Minor abuse of the system is expected and factored into our numbers</span></li></ul><h2>To stretch <strong>the analogy</strong></h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">So at what point does it become too much?</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">What if it&#x27;s not a couple of friends that walk in, but a busload of tourists. They drive up to the McDonald&#x27;s, come in, take a seat – all two dozen of them – and order a single drink.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Maybe they wheel in their own barrel, surreptitiously plugging a tube into the bottom of their cup to siphon off the stream of coke until the machine&#x27;s sputtering. At which point they turn to the cashier and ask that they come to fix it, and fill it up again. So she does, while the queue of regulars stacks up, getting more and more impatient. A few walk out the door.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">The majority of people wouldn&#x27;t dream of walking into McDonald&#x27;s and doing something like that. Hell, they probably wouldn&#x27;t even pull that stunt in a Wendy&#x27;s. Online on the other hand? It&#x27;s all too easy.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Here are some anonymized stats on the account sharing we see every day:</p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">10 customers (2%) with extreme account sharing activity sometimes clocking in more than 10 simultaneous sessions within the same hour (different browsers)</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Another 10% of customers showing mild account sharing activity (3-5 simultaneous sessions)</span></li></ul><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">It is hard to put that into revenue numbers as we know not all those customers are planning to upgrade their accounts to include a seat for every team member and it&#x27;s not factoring in volume discounts, but lets try</p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><strong>5100euro/month. </strong><u>Extreme sharers</u> have an average of 6.8 simultaneous sessions which would total 68 seats. On average (throughout customer base) we&#x27;re charging about 75euro/month/seat.</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><strong>3000euro/month. </strong><u>Mild sharers</u><strong> </strong>are harder to estimate as those might be low usage seats (only used once every month). For the sake of the exercise let&#x27;s say that every mild sharing account will buy 1 extra seat (some will buy multiple, some will not)</span></li></ul><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">It&#x27;s easy to think of companies as greedy capitalists whose main ambition is to wring every cent from prospective customers. But there&#x27;s another level to it.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">For a relatively small business, particularly a bootstrapped one that cannot rely on any external investment, that missed revenue (100k/year) means we cannot hire additional developers to build out the 12345 features our existing clients have asked for. </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Perhaps more annoyingly, Prezly wasn&#x27;t intended for multiple people to use the same user account, so the practice messes up functions like conversation tracking with CRM contacts and the history of who published what story when, who sent out which pitches and campaigns, and so on – features that are absolutely core to the way Prezly functions.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">(Not to mention that it&#x27;s not exactly fair for the 88% of our clients who pay for our product according to their usage.)</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">So, clearly there&#x27;s a problem.</p><h2>So what are you going to do about it?</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Today there are about 100 people taking advantage of Prezly&#x27;s bottomless brunch system. For now, we&#x27;re approaching tackling this account sharing in tiers.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"><strong>Tier 1: The carrot 🥕</strong></p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Speak with the worst offenders, letting them know that we know they&#x27;re account sharing and informing them of the <a class="prezly-slate-link" href="https://www.prezly.com/help/getting-started/security--gdpr/account-sharing-among-teammates" target="_self">inherent risks and downsides</a> (that this is against our terms of service, that it messes up the history within their account, that it can compromise security).</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"><strong>Tier 2: The slightly inconveniencing carrot 🥕</strong></p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">If the polite nudging from tier 1 doesn&#x27;t work, we wait for our system to flag that there are too many people accessing an account simultaneously and we force a password reset. It&#x27;s easy for people to get around, but gives enough inconvenience to show that hey, we weren&#x27;t kidding about this &quot;breaking our terms of service&quot; thing. Please cut it out.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"><strong>Tier 3: The full-metal carrot 🥕</strong></p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">If those doing the account sharing continue to ignore our warnings and don&#x27;t respond to our emails to work something out in good stead, we put on our big-boy pants.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">As a last resort, we:</p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Start resetting passwords every time we see too much simultaneous activity</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Suspend their account</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Force 2FA/SSO</span></li></ul><h2>Is it working?</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Honestly? Sort of. We had the carrot conversation with a few accounts and some of them made allowances by paying for additional seats or pinky-promising not to account share again. Others were less cooperative, so we&#x27;re in the process of making a go of the tier 2 response, which is proving a bit trickier than expected. I&#x27;ll update this post with the results once we have them.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">For now, I&#x27;ll reset my Netflix account and politely mention to my aunt, colleague, and the barista at my favourite coffee shop that it might be time they get their own.</p><hr class="prezly-slate-divider"/><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"><em>I&#x27;d love to hear your perspective on this. Have you dealt with this? Do you see it as a problem? Should we just let it go? Is this all a capitalist scheme to help us fill our swimming pool with coins? </em></p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"><a class="prezly-slate-link" href="https://www.reddit.com/r/SaaS/comments/pbaied/what_do_you_do_with_account_sharers_if_price_is/" target="_self">Asked a question on Reddit about the same topic</a><br/>​<a class="prezly-slate-link" href="https://www.linkedin.com/posts/gijsnelissen_account-sharing-and-free-coca-cola-refills-activity-6836579443495047168-NaQK" target="_self">Asked network on LinkedIn (a lot of customers in my connections) the same thing</a></p><p><a href="https://twitter.com/digitalbase/status/1430512725164167173">Gijs Nelissen on Twitter</a></p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"> </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"> </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"> </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"> </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"> </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"> </p></section></div>]]></description><link>undefined/account-sharing-and-free-coca-cola-refills</link><guid isPermaLink="true">undefined/account-sharing-and-free-coca-cola-refills</guid><pubDate>Wed, 25 Aug 2021 12:34:00 GMT</pubDate></item><item><title><![CDATA[The cost to run a SaaS (with a few million $ ARR)]]></title><description><![CDATA[<div class="ContentRenderer_renderer__tPJbs"><section class="prezly-slate-document" data-version="0.50"><h2> </h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Inspired by <a class="prezly-slate-link" href="https://www.reddit.com/r/SaaS/comments/o19xcj/the_cost_to_run_my_saas/" target="_self">a great post on reddit</a> i took some time to go through the costs of running Prezly. Initially, I figured it would be a great read but at the same time, it&#x27;s a useful exercise for me to see if there are any services we can get rid of or downgrade.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Just to give you an idea of scale Prezly is a 18 person SaaS product. Fully bootstrapped (no outside capital) and serving about 500 customers globally.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"><em>Note: if you have questions/comments about this overview. Feel free to </em><a class="prezly-slate-link" href="https://www.reddit.com/r/SaaS/comments/o1x0yk/the_cost_to_run_a_saas_platform_with_a_few/" target="_self"><em>drop a comment in this reddit thread</em></a><em>.</em></p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">The summary:</p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.lifelog.be/the-cost-to-run-a-saas-with-a-few-million--arr#server-stuff-9625month" target="_self">Server Stuff</a> - <strong>9625€/month</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.lifelog.be/the-cost-to-run-a-saas-with-a-few-million--arr#developmentcidevops-1370month" target="_self">Development/CI/Devops</a> - <strong>1370€/month</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.lifelog.be/the-cost-to-run-a-saas-with-a-few-million--arr#marketing-4890month" target="_self">Marketing</a> - <strong>4890€/month</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.lifelog.be/the-cost-to-run-a-saas-with-a-few-million--arr#customer-success-2881month" target="_self">Customer Success</a> - <strong>2881€/month</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.lifelog.be/the-cost-to-run-a-saas-with-a-few-million--arr#all-company-tools-2382month" target="_self">All Company Tools</a> - <strong>2382€/month</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.lifelog.be/the-cost-to-run-a-saas-with-a-few-million--arr#adminfinanceteam-1303month" target="_self">Admin/Finance/Team</a> - <strong>1303€/month</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><strong>Total = 22451€/month</strong></span></li></ul><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">If you break that down by the number of staff we&#x27;re looking at a cost of 1250<strong>€/month </strong>but this includes the server cost. Excluding server costs the tooling per staff member (excluding hardware) is around <strong>712</strong> <strong>€/month</strong></p><h2>Server Stuff - 9625€/month</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">We&#x27;re a software company so obviously, this is the main cost (outside of salaries). These are the minimal infrastructure we need to run the app.</p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://aws.amazon.com/" target="_self">Amazon Web Services</a> - Infrastructure - <strong>4000 €</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://sendgrid.com/" target="_self">Sendgrid</a> - Sending all email campaign - <strong>1300 €</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://uploadcare.com/" target="_self">Uploadcare</a> - Upload/CDN for all assets (docs, images, files) - <strong>1300 €</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.algolia.com/" target="_self">Algolia</a> - Search (in-app and on newsrooms) - <strong>900 €</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.sqreen.com/" target="_self">Sqreen</a> - Application Security - <strong>650 €</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.nylas.com/platform/connectivity" target="_self">Nylas</a> - Mail synchronisation for a mailbox feature - <strong>800 €</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.section.io/cdn-edge-compute-platform/" target="_self">Section.io</a> - Global CDN (for newsrooms) -<strong> 450 €</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://restpack.io/screenshot" target="_self">Restpack</a><a class="prezly-slate-link" href="https://restpack.io/screenshot" target="_self">.io</a> - Screenshots - <strong>90 €</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://iframely.com/" target="_self">Iframely</a> - Embed social posts/videos in newsrooms - <strong>90 €</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://zerossl.com/" target="_self">Zero SSL</a> - Certificates for customer newsrooms - <strong>45 €</strong></span></li></ul><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Without any of those tools customers would start complaining. Only AWS, Sendgrid, Uploadcare and Algolia are mission-critical. We have workarounds/failovers for all other services.</p><h2>Development/Product/Devops - 1370€/month</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">All the tools we use to do or work, collaborate and deploy. Canceling all those services would likely not break Prezly but make our work a lot more painful :-)</p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://github.com/" target="_self"><u>Github</u></a> - Version Control - <strong>360 €</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://sentry.io/welcome/" target="_self"><u>Sentry.io</u></a> - Report on bugs throughout all apps - <strong>240 €</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.atlassian.com/software/opsgenie" target="_self"><u>Opsgenie</u></a> - On-call alerts in case there is a problem - <strong>130 €</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://glockapps.com/" target="_self"><u>Glock Apps</u></a> - Monitoring Email Reputation and Deliverability - <strong>170 €</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.productboard.com/" target="_self"><u>Product Board</u></a> - Customer Feedback Management + Roadmapping - <strong>120 €</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.figma.com/" target="_self"><u>Figma</u></a> - Collaborative Design - <strong>120 €</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://stoplight.io/" target="_self"><u>Stoplight.io</u></a> - Document our API - <strong>95 €</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.namecheap.com/" target="_self"><u>Namecheap</u></a> - Domain Names - <strong>45 €</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://pritunl.com/" target="_self"><u>Pritunl</u></a> - VPN linked to our Google accounts - <strong>45 €</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.pingdom.com/" target="_self"><u>Pingdom</u></a> - Performance and Availability Monitoring - <strong>45 €</strong></span></li></ul><h2>Marketing - 4890€/month</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">We don&#x27;t have a sales team so adding up marketing/sales costs in one item</p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Paid - Directories + SEM + paid Social - <strong>1900 €</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.contentful.com/" target="_self">Contentful</a> - Headless CMS to power the website - <strong>500 €</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.segment.com" target="_self">Segment</a> - Event Tracking - <strong>850 €</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.vercel.com/" target="_self">Vercel</a> - Hosting of website + various small projects/functions - <strong>250 €</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://ahrefs.com/" target="_self">Ahrefs</a> - SEO tool, Site audit and Keyword Analysis - <strong>200 €</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.wistia.com/" target="_self">Wistia</a> - Video hosting + Soapbox - 2<strong>00 €</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://ahrefs.com/api/subscription" target="_self">Ahrefs API</a> - API to access data through API for experiments mostly - <strong>600 €</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="http://business.linkedin.com/salesnavigator" target="_self">Linkedin</a> - Sales Navigator - <strong>90 €</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.adobe.com/" target="_self">Adobe</a> - Premiere + Aftereffects License - <strong>90 €</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://calibreapp.com/" target="_self">CalibreApp</a> - Continuous Lighthouse Checks (performance and accessibility) - <strong>135 €</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.grammarly.com/" target="_self">Grammarly</a> - Spell Checking - <strong>40 €</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://restream.io/" target="_self">Restream.io</a> - Video Conference Streaming <strong>35 €</strong></span></li></ul><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">To be fair the paid cost is something that is unpredictable and much depending on how confident and aggressive we want to be on customer acquisition. There have been months where we are spending north of 50k in a single month.</p><h2>Customer Success - 2881€/month</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">We don&#x27;t have a sales team so adding up marketing/sales costs in one item</p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.intercom.com/" target="_self">Intercom</a> - Customer Support Chat - <strong>770 €</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://vitally.io/" target="_self">Vitally.io</a> - Support Team Operations - <strong>550 €</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.fullstory.com/" target="_self">Fullstory</a> - Usage/Screen recording - <strong>420 €</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.streak.com/" target="_self">Streak</a> - Customer Relationship Management (CRM) - <strong>300 €</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.customer.io" target="_self">Customer.io</a> - Newsletters, Transactional Emails and Various automation - <strong>250 €</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://aircall.io/" target="_self">Aircall.io</a> - Phone numbers + Calling - <strong>170 €</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.browserstack.com/" target="_self">BrowserStack</a> - Cross Browser Testing - ​ <strong>120 €</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.litmus.com/" target="_self">Litmus</a> - Testing Email Rendering - <strong>90 €</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://calendly.com/" target="_self">Calendly</a> - Appointment Software - <strong>80 €</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.hubspot.com/" target="_self">Hubspot</a> - Previous Customer Relationship Management (CRM) - <strong>46 €</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://chatlio.com/" target="_self">Chatlio</a> - Chat with website visitors - <strong>45 €</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.typeform.com/" target="_self">Typeform</a> - Surveying Software - <strong>40 €</strong></span></li></ul><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Intercom is expensive because we have a &#x27;client day&#x27; system where everyone in the company (all 17 of us) take on customer support for one day per week.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">I&#x27;ve been complaining about this before and have managed to bring down the cost by disabling some options and keeping intercom for chat support only.</p><p><a href="https://twitter.com/digitalbase/status/1324461575483379712">Gijs Nelissen on Twitter</a></p><h2>All Company Tools - 2382€/month</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">We don&#x27;t have a sales team so adding up marketing/sales costs in one item</p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.zoom.com/" target="_self"><u>Zoom</u></a> - Video Conferencing - <strong>550 €</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.mixpanel.com/" target="_self"><u>Mixpanel</u></a> - Product/Marketing Analytics - <strong>550 €</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://workspace.google.com/intl/nl/" target="_self"><u>Google Workspace</u></a> - Google Mail/Calendar - <strong>300 €</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.notion.so/" target="_self"><u>Notion.so</u></a> - Internal Knowledge Base - <strong>300 €</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://linear.app/" target="_self"><u>Linear.app</u></a> - Project Management Tool - <strong>170 €</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.slack.com/" target="_self"><u>Slack</u></a> - Internal Chat - <strong>140 €</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.1password.com/" target="_self"><u>1Password</u></a> - Password Management - <strong>90 €</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.discourse.org/" target="_self"><u>Discourse</u></a> - Long-form content and discussion board - <strong>180 €</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.airtable.com/" target="_self"><u>Airtable</u></a> - Better kind of spreadsheet. Used as a database for some internal apps - <strong>62 €</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://opencollective.com/" target="_self"><u>Open Collective</u></a> - Sponsoring some open-source projects - <strong>40 €</strong></span></li></ul><h2>Admin/Finance/Team - 1303€/month</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">We don&#x27;t have a sales team so adding up marketing/sales costs in one item</p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.stripe.com" target="_self">Stripe</a> - Customer Billing &amp; Subscription Management - <strong>1100 €</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://recruitee.com/" target="_self">Recruitee</a> - Job Site, Application Flow and Candidate Management - <strong>80 €</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.xero.com" target="_self">Xero</a> - Invoicing - <strong>80 €</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://dext.com/eu" target="_self">ReceiptBank</a> - Now Dext. Manage missing Receipts + OCR - <strong>25 €</strong></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://timetastic.co.uk/" target="_self">Timetastic</a> - Team Availability &amp; Holidays - <strong>18 €</strong></span></li></ul><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">--</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">I posted <a class="prezly-slate-link" href="https://www.reddit.com/r/SaaS/comments/o1x0yk/the_cost_to_run_a_saas_platform_with_a_few/" target="_self">this post on Reddit</a> and it took off 🚀. I answered a lot of questions in the reddit thread such as:</p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Best/Worst ROI tools? (very opinionated)</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Why not run Sendgrid ourselves on our own mail server?</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Should you not be spending more on marketing?</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Which tools do you use for product measurement/reporting?</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Detailed breakdown of AWS bill</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Breakdown of our Stripe subscription</span></li></ul><p><a href="https://twitter.com/chddaniel/status/1405851436315992067">🚀 Ch Daniel on Twitter</a></p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"> </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"> </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"> </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"> </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"> </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"> </p></section></div>]]></description><link>undefined/the-cost-to-run-a-saas-with-a-few-million--arr</link><guid isPermaLink="true">undefined/the-cost-to-run-a-saas-with-a-few-million--arr</guid><pubDate>Thu, 17 Jun 2021 13:10:00 GMT</pubDate></item><item><title><![CDATA[The Prezly homepage from 2010 to today]]></title><description><![CDATA[<link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/bdab4427-2b40-4b89-873a-8dc362503b8f/-/resize/1200/-/format/auto/image.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/e1210e87-f34e-46e6-b0eb-f58251ffaa38/-/resize/1200/-/format/auto/image.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/eb790891-1539-45c4-ba03-f2da523c34d5/-/resize/1200/-/format/auto/screencapture-web-archive-org-web-20121016162648-http-www-prezly-com-2021-06-07-14_30_33.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/fdd78e45-b548-4a54-858a-89e12118920c/-/resize/1200/-/format/auto/screencapture-web-archive-org-web-20130430063243-http-www-prezly-com-2021-06-07-14_33_28.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/166882f7-ed89-474e-bcee-caaead9bc236/-/resize/1200/-/format/auto/screencapture-web-archive-org-web-20141218045337-http-www-prezly-com-2021-06-07-14_36_56.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/bc472ea7-4188-4d99-9b98-634a9844e62a/-/resize/1200/-/format/auto/screencapture-web-archive-org-web-20150821165859-https-www-prezly-com-2021-06-07-14_38_34.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/6795f3e4-4319-44d3-a88e-1ae67dfbe91d/-/resize/1200/-/format/auto/screencapture-web-archive-org-web-20160322220125-https-www-prezly-com-2021-06-07-14_40_41.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/6d1539b6-84f7-45fa-9f18-52a98d71d5e6/-/resize/1200/-/format/auto/image.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/0b000cf2-6673-4988-aab8-dc7e6125fa0e/-/resize/1200/-/format/auto/image.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/d6e5556f-f784-479c-b212-ada87c335bc7/-/format/auto/homepage.gif"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/58f92716-963d-425d-a3c0-4711f94e38d6/-/resize/1200/-/format/auto/screencapture-web-archive-org-web-20200624082405-https-www-prezly-com-2021-06-07-14_53_39%20(1).png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/15c4ed09-8563-4d98-b8e1-35a7acc06ba8/-/resize/1200/-/format/auto/image.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/70dc0c86-e576-4aa8-860a-9de7cfcb0d39/-/resize/1200/-/format/auto/home%20-%20Audience.jpg"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/b37d5255-2938-43ea-9430-ca7de18e29a2/-/resize/1200/-/format/auto/Communication%20Tool%20_%20PR%20Management%20Software.png"/><div class="ContentRenderer_renderer__tPJbs"><section class="prezly-slate-document" data-version="0.50"><h2> </h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">I was scoping some changes to the website today and noticed how much better we plan and execute on changes to the website. </p><h2>2010</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">This is the first version of the homepage created by Jesse and Frederik. </p><img src="https://cdn.uc.assets.prezly.com/bdab4427-2b40-4b89-873a-8dc362503b8f/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption>www.prezly.com - 2010</figcaption><h2>2011</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">This one I remember more clearly. Frederik had read a book about &#x27;social proof&#x27; and was obsessed with adding customer faces and quotes on our marketing materials.</p><img src="https://cdn.uc.assets.prezly.com/e1210e87-f34e-46e6-b0eb-f58251ffaa38/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption>www.prezly.com - 2011</figcaption><h2>2012</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Did you say social proof? We added quotes, logos of customers using it and were experimenting the opening title</p><img src="https://cdn.uc.assets.prezly.com/eb790891-1539-45c4-ba03-f2da523c34d5/-/resize/1200/-/format/auto/screencapture-web-archive-org-web-20121016162648-http-www-prezly-com-2021-06-07-14_30_33.png" alt="Image"/><figcaption>www.prezly.com - 2012</figcaption><h2>2013</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Another revamp of the website with the first time I see Elvis Presley appear rocking it on the homepage header</p><img src="https://cdn.uc.assets.prezly.com/fdd78e45-b548-4a54-858a-89e12118920c/-/resize/1200/-/format/auto/screencapture-web-archive-org-web-20130430063243-http-www-prezly-com-2021-06-07-14_33_28.png" alt="Image"/><figcaption>www.prezly.com - ​ 2013</figcaption><h2>2014</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">This year was the first time we got rid of the blue/green combination making room for a more subtle color palette</p><img src="https://cdn.uc.assets.prezly.com/166882f7-ed89-474e-bcee-caaead9bc236/-/resize/1200/-/format/auto/screencapture-web-archive-org-web-20141218045337-http-www-prezly-com-2021-06-07-14_36_56.png" alt="Image"/><figcaption>www.prezly.com - 2014</figcaption><h2>2015</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Yet another color scheme and the first time there is a strong focus on &#x27;request a demo&#x27;.</p><img src="https://cdn.uc.assets.prezly.com/bc472ea7-4188-4d99-9b98-634a9844e62a/-/resize/1200/-/format/auto/screencapture-web-archive-org-web-20150821165859-https-www-prezly-com-2021-06-07-14_38_34.png" alt="Image"/><figcaption>www.prezly.com - 2015</figcaption><h2>2016</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">This is a variation of the 2015 design with better copy, different hero. The gray on gray block &#x27;Prezly made it effortless to set up your brand story hubs&#x27; was a poor color choice as I have trouble reading the text.</p><img src="https://cdn.uc.assets.prezly.com/6795f3e4-4319-44d3-a88e-1ae67dfbe91d/-/resize/1200/-/format/auto/screencapture-web-archive-org-web-20160322220125-https-www-prezly-com-2021-06-07-14_40_41.png" alt="Image"/><figcaption>www.prezly.com - 2016</figcaption><h2>2017 - 2018</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">This is the first time we have introduced a CMS to power the site. For the design we broke with all previous versions and started over. The result paid off. </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">The website stayed the same throughout 2018.</p><img src="https://cdn.uc.assets.prezly.com/6d1539b6-84f7-45fa-9f18-52a98d71d5e6/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption>www.prezly.com - 2017</figcaption><h2>2019</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Colors changed to a new palette. Part of this homepage was a version with quite some animations (see below)</p><img src="https://cdn.uc.assets.prezly.com/0b000cf2-6673-4988-aab8-dc7e6125fa0e/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption> </figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Part of that page was an animation displaying the 3 key areas of the product. I remember the animation as being expensive to build, broken in some browsers and most of all very CPU bound resulting in low FPS.</p><img src="https://cdn.uc.assets.prezly.com/d6e5556f-f784-479c-b212-ada87c335bc7/-/format/auto/homepage.gif" alt="Image"/><figcaption>animations on homepage</figcaption><h2>2020</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Same design framework as our current homepage. Back then it was powered <a class="prezly-slate-link" href="https://lumen.laravel.com/" target="_self">by laravel Lumen framework</a></p><img src="https://cdn.uc.assets.prezly.com/58f92716-963d-425d-a3c0-4711f94e38d6/-/resize/1200/-/format/auto/screencapture-web-archive-org-web-20200624082405-https-www-prezly-com-2021-06-07-14_53_39%20(1).png" alt="Image"/><figcaption>www.prezly.com - 2020</figcaption><h2>2021</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Earlier this year we switched <a class="prezly-slate-link" href="https://www.prezly.com/" target="_self">the website</a> to be powered by Vercels <a class="prezly-slate-link" href="https://nextjs.org/" target="_self">Next.js</a>. We swapped out the &#x27;demo request&#x27; flow to a start your free trial flow.</p><img src="https://cdn.uc.assets.prezly.com/15c4ed09-8563-4d98-b8e1-35a7acc06ba8/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption>www.prezly.com - 2021</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"> </p><h2>2022</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">We doubled down on using NextJs and Contentful for the website. In attempt to use Prezly more ourselves (<a class="prezly-slate-link" href="https://www.lifelog.be/how-prezly-uses-prezly-to-run-prezly" target="_blank" rel="noreferrer">Read How Prezly uses Prezly, to run Prezly</a>) we also integrated the /help section, the /academy and /news newsrooms.</p><img src="https://cdn.uc.assets.prezly.com/70dc0c86-e576-4aa8-860a-9de7cfcb0d39/-/resize/1200/-/format/auto/home%20-%20Audience.jpg" alt="Image"/><figcaption> </figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">We doubled down on the &#x27;Turn your fanbase into Fans&#x27; and added a homepage slider to indicate you can use Prezly for different use-cases.</p><h2>2023</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Current homepage with a stronger focus on explaining what the product does exactly together with social proof. Hero was replaced by a slider/video component that highlights the different parts of Prezly.</p><img src="https://cdn.uc.assets.prezly.com/b37d5255-2938-43ea-9430-ca7de18e29a2/-/resize/1200/-/format/auto/Communication%20Tool%20_%20PR%20Management%20Software.png" alt="Image"/><figcaption> </figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"> </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"> </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"> </p></section></div>]]></description><link>undefined/the-prezly-homepage-from-2010-to-today</link><guid isPermaLink="true">undefined/the-prezly-homepage-from-2010-to-today</guid><pubDate>Mon, 07 Jun 2021 12:58:00 GMT</pubDate></item><item><title><![CDATA[Create an editing experience people love]]></title><description><![CDATA[<link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/b0445a6e-b5d0-4c2b-9439-8a701a65bec9/-/format/auto/adding_link.gif"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/44ce61ae-41e3-480a-adac-4746bea8059c/-/format/auto/link_to_content.gif"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/c32faea1-ade2-4b9d-a99d-3c8d46a8108e/-/format/auto/editor_medium.gif"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/39dd18d9-ffe6-4b4b-bc0a-4323e196e080/-/format/auto/linear_text_image_text.gif"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/04810ee8-f974-433a-83d4-1f9e272361bb/-/resize/1200/-/format/auto/image.png"/><div class="ContentRenderer_renderer__tPJbs"><section class="prezly-slate-document" data-version="0.50"><h2> </h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Text editors are central to most online apps. While text editors used to be important for Content Management Systems (CMS), they are now an important part of many more tools such as Project Management Systems and CRM systems. Customers are rightfully more demanding when it comes to how they create content.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"><strong>But building a good editor is bloody hard</strong>. You&#x27;d expect that this is a solved problem in 2021 yet so many products have a poor writing experience. As a result, content is written off-line, using tools like Google Docs, Microsoft Word or a notes app and then pasted in an inferior editor.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">This is a post listing some recommendations for creating a more friendly web-based writing experience:</p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.lifelog.be/create-an-editing-experience-people-love#auto-save-to-prevent-lost-work" target="_self">Auto-save to avoid losing work</a></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.lifelog.be/create-an-editing-experience-people-love#awesome-linking-experience" target="_self">Awesome linking experience</a></span><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.lifelog.be/create-an-editing-experience-people-love#easily-link-to-content-in-same-cms" target="_self">Easily link to other content in the same CMS</a></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.lifelog.be/create-an-editing-experience-people-love#allow-different-types-of-links" target="_self">Allow different type of links</a></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.lifelog.be/create-an-editing-experience-people-love#highlight-and-upgrade-broken-links" target="_self">Highlight (and upgrade) broken links</a></span></li></ul></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.lifelog.be/create-an-editing-experience-people-love#use-good-typography" target="_self">Use good typography</a></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.lifelog.be/create-an-editing-experience-people-love#great-support-for-lists" target="_self">Great support for lists</a></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.lifelog.be/create-an-editing-experience-people-love#show-pasted-images-inline" target="_self">Show pasted images inline</a></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.lifelog.be/create-an-editing-experience-people-love#essential-features-done-right" target="_self">Essential features done right</a></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.lifelog.be/create-an-editing-experience-people-love#wrap-long-lines" target="_self">Wrap long lines</a></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.lifelog.be/create-an-editing-experience-people-love#make-it-fast" target="_self">Make it fast (speed/performance)</a></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.lifelog.be/create-an-editing-experience-people-love#support-text-correction-extensions" target="_self">Support text-correction extensions</a></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.lifelog.be/create-an-editing-experience-people-love#undoredo-with-shortcuts" target="_self">Undo/Redo (with shortcuts)</a></span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://www.lifelog.be/create-an-editing-experience-people-love#good-pasting-behaviour" target="_self">Good pasting behaviour</a></span></li></ul><hr class="prezly-slate-divider"/><h1>Auto-Save to prevent lost work</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">If we want to get people away from the &#x27;traditional&#x27; editors we need to protect people from losing their work. No internet connection when you hit save? Browser crash?</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">I can guarantee you that the author will never use your editor the same way ever again if they lost an hour of their work.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Online editors should invest in techniques to make sure this does not happen, the technology is out there. Some ideas:</p><ol class="prezly-slate-list prezly-slate-list--numbered prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Browser Local Storage (client-side)</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Auto-saving in the background (server-side)</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Versioning content (server-side)</span></li></ol><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Option #2 is the option most web apps will pursue but for CMS systems that allow publishing content, it comes with another challenge which is to know which content has been published which is where option #2 comes in.</p><h1>Awesome linking experience</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Most WYSIWYG editors have ported the Microsoft word linking behaviour to their online counterparts. We&#x27;re so used to applying a link to an element:</p><img src="https://cdn.uc.assets.prezly.com/b0445a6e-b5d0-4c2b-9439-8a701a65bec9/-/format/auto/adding_link.gif" alt="Image"/><figcaption>Adding link in gmail</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">This is a missed opportunity with two big area&#x27;s of improvement:</p><h2>Easily link to content in same CMS</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Most blog posts refer to previous posts or paragraphs. Forcing editors to visit their blog, find the URL/anchor and paste it as a link is such a waste of time.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">A few exceptions (Google Docs, Notion) are helping writers to browse/search for other content but I&#x27;m disappointed every time I have to open a new tab to find the URL for something I want to link.</p><img src="https://cdn.uc.assets.prezly.com/44ce61ae-41e3-480a-adac-4746bea8059c/-/format/auto/link_to_content.gif" alt="Image"/><figcaption>Notion helps with linking to other pages</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">ℹ ​ Bonus points for the ability to link to anchors which I think only Google Docs can do (only within the same document).</p><h2>Allow different types of links</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">A link used to be a few underlined words pointing to an external page. In 2021 there are so many more ways to present links (cards, embeds).</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Editors could help with &#x27;upgrading&#x27; links to an embed or card. Preferably the editor has the ability to specify how the link is displayed.</p><h2>Highlight (and upgrade) broken links</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">The web is filled with broken links 😵 Make sure the editor indicates broken links by checking the page in the background and hinting at the status (status code).</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">While you&#x27;re at it how about improving/fixing the link? If the server replies with a 302 redirect (for example from http:// to https://) update the link without asking the editor. It does make the web a better place!</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">ℹ ​ Personally, I prefer not to see the schema in any link. If a user pastes https://www.lifelog.be in your editor you&#x27;d like to see it auto-link that phrase to the webpage and at the same time change the link text (or label) to www.lifelog.be.</p><h1>Use good typography</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Many online editors use weird fonts and font sizes. ​ No content creator is going to spend an hour writing content in an editor that makes them squint.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Readability is a big problem on the web with <a class="prezly-slate-link" href="https://usability.yale.edu/web-accessibility/articles/readability" target="_self">many</a> <a class="prezly-slate-link" href="https://readable.com/" target="_self">initiatives</a> and <a class="prezly-slate-link" href="https://www.smashingmagazine.com/2009/03/10-principles-for-readable-web-typography/" target="_self">resources</a> to solve that. Learn about the best practices in those projects and apply them to your editor.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">The example to follow here is Medium.com where the editing experience equals the reading experience. </p><img src="https://cdn.uc.assets.prezly.com/c32faea1-ade2-4b9d-a99d-3c8d46a8108e/-/format/auto/editor_medium.gif" alt="Image"/><figcaption>Editing in medium.com is like reading</figcaption><h1>Great support for lists</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">People use lists. A lot. Make sure your editor has good support for it. A list 😎of suggestions:</p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">support hitting tab to indent lists</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">auto-detect lists once a person starts a few (or one line) with -</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">allow nested lists</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">shift+tab should decrease indenting</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">think about how people &#x27;exit&#x27; the list (enter+enter?)</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">allow people to convert lists from bullets into numbers</span></li></ul><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Writing this piece in Bear reminds me how important the support for lists really is.</p><h1>Show pasted images inline</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">While initially, only some editors allowed you to attach images to your posts it&#x27;s 2021. People do text -&gt; image -&gt; text. </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Regardless if one is writing an article on a blogging platform, sharing feedback on a design in a project management platform or updating an internal document in your intranet please support pasting images!</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">The ideal flow is that while writing the text you can just hit paste to add an image from the clipboard. Please don&#x27;t attach it at the bottom of the post (I&#x27;m not drafting an email) but add it wherever the cursor is.</p><img src="https://cdn.uc.assets.prezly.com/39dd18d9-ffe6-4b4b-bc0a-4323e196e080/-/format/auto/linear_text_image_text.gif" alt="Image"/><figcaption>Pasting an image in a Linear comment</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">ℹ ​ Bonus points for auto-sizing/optimising the image or allowing controls for the editor to size/align the image</p><h1>Essential Features done right</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">All the power features you have added to your editor (image wrapping, code editing, advanced text styles or colour picker) do not mean anything if you have not nailed the basics.</p><img src="https://cdn.uc.assets.prezly.com/04810ee8-f974-433a-83d4-1f9e272361bb/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption> </figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Seriously, I don&#x27;t need font colours or backgrounds if I can&#x27;t paste an image inline. Start with the basics before you spend time on the advanced stuff. </p><h1>Wrap long lines</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">There has been <a class="prezly-slate-link" href="https://baymard.com/blog/line-length-readability" target="_self">plenty</a> <a class="prezly-slate-link" href="https://www.amazon.com/Elements-Typographic-Style-Robert-Bringhurst/dp/0881792063/&amp;tag=jounce-20" target="_self">of</a> <a class="prezly-slate-link" href="https://www.smashingmagazine.com/2014/09/balancing-line-length-font-size-responsive-web-design/" target="_self">research</a> that a line longer than 70 characters is hard to read. While this rule is well known in web readability it&#x27;s often ignored in editing experiences.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">This problem is even more noticeable with full-width (focus mode) text experiences. </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Use max-width in combination with optimised font size/typography for an editing experience that has good readability. It really does wonders.</p><h1>Make it fast</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">This should not even be here but I&#x27;m adding it anyway. If your editor is clogging up my browser window (I&#x27;m looking at you Confluence) you&#x27;ll never convince me to use your editor to do the writing.</p><p><a href="https://twitter.com/youyuxi/status/1377239367211700228">Evan You on Twitter</a></p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Spend time on performance! <a class="prezly-slate-link" href="https://twitter.com/sarthakgh/status/1365295526678265856" target="_self">Some people will take 1/10 of the features for 10x the speed</a>.</p><h1>Support text-correction extensions</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">How long did it take for <a class="prezly-slate-link" href="https://support.grammarly.com/hc/en-us/articles/115000090991-Does-Grammarly-support-Google-Docs-#:~:text=If%20you%20use%20Chrome%20as,Grammarly%20sidebar%20in%20Google%20Docs.&amp;text=To%20access%20Grammarly&#x27;s%20suggestions%2C%20open,corner%20of%20the%20browser%20window." target="_self">google docs to support Grammarly</a>?</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">There are so many good correction engines (Grammarly, slick write) out there that provide browser extensions to make sure the text correction can be done wherever you write. Surprisingly not all editors support those extensions forcing you to copy/paste your text into Grammarly just to do text corrections 🤯</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Also, please don&#x27;t try to build text correction yourself (maybe unless you are Google) but allow existing solutions to hook into yours.</p><h1>Undo/Redo (with shortcuts)</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">For me undo/redo is <a class="prezly-slate-link" href="http://www.mattduck.com/undo-redo-text-editors.html" target="_self">a solved problem</a> and much expected in any content editor. Surprisingly there are editors that do not support undoing.</p><h1>Good pasting behaviour</h1><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Following the suggestions in this post is not a guarantee that people will stop pasting stuff. Spend time on figuring out what/how they are pasting and make sure it works well. </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">In our case, we triggered a survey the first time we detected a paste from an unknown source (weird formatting or elements). In that survey, we asked the user where they were pasting from and questions around why they didn&#x27;t write in Prezly in the first place.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Results of this survey were then used to help us figure out which pasting behaviour (from which source) we needed to prioritise.</p><hr class="prezly-slate-divider"/><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Word has been around for a long time. It&#x27;s unlikely that the tips in this post would mean people trust your editor to be 1:1 alternative. Like it or not, MS Word will continue to be an enormous force behind the content that finds its way online.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">However, it&#x27;s also true that a lot of online editors <u>are super annoying to content authors</u>. While some platforms have a great tech stack and are growing rapidly they oftentimes have poor experience for long writing sessions. So it&#x27;s little surprise authors actively avoid them to perform their writing.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Maybe this post is one step in the right direction</p></section></div>]]></description><link>undefined/create-an-editing-experience-people-love</link><guid isPermaLink="true">undefined/create-an-editing-experience-people-love</guid><pubDate>Wed, 02 Jun 2021 15:27:00 GMT</pubDate></item><item><title><![CDATA[How I built this blog]]></title><description><![CDATA[<link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/5238e523-4c7e-43ee-a75d-1c2583a713b2/-/resize/1200/-/format/auto/image.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/8848de10-4e01-40c4-8d3f-877658f34657/-/resize/1200/-/format/auto/image.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/6fbd15b1-9bd2-439e-a03b-6a581e34b172/-/resize/1200/-/format/auto/image.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/a4a1d679-7445-4db3-a5ff-4c616c72159f/-/resize/1200/-/format/auto/Untitled.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/3cf98759-8f87-4ecd-a1fe-59b32ee8432e/-/resize/1200/-/format/auto/image.png"/><link rel="preload" as="image" href="https://cdn.uc.assets.prezly.com/f3360c35-de27-4c19-a40a-a1b5fb50946b/-/resize/1200/-/format/auto/image.png"/><div class="ContentRenderer_renderer__tPJbs"><section class="prezly-slate-document" data-version="0.50"><h2> </h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">In this article, I am going to break down how this blog works. When I started this project my main requirements were 1) developer experience, 2) performance and 3) simplicity.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"><strong>Update July 2022: </strong><a class="prezly-slate-link" href="https://www.lifelog.be/new-blog-theme" target="_blank" rel="noreferrer"><strong>New blog theme</strong></a></p><h2>The stack</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">This blog is a <a class="prezly-slate-link" href="https://nextjs.org/" target="_self">Next.js</a> application that is pulling in content from the Prezly CMS. </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Using Next, <a class="prezly-slate-link" href="https://nextjs.org/docs/basic-features/pages#two-forms-of-pre-rendering" target="_self">you have a few options</a> when it comes to page rendering: “on-demand” (server-side rendering) or ahead of time (static site generation). I&#x27;ve opted to build all the pages posts ahead of time when the site is generated (so on every deployment).</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">The site is deployed on <a class="prezly-slate-link" href="https://vercel.com/" target="_self">Vercel</a> (the company behind Next). The developer experience is awesome where it auto deploys the blog on every commit/merge to main.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"> </p><img src="https://cdn.uc.assets.prezly.com/5238e523-4c7e-43ee-a75d-1c2583a713b2/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption>Vercel Dashboard</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">For analytics I decided to use <a class="prezly-slate-link" href="https://plausible.io/" target="_self">Plausible Analytics</a> which took me 3 lines of code to set-up:</p><h2>Content/CMS/Deployment</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">This all started as a big experiment while I was trying to figure out what we needed to do <a class="prezly-slate-link" href="https://www.prezly.com/news/announcing-open-newsroom-themes" target="_self">to make Prezly more developer-friendly</a>. By trying to power an (external) blog with content written within the Prezly editor it would allow me to identify the parts of the chain that need more attention.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Every time I create or write a story in Prezly it triggers a Vercel webhook which in its turn generates+deploys the site. </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"> </p><img src="https://cdn.uc.assets.prezly.com/8848de10-4e01-40c4-8d3f-877658f34657/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption>Edit -&gt; Webhook -&gt; Deploy</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Because of the limited number of blog posts the rebuild takes less than a minute:</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"> </p><img src="https://cdn.uc.assets.prezly.com/6fbd15b1-9bd2-439e-a03b-6a581e34b172/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption>Building blog (51 seconds)</figcaption><h2>Story Renderer</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">The Prezly editor stores content in a rich text format (and not HTML). This is a common practice in today&#x27;s Content Management Systems as this allows for more flexibility when it comes to the rendering and management of that content. There <a class="prezly-slate-link" href="https://github.com/bustle/mobiledoc-kit/blob/master/MOBILEDOC.md" target="_self">is even a standard for it.</a></p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"><a class="prezly-slate-link" href="https://arpitonline.com/2018/12/10/on-rich-text-editors/" target="_self">Here is a great article</a> (2018) about the benefit of rich content types.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"> </p><p><a href="https://arpitonline.com/2018/12/10/on-rich-text-editors/">On Rich Text Editors</a></p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">In Prezly&#x27;s case, it means that content you write in a SlateJS powered editor is stored as a JSON object in our data store. That raw content object is fetchable through the API and we provide a renderer to then turn it into HTML.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">So take this example content in Prezly:</p><img src="https://cdn.uc.assets.prezly.com/a4a1d679-7445-4db3-a5ff-4c616c72159f/-/resize/1200/-/format/auto/Untitled.png" alt="Image"/><figcaption>Example content (email campaign in Prezly)</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">The content (starting from hi %contact.firstname%) will be stored JSON:</p><p><a href="https://gist.github.com/digitalbase/116cb697b2a1b1dceec302230d23036d">Github Gist: <!-- -->Example email campaign (slateJS)</a></p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">As we&#x27;re using <a class="prezly-slate-link" href="https://docs.slatejs.org/" target="_self">SlateJS</a> as an editor you can read more about <a class="prezly-slate-link" href="https://docs.slatejs.org/concepts/02-nodes" target="_self">the content structure</a> (not mobile doc) in their help article. Using the <a class="prezly-slate-link" href="https://www.npmjs.com/package/@prezly/slate-renderer" target="_self">Prezly provided slate renderer</a> the code that turns this JSON object into the HTML you are reading right now looks like this:</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">https://github.com/digitalbase/lifelog.be/blob/main/components/Article/Article.tsx#L36-L40</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">How content is rendered can be customised by feeding options into the renderer which I had to use to display code snippets (see below).</p><h2>Other Pages</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">For other pages such as the home page, the list of blog posts and sitemap I used the Prezly Node SDK to do some very simple API fetching.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">For example, the home page that lists the latest 3 articles (<a class="prezly-slate-link" href="https://github.com/digitalbase/lifelog.be/blob/main/pages/index.tsx" target="_self">source code</a>):</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">https://github.com/digitalbase/lifelog.be/blob/main/pages/index.tsx#L32-L42</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Which by itself is just a simple wrapper to list content</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">https://github.com/digitalbase/lifelog.be/blob/fbb7d1d2fb56f0f2369b50e4606f975fbf49243a/src/providers/prezly.ts#L40-L63</p><h2>Embedding Code Snippets</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">The Prezly supports embeds by making use of <a class="prezly-slate-link" href="https://iframely.com/" target="_self">Iframely</a> which natively supports github embeds (see JSON sample above). But if you have a lot of code to show off copy-pasting code into secret Github gists is cumbersome. </p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">So I wanted to be able to show off code in a github repo or branch and Googling a solution for this got me to emgithub.com which looks to be exactly what I wanted.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Integrating the embed code in within the project was pretty clunky (dangerouslySetInnerHtml, embed.js being calls numberous times, ...) so decided to extract the code. Actually, <a class="prezly-slate-link" href="https://github.com/digitalbase/lifelog.be/pulls?q=is%3Apr+is%3Aclosed" target="_self">my colleague did it for me</a>.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">https://github.com/digitalbase/lifelog.be/blob/main/components/GithubSnippet/GithubSnippet.tsx</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">So what the code is doing:</p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">fetching the raw github code (client side) using https://raw.githubusercontent.com</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">use &#x27;<a class="prezly-slate-link" href="https://github.com/react-syntax-highlighter/react-syntax-highlighter" target="_self">react-syntax-highlighter</a>&#x27; to show a code pane</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">add &#x27;view raw&#x27; and &#x27;copy to clipboard&#x27; functionality. <a class="prezly-slate-link" href="https://stackoverflow.com/questions/400212/how-do-i-copy-to-the-clipboard-in-javascript" target="_self">Stole from stackoverflow</a></span></li></ul><img src="https://cdn.uc.assets.prezly.com/3cf98759-8f87-4ecd-a1fe-59b32ee8432e/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption>My browser fetching the code snippets on this page</figcaption><h2>Styling</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">When it comes to styling I think I overdid it. I decided to use <a class="prezly-slate-link" href="https://chakra-ui.com/" target="_self">ChakraUI</a> (as an experiment) but in the meanwhile I have been playing around with TailwindCSS (and more <a class="prezly-slate-link" href="https://blog.tailwindcss.com/just-in-time-the-next-generation-of-tailwind-css" target="_self">specifically with Just in Time generation</a>). Now I want to throw out ChakraUI and switch to vanilla tailwind.</p><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">There are some upsides to using ChakraUI. For example, <a class="prezly-slate-link" href="https://github.com/digitalbase/lifelog.be/blob/main/components/Hero/Hero.tsx" target="_self">check out the source code</a> for this hero component on the homepage:</p><img src="https://cdn.uc.assets.prezly.com/f3360c35-de27-4c19-a40a-a1b5fb50946b/-/resize/1200/-/format/auto/image.png" alt="Image"/><figcaption>Hero component on homepage</figcaption><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">Overall I feel using Chakra forced me to learn another syntax/way of doing things and I might be better off investing this time in properly learning TailwindCSS which can do the same stuff anyway.</p><h2>Todo list</h2><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit">A list of things I want to do with the blog</p><ul class="prezly-slate-list prezly-slate-list--bulleted prezly-slate-list--align-inherit"><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text"><a class="prezly-slate-link" href="https://github.com/prezly/theme-nextjs-starter" target="_self">Use theme-starter</a> boilerplate code to fetch content</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Score better on Lighthouse Audit tools</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Allow paging from home page</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Support Search</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Implement subscribe functionality (stay updated)</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Improve SEO/meta tags</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Add RSS feed (and any other feed protocols people use)</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Get rid of ChakraUI</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Make better use of <a class="prezly-slate-link" href="https://uploadcare.com/" target="_self">Uploadcare.com</a> (using <a class="prezly-slate-link" href="https://www.npmjs.com/package/@prezly/uploadcare-image" target="_self">uploadcare-image</a>)</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Bring back sitemap.xml</span></li><li class="prezly-slate-list-item"><span class="prezly-slate-list-item-text">Fetch intro text from newsroom boilerplate (make customiseable)</span></li></ul><p class="prezly-slate-paragraph prezly-slate-paragraph--align-inherit"> </p></section></div>]]></description><link>undefined/how-i-built-this-blog</link><guid isPermaLink="true">undefined/how-i-built-this-blog</guid><pubDate>Mon, 31 May 2021 12:16:00 GMT</pubDate></item></channel></rss>