Archive for the ‘Work Life’ Category

I’m always nervous when something unexplained happens. When I couldn’t pinpoint why July’s revenue was way up I braced for the possibility that it might drop just as suddenly. Well, income rose to 1,406.88 in August, and users are up 4.7%. I’m now feeling confident this change may be permanent, and since my numbers tend to go even higher leading into the final quarter, I’m daring to hope $2,000/month may be a possibility by the end of 2018.

This month I continued to focus on user experience.

The Apache server log parsing script ended being so useful at uncovering hidden issues last month that I decided it was finally time to add unit tests and see what issues they could uncover. Unfortunately the current code base wasn’t designed with unit tests in mind. (I don’t fault my prior self, it was important to hit the ground running those initial years and get content fast to start building an audience.) I was able to add a unit test case framework for my PHP and Javascript code, and enough unit cases that I did uncover one issue in a function very rarely called. All things considered, the time spent creating the unit test framework has not paid off yet, but going forward I’ll be sure to code with unit tests cases in mind and that will ultimately lead to less time debugging. It’ll also be useful for the next major code refactoring.

I found a couple of nasty bugs.

The first major bug was an issue in the way I was calculating time, and an example of premature optimization. I was trying to be clever and it bit me. (At least the issue wasn’t in the modal window which I had been working so hard on!) The new approach is not as efficient, but the differences does not appear to be human detectable. Since the time motivation suit is so important, I made sure to have tests cases to catch any further issues.

The second bug was the result of a third party library failing silently on less than perfect input. In my opinion that is unforgivable. Imperfect input is more common than perfect input online, and it’s often easy enough to do basic sanity checking to catch most issues. It also failed for URLs that included non roman characters. Rather than try and patch it, I decided to write my own library (also with unit tests!) with new interface that’s more suited for my use case.

My plan is to avoid third party libraries wherever feasible in the future. I keep running into issues with them. Perhaps it’s an unrealistic fear, but I do worry that the licencing might change on me after I’ve become dependent on one. And then there’s the time the api was completely changed on me

July simultaneously both blew away expectations and disappointed. I earned $1355, over double of last month and well over the $1000 target I initially set for myself when starting self employment, but I also had a 10% reduction in audience size.

My initial fear about the increased revenue was the additional ad clicks was due to misclicks, unintentional clicks on ads. A bug in the new interface could move the ads too close to app buttons, causing accidental clicks. That would drive down user experience and hurt my ultimately bottom line long term. (Not to mention if Google thought ad clicks on my site were low quality they may elect not to advertise with me.) Fortunately, that does not appear to be the case. Revenue has been consistently up since the new launch. It’s up among all devices and across all apps, though Time Until saw a considerably larger increase than the other apps. I have also verified there is still a significant separation between app and ad on all major platforms.

My working hypothesis is it’s a combination of factors. Revenue up across all platforms and apps could indicate an update on Google Adsense: better ads leads to more clicks leads to more revenue. It’s also possible that with the new launch and interface tweak the html changed in a way that made the page more accessible to the google spider allowing it to choose better ads.

The new admin panel is already proving invaluable. One of the new features was a view that groups all apache messages by type – warning, error, etc – in order to make it easier to see what’s going on with the site at a glance. This has lead to the realization that visitors are using the apps in some ways I haven’t anticipated. For example, I was intending the name blender to be used with single names, like Sarah + Emily, but found some visitors were imputing multiple names, eg Emily Elizabeth + Charlotte Rose. I only detected this because the space caused a php warning message. It was technically working, but the blended names were a little wonky. The tool now handles this use case much better.

The new error log binning also helped me uncover a spelling mistake in a URL. Since it was a one character typo and I use automatic spell correcting on my 404 errors, the spelling mistake resulted in a 301 redirect message to the right URL. As a result, a human would never notice it, but it could affect web crawlers and therefore ranking & indexing.

Overall errors are down to 0.003 per user. About 80-90% of the errors are non-linking 404 File Not Found errors. This includes instances that are clearly probing to see how my site is put together, and possibly looking for vulnerabilities. (“/admin”, really? I don’t rely on security through obscurity, but at the same time I’m not going to make it that easy for you.) I’m not seeing any more message from Dreamhost about the server being unstable, but I am seeing some indication in the logs that Datayze is under heavy use and that can cause hiccups. Since I wasn’t monitoring the logs before, I don’t have a frame of reference for what’s expected given a site of this popularity. I plan to continue to monitor the situation. At least now it will be easy to switch servers should the need arise.

Finally, I launched Time Since, a companion app to Time Until.

July 8, 2018

Datayze is Two!

