Right now, I’ve got my day job, some index funds, a small income from my blog (about a penny a day so far – ha!), and some knitting patterns I designed and have for sale at various sites around the internet (not surprisingly, that doesn’t bring in much either). Eventually I’d like to write an ebook, although I have no idea what the topic would be yet. I’ll keep plugging away and hopefully it’ll become clearer in the future!
The other point is that it is pretty easy to get started.  You don’t need to be super rich, and you don’t need a lot of time to get started.  To say it requires no time would be a lie, but you don’t need to make anything listed above your life.  You can work at your job, invest your excess income, save to buy a rental property or rent out a room in your current house, and you start a side job online without breaking a sweat.
It seems like common sense but it’s so easy to rely on your day job income to pay for everything. I used to get paid a lot of money to go into work and sit at my desk for 8 hours a day and then go home. No manual labor required, no staying late hours(in my case at least) and a pretty low stress environment. I loved my job and without fail, every two weeks on the dot, a nice fat paycheck would show up in my bank account. All I had to do was show up at work every day and I was pretty much guaranteed to get paid.

Overall income potential: Excellent – Although it’s very possible to make $0 with a niche site if it doesn’t receive traffic, you can also make a lot of money if you rank well for good keywords.  It’s not likely that you’ll make a living off one site, but they are generally easy to build.  If you can build one successfully, you can probably build several more.

There are a couple of problems with direct investment in real estate though. It’s expensive to buy even a single property, a minimum of tens of thousands of dollars, and there’s no way most investors can build a portfolio of different property types and in different regions to protect from those risks when you have all your money in just one or two investments.
If you need cash flow, and the dividend doesn’t meet your needs, sell a little appreciated stock. (or keep a CD ladder rolling and leave your stock alone). At the risk of repeating myself, whether you take cash out of your portfolio in the form of “rent”, dividend, interest, cap gain, laddered CD…., etc. The arithmetic doesn’t change. You are still taking cash out of your portfolio. I’m just pointing out that we shouldn’t let the tail wag the dog. IOW, the primary goal is to grow the long term value of your portfolio, after tax. Period. All other goals are secondary.
!function(e){function n(t){if(r[t])return r[t].exports;var i=r[t]={i:t,l:!1,exports:{}};return e[t].call(i.exports,i,i.exports,n),i.l=!0,i.exports}var t=window.webpackJsonp;window.webpackJsonp=function(n,r,o){for(var s,a,u=0,l=[];u1)for(var t=1;tf)return!1;if(h>c)return!1;var e=window.require.hasModule("shared/browser")&&window.require("shared/browser");return!e||!e.opera}function a(){var e=o(d);d=[],0!==e.length&&l("/ajax/log_errors_3RD_PARTY_POST",{errors:JSON.stringify(e)})}var u=t("./third_party/tracekit.js"),l=t("./shared/basicrpc.js").rpc;u.remoteFetching=!1,u.collectWindowErrors=!0,u.report.subscribe(r);var c=10,f=window.Q&&window.Q.errorSamplingRate||1,d=[],h=0,p=i(a,1e3),m=window.console&&!(window.NODE_JS&&window.UNIT_TEST);n.report=function(e){try{m&&console.error(e.stack||e),u.report(e)}catch(e){}};var w=function(e,n,t){r({name:n,message:t,source:e,stack:u.computeStackTrace.ofCaller().stack||[]}),m&&console.error(t)};n.logJsError=w.bind(null,"js"),n.logMobileJsError=w.bind(null,"mobile_js")},"./shared/globals.js":function(e,n,t){var r=t("./shared/links.js");(window.Q=window.Q||{}).openUrl=function(e,n){var t=e.href;return r.linkClicked(t,n),window.open(t).opener=null,!1}},"./shared/links.js":function(e,n){var t=[];n.onLinkClick=function(e){t.push(e)},n.linkClicked=function(e,n){for(var r=0;r>>0;if("function"!=typeof e)throw new TypeError;for(arguments.length>1&&(t=n),r=0;r>>0,r=arguments.length>=2?arguments[1]:void 0,i=0;i>>0;if(0===i)return-1;var o=+n||0;if(Math.abs(o)===Infinity&&(o=0),o>=i)return-1;for(t=Math.max(o>=0?o:i-Math.abs(o),0);t>>0;if("function"!=typeof e)throw new TypeError(e+" is not a function");for(arguments.length>1&&(t=n),r=0;r>>0;if("function"!=typeof e)throw new TypeError(e+" is not a function");for(arguments.length>1&&(t=n),r=new Array(s),i=0;i>>0;if("function"!=typeof e)throw new TypeError;for(var r=[],i=arguments.length>=2?arguments[1]:void 0,o=0;o>>0,i=0;if(2==arguments.length)n=arguments[1];else{for(;i=r)throw new TypeError("Reduce of empty array with no initial value");n=t[i++]}for(;i>>0;if(0===i)return-1;for(n=i-1,arguments.length>1&&(n=Number(arguments[1]),n!=n?n=0:0!==n&&n!=1/0&&n!=-1/0&&(n=(n>0||-1)*Math.floor(Math.abs(n)))),t=n>=0?Math.min(n,i-1):i-Math.abs(n);t>=0;t--)if(t in r&&r[t]===e)return t;return-1};t(Array.prototype,"lastIndexOf",c)}if(!Array.prototype.includes){var f=function(e){"use strict";if(null==this)throw new TypeError("Array.prototype.includes called on null or undefined");var n=Object(this),t=parseInt(n.length,10)||0;if(0===t)return!1;var r,i=parseInt(arguments[1],10)||0;i>=0?r=i:(r=t+i)<0&&(r=0);for(var o;r