Skip to main content
Business LibreTexts

2.8: Chapter 13 Maintenance

  • Page ID
    66192
  • \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)

    \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)

    \( \newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\)

    ( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\)

    \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)

    \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\)

    \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)

    \( \newcommand{\Span}{\mathrm{span}}\)

    \( \newcommand{\id}{\mathrm{id}}\)

    \( \newcommand{\Span}{\mathrm{span}}\)

    \( \newcommand{\kernel}{\mathrm{null}\,}\)

    \( \newcommand{\range}{\mathrm{range}\,}\)

    \( \newcommand{\RealPart}{\mathrm{Re}}\)

    \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\)

    \( \newcommand{\Argument}{\mathrm{Arg}}\)

    \( \newcommand{\norm}[1]{\| #1 \|}\)

    \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\)

    \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\AA}{\unicode[.8,0]{x212B}}\)

    \( \newcommand{\vectorA}[1]{\vec{#1}}      % arrow\)

    \( \newcommand{\vectorAt}[1]{\vec{\text{#1}}}      % arrow\)

    \( \newcommand{\vectorB}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)

    \( \newcommand{\vectorC}[1]{\textbf{#1}} \)

    \( \newcommand{\vectorD}[1]{\overrightarrow{#1}} \)

    \( \newcommand{\vectorDt}[1]{\overrightarrow{\text{#1}}} \)

    \( \newcommand{\vectE}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash{\mathbf {#1}}}} \)

    \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \)

    \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)

    \(\newcommand{\avec}{\mathbf a}\) \(\newcommand{\bvec}{\mathbf b}\) \(\newcommand{\cvec}{\mathbf c}\) \(\newcommand{\dvec}{\mathbf d}\) \(\newcommand{\dtil}{\widetilde{\mathbf d}}\) \(\newcommand{\evec}{\mathbf e}\) \(\newcommand{\fvec}{\mathbf f}\) \(\newcommand{\nvec}{\mathbf n}\) \(\newcommand{\pvec}{\mathbf p}\) \(\newcommand{\qvec}{\mathbf q}\) \(\newcommand{\svec}{\mathbf s}\) \(\newcommand{\tvec}{\mathbf t}\) \(\newcommand{\uvec}{\mathbf u}\) \(\newcommand{\vvec}{\mathbf v}\) \(\newcommand{\wvec}{\mathbf w}\) \(\newcommand{\xvec}{\mathbf x}\) \(\newcommand{\yvec}{\mathbf y}\) \(\newcommand{\zvec}{\mathbf z}\) \(\newcommand{\rvec}{\mathbf r}\) \(\newcommand{\mvec}{\mathbf m}\) \(\newcommand{\zerovec}{\mathbf 0}\) \(\newcommand{\onevec}{\mathbf 1}\) \(\newcommand{\real}{\mathbb R}\) \(\newcommand{\twovec}[2]{\left[\begin{array}{r}#1 \\ #2 \end{array}\right]}\) \(\newcommand{\ctwovec}[2]{\left[\begin{array}{c}#1 \\ #2 \end{array}\right]}\) \(\newcommand{\threevec}[3]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \end{array}\right]}\) \(\newcommand{\cthreevec}[3]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \end{array}\right]}\) \(\newcommand{\fourvec}[4]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \\ #4 \end{array}\right]}\) \(\newcommand{\cfourvec}[4]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \\ #4 \end{array}\right]}\) \(\newcommand{\fivevec}[5]{\left[\begin{array}{r}#1 \\ #2 \\ #3 \\ #4 \\ #5 \\ \end{array}\right]}\) \(\newcommand{\cfivevec}[5]{\left[\begin{array}{c}#1 \\ #2 \\ #3 \\ #4 \\ #5 \\ \end{array}\right]}\) \(\newcommand{\mattwo}[4]{\left[\begin{array}{rr}#1 \amp #2 \\ #3 \amp #4 \\ \end{array}\right]}\) \(\newcommand{\laspan}[1]{\text{Span}\{#1\}}\) \(\newcommand{\bcal}{\cal B}\) \(\newcommand{\ccal}{\cal C}\) \(\newcommand{\scal}{\cal S}\) \(\newcommand{\wcal}{\cal W}\) \(\newcommand{\ecal}{\cal E}\) \(\newcommand{\coords}[2]{\left\{#1\right\}_{#2}}\) \(\newcommand{\gray}[1]{\color{gray}{#1}}\) \(\newcommand{\lgray}[1]{\color{lightgray}{#1}}\) \(\newcommand{\rank}{\operatorname{rank}}\) \(\newcommand{\row}{\text{Row}}\) \(\newcommand{\col}{\text{Col}}\) \(\renewcommand{\row}{\text{Row}}\) \(\newcommand{\nul}{\text{Nul}}\) \(\newcommand{\var}{\text{Var}}\) \(\newcommand{\corr}{\text{corr}}\) \(\newcommand{\len}[1]{\left|#1\right|}\) \(\newcommand{\bbar}{\overline{\bvec}}\) \(\newcommand{\bhat}{\widehat{\bvec}}\) \(\newcommand{\bperp}{\bvec^\perp}\) \(\newcommand{\xhat}{\widehat{\xvec}}\) \(\newcommand{\vhat}{\widehat{\vvec}}\) \(\newcommand{\uhat}{\widehat{\uvec}}\) \(\newcommand{\what}{\widehat{\wvec}}\) \(\newcommand{\Sighat}{\widehat{\Sigma}}\) \(\newcommand{\lt}{<}\) \(\newcommand{\gt}{>}\) \(\newcommand{\amp}{&}\) \(\definecolor{fillinmathshade}{gray}{0.9}\)

    alt

    Maintenance

    BUILDING, IRONICALLY, IS EASIER THAN maintaining. When you build, you build for the average user, the one who passes all the tests you wrote. But if your app hits any kind of scale, there will be cases you never considered. Your app will break, and you need to have a plan for how to fix it.

    Let the maintenance games begin!

    Maintaining Toofr is my single most time-intensive activity. The application can break from user inputs, bad code pushes, and hardware outages. When that happens, I have to drop everything I’m doing and fix it. Those days are distracting at best and completely wasted at worst.

    As you add more websites to your portfolio, the maintenance needs expand as well, and there can be serious consequences. What if you have two apps crashing at once?

    Record feature requests and low-impact bugs to stay organized

    Use Trello, an online organizing tool that uses cards and lists, to maintain your roadmap, record bugs, and save new SEO ideas. It helps to have it all in one place.

    Whatever tool you use, return to it consistently. It’s very easy to lose track of priorities, especially when you add the complexity of multiple companies at once.

    The issues you find in one project foreshadow issues you’ll have on other projects. It’s a best practice to make the same improvement on all of your applications even if only one is having problems.

    The same goes for SEO strategies. It’s easy to forget, and it’s not any more mental work to make the same edit on the same file in another project. Do it and the payoffs multiply.

    Use a customer relationship management (CRM) app to keep track of prospects and customers

    Using CRM is also good data hygiene. If you ever bring a sales rep or marketer onto your team, giving them access to a database of every customer conversation you’ve had will help them get up to speed quickly and help you coach them.

    The critical feature of modern CRMs is you can give them access to your inbox. The CRM will record your customer conversations for the rest of your team to see. If you’re not comfortable with that level of access, you can also BCC an email address and have the conversations recorded. This way the CRM will only see what you want it to see.

    When you’re dealing with longer sales cycles and managing multiple conversations, a CRM is the only way to make sure you don’t drop the ball. If you tell someone you’ll get back to them in a week, you need to do that. Your CRM can remind you, show the conversation history, and track your progress to closing your next big deal.

    Schedule time each week for your projects and stick to the calendar

    Don’t let any one project fall into disrepair. You need to maintain a Trello board, spreadsheet, or some other note-taking system for each one of your projects. Focus on each one at some point every week, even when they don’t seem to need it.

    This tactic will refresh your memory on the status of the project and helps you to draw connections to that project and ideas you might read on Twitter or LinkedIn. The best way to continually innovate is to find ways to apply the insights of others to your own businesses.

    Put critical processes into a background processor and use a crash reporting system

    A background processor is a service common to web applications. You can design your application so that it throws certain processes into a queue. If the process fails due to a bug in your code or an outage from a data provider to which you’re connecting, or any other reason, the background processor will keep retrying it.

    If your background processor has a lot of retries in its queue, you can look at the logs, find the problem or bug, and fix it; and when the processor tries again, it will go through. Customers are happy because their requests aren’t lost, they’re just delayed. You don’t need to tell them to go back to a page and try again. Often they won’t know there was a problem.

    Similarly, a crash reporting system will listen to your logs for major problems and report them to you. My favorite in this category is a service called Sentry.io. It tracks application crashes, gives helpful bug reports including what line of code caused the error, and shows which users were impacted.

    Sentry covers the problems that aren’t collected in the background processor. Instead of telling every user, including unaffected users, about the problem, you can email only those who were impacted. Customers usually appreciate the proactive outreach.

    Respond to all customer support inquiries within 12 hours

    Finally, a related tactic and one that I think every solopreneur should commit to, is responding to support inquiries within 12 hours.

    Your customers are critical. Every single customer matters and responding to them promptly demonstrates that level of importance.

    It’s not hard to respond to customers immediately. I put my phone number on every email. I have a chat feature on my site that pings me directly. It can sometimes be distracting but earning a new customer or preventing a churned customer is worth it.

    To grow a business, find financial and personal freedom, and one day sell it for a huge profit, then treat every customer with respect.


    This page titled 2.8: Chapter 13 Maintenance is shared under a CC BY-NC-SA 4.0 license and was authored, remixed, and/or curated by Ryan Buckley.

    • Was this article helpful?