Two years ago I officially rebranded as Datayze, and forever changed the trajectory of my business.

Four days ago I did a major new launch, and this change could prove to be just as meaningful. Not only is the set up more professional – I can now monitor site health from my phone! but I can also do light weight debugging from the rocking chair. Productivity is up, and so is what I’m dubbing ‘developer confidence’.

This past year I’ve had six times the users, six times the revenue, and six times the page views. My Alexa rank is 127,191 surpassing the ranks of all my major competitors, and grown from 4,000 monthly users to a quarter million. It’s stunning to me that I’ve been able to maintain a near 20% month-over-month growth rate since Datayze’s launch. I remember when 600 daily users was a big deal, and crossing the threshold of 1,000 daily visitors. Then came the mornings where I’d reach for my phone as I was getting out of bed to see if Datayze had already had 1,000 visitors by 6:30am. Followed by mornings where I’d eagerly check to see if it was 3,000. Then there are the intangibles not reflected in the numbers. Datayze is having a real impact.

Working for yourself is difficult, exhausting and at times demoralizing, but also ridiculously rewarding. Revenue looks like it’s going to be way up this month, surpassing the monthly target I initially set for myself. It’s an incredible feeling. It’s taken me longer than I anticipated to get to this point as I had hoped to reach this revenue goal last year, and yet, I also never thought I could build such a popular site. (Which also says something about my revenue per user expectations.)

Growth will inevitably slow. It already is showing some signs of a slow down (though I’m still hoping that’s summer related.) I’m hoping to spend the following year diversifying more and insulating myself from seasonal patterns. Diversifying could mean a wider portfolio of apps, or multiple different revenue sources.

I also wouldn’t say no to an Alexa rank of 100,000.

Forgive me for a late update, I’ve been working crazy hours ahead of this last launch. I was desperate to get it out during the holiday week when traffic was low. So far everything looks great, but before I get into that let’s talk numbers.

In June I earned $630.34, just under $100 from March’s high. Users are down 6% overall, and down 9% from organic traffic, two numbers I’m not thrilled about. Mobile users is up 5%, while desktop is down 25% and my Alexa rank continues to inch upwards, a possible sign that summer may be keeping people away from there desktops. I’ll be keeping close tabs on the numbers this month.

Delaying the launch was outstanding issues in Time Until and Miscarriage Chart. Combined those two apps make up 66% of my traffic so they needed to work flawlessly ahead of the launch.

The primary hold up with the Miscarriage Chart had to do with my new approach to mobile. Prior to the launch I had been using PHP code to detect device type (mobile or desktop) and serve appropriate content for the screen size. The primary advantage of this approach was I could serve vastly different html per device. The drawback, however, the PHP code needed to be kept update with the ever changing device landscape. Now that tablets are becoming more common, there’s more device types and screen sizes I need to pay attention to. It was going to become unmanageable. I’m now doing the cleaner approach of using media CSS statements, but it took sometime to find a block of HTML code that could be display as desired correctly across all device sizes via CSS.

For Time Until I wanted to incorporate time selection into the datechooser modal to clean up the interface a bit. I had started this process last year and finally felt comfortable that it was bug free and wouldn’t hurt my brand. I wasn’t sure it was as intuitive as the original datepicker. This is we’re having more experience with interface design would be useful. The interface could still use a little more work – here’s where not having a UX experience is working against me – but it’s better!

The past month, and especially this past week has been crazy busy ahead of the new launch. During evening and middle of the night time feedings I’d test out my site on my phone. I’d open every app on my phone, test every possible input, including invalid ones. I’d check the site health on my new admin panel and logging bugs and issues into todoist, all from my phone. During the day I’d hammer out as many quick fixes as possible. Truth be told I’d rather have another week before the launch, as not all apps were working quite to the level I wanted, but most of the issues I was discovering existed in both my test bed, and the previous launched code already in production. I didn’t want perfect to be the enemy of good.

I was initially thinking I’d have a long night ahead of me, but I’ve been watching the admin panel and have confidence there are no major fires.

In May Datayze earned $629.09 and had -0.4% growth. I hate negative growth, even when it’s to be expected, and even when it’s a fraction of a percent. It’s strongly motivating me to get this next launch out the door.

I had an unexpected interrupt this month with GDPR. I should have been more aware of its approaching deadline than I was. I only realized I could be affected a few days before the May 25th deadline. Fortunately, I have always strived to do the right thing when it comes to privacy, and that helped make becoming compliant easier.

I don’t store any information that can be deemed unique or personally identifiable. I don’t even store passages of text supplied to the writing tools, or results of the URLs crawled by the spider which could theoretical be personal. I do store other form inputs (like age in the miscarriage tool), but not unique and not identifiable. At least in some cases, it’s not even personal. I’ve gotten a handful of emails from users indicating they were using the tool relative to someone else’ pregnancy, like a husband for his wife, or a parent excited for a grandchild. I sometimes see exploring different values, presumably to get a sense of the range of possibilities.

The main hurtle in keeping up with GDPR was that I keep traffic logs which contain ipaddresses. I stored it for website analysis to understand how users use my site and light weight personalization like ordering the apps by preference so users can find the ones they will likely want faster. I opted to go the pseodnomization route of converting the last octlet to 0, since that seems to be the internet standard approach. I’m not sure what I’ll do with regards to personalization. I’m considering dropping that feature, or using cookies.

Other than that my planned big migration is ticking along. I keep thinking my admin panel is set and then coming up with a new idea that could help monitor site health. I recently wrote a server log parsing script that buckets all errors by type and by page. I’m still geeking out over it.

In April revenue dropped to $618.01, and there was a 1.8% growth in users. Less than expected, but not alarmingly so given that we’ll be heading into the summer months soon which tend to be a time of slow down. My Alexa rank continues to climb which could be an indication that my piece of the global audience pie is still growing.

Bit by bit I’ve been able to carve out more time for Sarahsoft.

Last month I lamented not having smoke tests. I ran into a problem a few years ago when my host updated the PHP server. A function I was depending on was deprecated. As a result, one of my apps began to fail silently. Two years ago I lost 2 days after an updating a dependency changed the way the apps displayed. I’ve learned to test often, even when not updating my code. Smoke tests can automated some of that, freeing up more time for development.

At present the primary thing I’m looking for in my smoke tests is development code that slipped into production, such as code that references individual source files rather than stable build files, or specify a build file other than the current one. Although it shouldn’t effect functionality, I’m looking for code with TODOs and debugging output in production. Such conditions could be a sign that I wasn’t ready to launch the new code, and did by mistake. Maybe I forgot a task wasn’t complete, or that I needed to finish an edge case for a feature.

I haven’t gotten any more warnings about memory issues which takes some of the time pressure off. My primary goal is still moving Datayze to it’s own user account, and it’s own VM. I probably should have done this after pushing all the pending changes from the winter so that I was only working on one thing at a time. I’ve needlessly complicated things a bit for myself. Ah well, live and learn.

I have been bit by the coding bug. After last month I had the itch to get cracking again and I desperately wanted to cross stuff off my todo list. Time is still my biggest challenge, but I’m finding a little more time to carve out each week.

First, let’s dive into the numbers. March saw a 16.7% increase in users and topped out at $727.75. My goal of $1000/month feels so close! Time Until Countdown continues to be not only my most popular app, but one of my fastest growing apps as well with a 25% increase in users.

I decided to go ahead and move Datayze to the new user account on my server now, walling it off from my personal stuff. I have a number of new features to roll out, including site wide changes so I set up a “test” domain (new.datayze.com) on the new user account. It’s password protected (so don’t bother trying to visit it) while I iron out all the wrinkles. Once it’s running smoothly, I’ll change the DNS servers to they point “datayze.com” to the new location, and remove the test domain. It should be a seamless transition, but it might take a little while given the number of features I’m rolling out.

My current focus is on upgrading the admin panel so it functions more like a panel and less like a collection of scripts. There’s a work flow to the admin panel now. There’s a section for shepherding new apps from implementation to launch. I already had an analysis framework for better understanding site usage, but it was old and slow, written for a time when I had far fewer users. That’s been spruced up a bit. The biggest thing I’d like to add next is smoke tests, code that’s designed to look for issues before they arise. I check my apps periodically for speed and mobile usability issues, but it would be nice to have to be more proactive.

One potential issue I may have this month: I’m getting warnings about memory usage again. I strongly suspect a memory leak, but tech support thinks it’s this blog (sktyler.com)’s instance of WordPress. By separating Datayze to its own user account I can seamlessly push it to a separate VM. Then, assuming tech support is right, this personal blog with a handful of readers won’t negatively impact my business. Even if tech support is wrong, it’s still worth doing, especially since my goal is to build multiple Datayze-scaled sites.

My goal is to launch Datayze on the new account with all the changes in a few months. I can’t decide yet if that’s a stretch goal or not.

This past month Datayze saw a paltry 1.5% growth in users and a whopping 23% growth in revenue. I’m now up to $627.76 per month, and it was a shorter month! It’s not the $1000/month goal I had set for myself, but I am headed in the right direction.

I intended to focus on emails again this month, however I was contacted about a nasty bug in one of my web developer apps. Given the symptoms it sounded like something that could be effecting all of those apps. I have long since wondered why those apps weren’t more popular, and now I might have an explanation. Even better, the person reporting the bug appeared eager in trying the tool again when it was fixed. It was an opportunity too good to pass up. The issue was a logic mistake with an easy fix. From initial investigation and final testing of the patch was no more than an hour. I will monitor the web development section of datayze in the coming months to see how users respond.

The amount of spam I get is starting to get out of control, and I’m the biggest culprit. Whenever someone encounters a 404: file not found error on datayze, I get an email notification. If the automated script can determine what URL the visitor likely intended, I get an email notification. A corollary to getting a lot of visitors is getting a lot of notifications. Some are for meta data files I’m not currently hosting (e.g. apple-touch-icon.png). Some of those errors are for specifications I’m not using (humans.txt, ads.txt, etc). Some are probing (e.g. wp-admin.php to see if my site uses wordpress). This information is useful, but it can wait until I’m ready to sift through the logs and plan out my next update. No need to send myself a daily notification, or fifty. Instead, I’d like to only be notified in situations that are actionable and time sensitive, such as a misspelled forum referral that can’t be auto addressed.

I’ve been spending a lot of time thinking about how I want to solve problems, and the direction I want to take certain apps. I hope to find the time this coming month to start putting plans into actions.

January saw a 10% rise in audience size and a 13% drop in revenue. All total I earned $508.95, which is not to shabby given the shopping season has ended and ad clicks are typically worth less. Time Until continues to be the most popular app, and has a higher growth rate than the miscarriage apps which continues to surprise me. Overall growth was pretty uniform across all apps. The only top visited app that had a measurable (1.8%) decrease in users was the Passive Voice Detector.

There isn’t much progress to report. I had decided to stay the decision on maternity leave until Dana was born so I would have a better idea what expectations are reasonable. Now that she’s here it’s clear I need to be on a reduced work schedule while I heal. For now my work load is primarily responding to emails (January was a surprisingly busy month in that regard), fixing minor bugs, and possibly addressing critical issues if they rise to the level of interfering with revenue.

Something I need to give some thought to is how best to silo my sites. I recently was contacted by someone with a serious offer to acquire Datayze. I declined (I doubt I’d ever be interested in selling Datayze.) I do want to branch out into multiple sites and it may be worth selling off some off those other properties in the future. For that to be feasible, I need to give serious consideration to how I operate.

Currently I reuse code across my personal and professional sites. Why reinvent the wheel? The purchase agreement would need to address ownership of shared code to avoid ambiguity. A cleaner approach would be to create each site as an independent silo, with it’s own version of a wheel. I’ve already been considering moving Datayze to its own VM/instance so I don’t risk its uptime when working on my other sites. I think I may make it a policy of each website being completely self contained and running separately once they get big enough.

Last month followed the predictable pattern laid out from the previous December: strong first half of the month, abysmal second half. The majority of my December income, $588.04, was earned in the first three weeks, then everything slowed to a crawl through the holiday. Users were up 13.5%, again due to a strong first half of the month performance. This time I knew what to expect, and didn’t let my dropping numbers discourage me too much.

Overall this puts my total income for 2017 at $3,456.27. Not where it needs to be, but not to shabby, especially compared to last year. That’s about a 7x year-over-year growth. Another 7x growth would put me at ~$24,000 for the year, equivalent to minimum wage in California.

One of the neat things was watching my stats around midnight new years eve. I just happened to have my analytics page open around 9 PM PST (midnight for East Coasters) and I watched the the hits to my Time Until app climb sharply until they reached 4X normal traffic volume. I had initially designed my app to be more of a long range count down over multiple days, so I was surprised by the interest, but I’ll gladly take it! I couldn’t resist staying up to see how my apps did as midnight approached Central time, Mountain Time and Pacific time. I was sure the west coast numbers would be equally strong, but to my surprise I had far more users in the Central Time Zone.

Time Until is one of the apps that’s going to get a serious redesign in the new year. I hope my audience likes it!

Moving forward, January was the month I intended to start pushing updates again, however I’m running into challenges with my webhost. They recently made changes to their text editing tool, and now I can’t save files. I have a walk around, but I want them to fix their issue first since their editing tool has become a part of my standard work flow. There are also two other pending potential issues with the host that could throw a hiccup into any update I push, and with the pending arrival I’m wearing of doing anything that might leave the site in a bad state while I’m out of commission for a few days. We’ll see what January brings, but as of now I’m expecting minimal updates to trickle out.

Older Posts »