<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Techspeak</title>
	
	<link>http://www.plainlystated.com</link>
	<description>Work, play, &amp; projects</description>
	<lastBuildDate>Wed, 15 May 2013 16:06:27 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.5.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/plainlystated/xtwL" /><feedburner:info uri="plainlystated/xtwl" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><feedburner:emailServiceId>plainlystated/xtwL</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item>
		<title>Architectural Primitives: Inter-Datacenter Tunnels</title>
		<link>http://feedproxy.google.com/~r/plainlystated/xtwL/~3/_swWD_DbrgQ/</link>
		<comments>http://www.plainlystated.com/2013/05/architectural-primitives-inter-datacenter-tunnels/#comments</comments>
		<pubDate>Tue, 14 May 2013 20:56:38 +0000</pubDate>
		<dc:creator>Patrick Schless</dc:creator>
				<category><![CDATA[devops]]></category>
		<category><![CDATA[TempoDB]]></category>
		<category><![CDATA[architechtural primitives]]></category>
		<category><![CDATA[infrastructure]]></category>
		<category><![CDATA[routing]]></category>
		<category><![CDATA[tempodb]]></category>
		<category><![CDATA[vyatta]]></category>

		<guid isPermaLink="false">http://www.plainlystated.com/?p=628</guid>
		<description><![CDATA[(cross-posted to blog.tempo-db.com) At TempoDB, we maintain multiple environments (production, staging, etc), and each environment is in a datacenter (Dallas, Seattle, etc). For the most part, we want strict separation between environments, but we have a growing list of traffic that ought to be allowed to flow between them (see below). We designed a new <a href='http://www.plainlystated.com/2013/05/architectural-primitives-inter-datacenter-tunnels/' class='excerpt-more'>[...]</a>]]></description>
				<content:encoded><![CDATA[<p><em>(cross-posted to <a href="http://blog.tempo-db.com" title="TempoDB's blog" target="_blank">blog.tempo-db.com</a>)</em></p>
<p><a href="http://www.plainlystated.com/wp-content/uploads/2013/05/tunneling-small.png"><img src="http://www.plainlystated.com/wp-content/uploads/2013/05/tunneling-small.png" alt="tunneling-small" width="500" height="150" class="alignright size-full wp-image-643" /></a></p>
<p>At <a href="https://tempo-db.com/" title="TempoDB" target="_blank">TempoDB</a>, we maintain multiple environments (production, staging, etc), and each environment is in a datacenter (Dallas, Seattle, etc). For the most part, we want strict separation between environments, but we have a growing list of traffic that ought to be allowed to flow between them (see below). We designed a new architectural primitive which allows us to securely permit some traffic, while still blocking everything else.<span id="more-628"></span></p>
<p><strong>Business Objectives</strong><br />
Right now, each environment (production/staging) is in one datacenter (Dallas/Seattle). What we developed allows us to connect two datacenters, which means that one environment can span multiple datacenters (intra-environment tunnel) or that two datacenters from different environments can be connected (inter-environment tunnel; eg a connection between production and staging). This allows features such as:</p>
<ul>
<li>The ability to set up streaming replication (master/slave) from production to staging for both HBase and postgres</li>
<li>The ability to easily load a complete backup of production into staging, for developer load-testing (made much easier by streaming replication)</li>
<li>The ability to expand into other data centers on the SoftLayer internet backbone, in order to expose international Points of Presence (POPs). These POPs wouldn’t be full environments, but lightweight proxies that move the SSL handshake closer to the customer, and then rely on faster (but still encrypted) communication within our system</li>
</ul>
<p>Such a tunnel must satisfy a few expectations:</p>
<ul>
<li>It must provide transparent encryption to all traffic going through it</li>
<li>It must have a firewall on both ends, and disallow everything except explicitly allowed traffic</li>
<li>It must be highly available</li>
</ul>
<p><strong>OpenVPN &#038; Vyatta</strong><br />
There are a number of tunnelling options available for linux, and we went with OpenVPN because it suits our needs (everything is IP, authentication makes sense for us), it’s flexible (supports site-to-site, and remote access, which we’ll want as well), and it’s fairly standard. We also choose to use a <a href="http://www.vyatta.org/" title="Vyatta" target="_blank">Vyatta</a> rather than mix together everything we need on a standard linux box. The reason for this is complexity management; Vyatta is a linux system with a bunch of networking/routing tools that are designed to work well together, including OpenVPN, VRRP (Virtual Router Redundancy Protocol, for high availability), and stateful firewalls.</p>
<p><strong>Solution Overview</strong><br />
Below, you can see the diagram of where we ended up. Each datacenter has a pair of vyatta servers, and each pair exposes a public and a private IP (via a VIP). An encrypted openvpn tunnel is maintained between the two public vips, and it can fail-over automatically if a box goes down. There is a firewall on both ends of the pipe which specifies a short list of allowed traffic types.</p>
<p><a href="http://www.plainlystated.com/wp-content/uploads/2013/05/tunneling.png"><img src="http://www.plainlystated.com/wp-content/uploads/2013/05/tunneling.png" alt="tunneling" width="1143" height="762" class="alignright size-full wp-image-629" /></a></p>
<p><strong>Routing</strong><br />
Having the tunnel only allows the Vyatta servers to talk across the pipe. In order for other servers to make use of the connection, they have to have static routes locally which use the vyattas as a gateway for traffic bound for the other datacenter (see the above image for an example). In other words, most servers don’t know anything about the tunnel. They just know that vyatta can send data to the other datacenter. The default gateway for each server is controlled by our datacenter, otherwise we could have just put the routes there (instead of propagating them to every box). Alternatively, we could set up our vyatta cluster as the default gateway, which we may do at some point.</p>
<p><strong>High Availability</strong><br />
We use VRRP for high availability of Vyatta. The way it works is that a pair of Vyatta servers share a public and a private Virtual IP (VIP). The VIPs float (as a pair) between the two servers as appropriate (if one fails, both VIPs move, and the new master re-establishes the connection).</p>
<p><strong>Arity</strong><br />
The setup we’ve discussed and diagrammed is for connecting two datacenters, but it is likely that we’ll want multiple connections to a single datacenter. Conveniently, this doesn’t require much extra work. Using the existing router pair and the existing VIP pair, it’s just a matter of adding an extra OpenVPN config entry onto the routers. Using this strategy, there is little extra effort to go from 1 to N connections.</p>
<p><strong>What&#8217;s Next?</strong><br />
For us, an inter-datacenter tunnel is an architectural primitive which we can use in other projects. In later posts, we’ll talk about how TempoDB uses this to expand our production environment into multiple data centers (Points of Presence), as well as set up a channel between environments (streaming replication between production and staging environments).</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/plainlystated/xtwL?a=_swWD_DbrgQ:rGlxedFGLWg:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/plainlystated/xtwL?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/plainlystated/xtwL/~4/_swWD_DbrgQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.plainlystated.com/2013/05/architectural-primitives-inter-datacenter-tunnels/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.plainlystated.com/2013/05/architectural-primitives-inter-datacenter-tunnels/</feedburner:origLink></item>
		<item>
		<title>XCP (Xen) on a Mac Mini</title>
		<link>http://feedproxy.google.com/~r/plainlystated/xtwL/~3/9vhkbI90ZBI/</link>
		<comments>http://www.plainlystated.com/2013/04/xcp-xen-on-a-mac-mini/#comments</comments>
		<pubDate>Mon, 08 Apr 2013 00:46:34 +0000</pubDate>
		<dc:creator>Patrick Schless</dc:creator>
				<category><![CDATA[devops]]></category>
		<category><![CDATA[xcp]]></category>
		<category><![CDATA[xen]]></category>

		<guid isPermaLink="false">http://www.plainlystated.com/?p=607</guid>
		<description><![CDATA[I picked up a new Mac Mini this Friday to play around with Xen at home. Right now I run a few services off of one server in my apartment, but I&#8217;d prefer to have separate VMs for each service, because I find that more manageable. The platform I&#8217;m using is XCP (Xen Cloud Platform; <a href='http://www.plainlystated.com/2013/04/xcp-xen-on-a-mac-mini/' class='excerpt-more'>[...]</a>]]></description>
				<content:encoded><![CDATA[<p><img src="http://www.xen.org/images/mascot/XenPanda.jpg" width="258" height="206" class="alignright" />I picked up a new Mac Mini this Friday to play around with Xen at home. Right now I run a few services off of one server in my apartment, but I&#8217;d prefer to have separate VMs for each service, because I find that more manageable.<span id="more-607"></span></p>
<p>The platform I&#8217;m using is <a href="http://www.xen.org/products/cloudxen.html" title="XCP" target="_blank">XCP</a> (Xen Cloud Platform; an open-source <a href="http://wiki.xen.org/wiki/XCP/XenServer_Feature_Matrix" title="XCP/XenServer comparison chart" target="_blank">alternative</a> to Citrix XenServer). It requires the whole drive, so dual-booting isn&#8217;t an option (see note below: Dual Booting), which gave me problems. I could install it just fine (hold down &#8216;c&#8217; while booting to boot from CD), but on reboot I would just get a flashing file folder icon with a question mark in the middle. I finally found the solution on the <a href="https://help.ubuntu.com/community/MactelSupportTeam/AppleIntelInstallation" title="Ubuntu on Mac" target="_blank">Ubuntu docs site</a>. After installation is complete, reboot the computer and hold alt/option to get into the recovery partition (it takes a while to download the tool, presumably because they were on the partition that XCP blew away). When you get to the screen showing different options (restore from Time Machine, reinstall OSX, etc), go to Utilities > Terminal (at the top of the screen). Once in a terminal type: <code>bless --device /dev/disk0s1 --setBoot --legacy<br />
</code>. Then reboot (<code>sudo shutdown -r now</code> if you&#8217;re still in Terminal), and you should be in XCP.</p>
<p><strong>legacy</strong><br />
According to the online help (in the recovery Terminal, type &#8216;bless&#8217; without any arguments), &#8220;&#8211;legacy&#8221; isn&#8217;t actually a valid argument. I assume that this is correct, and that the Ubuntu docs are wrong/outdated. Still, I included it and Terminal didn&#8217;t complain. It probably isn&#8217;t necessary, but I didn&#8217;t test the command without it. If you try it, let me know and I&#8217;ll update the post.</p>
<p><strong>Dual Booting</strong><br />
Instead of overwriting the whole disk (and needing to &#8216;bless&#8217; it), you could try dual-booting OSX and debian/ubuntu, then installing XCP within that linux environment. According to the <a href="http://wiki.xen.org/wiki/XAPI_on_Ubuntu" title="XAPI on Ubuntu" target="_blank">docs</a>, this is &#8220;*very much* a work-in-progress&#8221; (emphasis theirs), so I wanted to avoid it. That said, I bought this computer soley for Xen, so I wasn&#8217;t interested in dual-booting. If you don&#8217;t want to lose your OSX installation, this may be an option to explore.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/plainlystated/xtwL?a=9vhkbI90ZBI:xeTeA8F6P2I:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/plainlystated/xtwL?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/plainlystated/xtwL/~4/9vhkbI90ZBI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.plainlystated.com/2013/04/xcp-xen-on-a-mac-mini/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.plainlystated.com/2013/04/xcp-xen-on-a-mac-mini/</feedburner:origLink></item>
		<item>
		<title>SSH Honeypots &amp; DataViz</title>
		<link>http://feedproxy.google.com/~r/plainlystated/xtwL/~3/zs95WehCYMU/</link>
		<comments>http://www.plainlystated.com/2013/02/ssh-honeypots-dataviz/#comments</comments>
		<pubDate>Sun, 17 Feb 2013 00:28:15 +0000</pubDate>
		<dc:creator>Patrick Schless</dc:creator>
				<category><![CDATA[Etc]]></category>
		<category><![CDATA[data vis]]></category>
		<category><![CDATA[honeypots]]></category>
		<category><![CDATA[security]]></category>

		<guid isPermaLink="false">http://www.plainlystated.com/?p=593</guid>
		<description><![CDATA[I put up a handful of small servers with SSH honeypots running, and have been watching who tries to break in. I didn&#8217;t publicize the addresses, or point any DNS at them, but they almost immediately got found by hackers across the globe. Here&#8217;s a visualization and analysis of the data so far. What&#8217;s a <a href='http://www.plainlystated.com/2013/02/ssh-honeypots-dataviz/' class='excerpt-more'>[...]</a>]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.plainlystated.com/honeypot-globe/" target="_blank"><img src="http://www.plainlystated.com/wp-content/uploads/2013/02/Screen-Shot-2013-02-16-at-6.16.44-PM.png" alt="Honeypot Globe" width="260" height="184" class="alignright size-full wp-image-595" /></a>I put up a handful of small servers with SSH honeypots running, and have been watching who tries to break in. I didn&#8217;t publicize the addresses, or point any DNS at them, but they almost immediately got found by hackers across the globe. Here&#8217;s <a href="http://www.plainlystated.com/honeypot-globe/" target="_blank">a visualization</a> and analysis of the data so far.<span id="more-593"></span></p>
<p><strong>What&#8217;s a Honeypot?</strong><br />
A honeypot is a fake service that runs on a standard port, waiting for people to try to break in. There are lots of different kinds, covering different protocols and interaction levels. I&#8217;m using <a href="http://code.google.com/p/kippo/" target="_blank">kippo</a>, which is a medium-interaction (or &#8220;research&#8221;) honeypot. If someone spends enough time guessing, they&#8217;ll eventually get in, and once in they are in a protected area where all their actions are recorded for future analysis. This yields a treasure trove of data, including patterns of who is trying to break in, how are they going about it, and what do they do if they are successful. For a production environment, honeypots may still be a good idea, but a low-interaction environment would be more appropriate (meaning people can attack it all they want, but will never get into anything).</p>
<p><strong>The Data</strong><br />
As of Feb 6, 2013, I have 5 servers running, across two data centers (AWS and Digital Ocean). I started them at various times, all around Feb 3, 2013. The data is <a href="http://www.plainlystated.com/honeypot-globe/" target="_blank">shown here on a globe</a>, with markers where attacks have originated. Because the boxes were started at various times, and the results are aggregated, the location of the markers are more relevant than the magnitude. That said, you can also see the <a href="https://github.com/honeypot-globe/data/blob/gh-pages/kippo.md" target="_blank">data in table form</a>.</p>
<p><strong>Why use a Honeypot?</strong><br />
Honeypots help you gain insight into a wave of attacks that is constantly going on. For instance, there&#8217;s a big difference between seeing login attempts for normal system accounts (root, guest, etc) and seeing login attempts for specific employees (john.smith). In the latter case, it may be an indication that you are being targeted specifically, rather than just randomly attacked, and you may want to react differently. You can also get some of this information without a honeypot (for instance ubuntu machines record login failures in /var/log/auth.log).</p>
<p><strong>Should I run a honeypot?</strong><br />
As with any service you expose, running a honeypot increases your surface area on the Internet, so it&#8217;s not necessarily a good idea on any particular server. The servers I&#8217;m running to collect this data are all single-purpose boxes, with no valuable/sensitive information, and if the boxes actually did get compromised, it wouldn&#8217;t be a big deal (they are AWS and Digital Ocean instances). For a box containing data/services you care about, while I wouldn&#8217;t use a research (eg medium- or high-interactivity) honeypot, I could see an argument for a low-interactivity one. Given that your servers&#8217; are probably being attacked daily, it might be safer to move your SSH port and put a honeypot on the default port, so it can handle the malicious activity. Only moving your SSH port (and leaving port 22 unused) is another option, but in the case where you&#8217;re being specifically targeted, having the default port closed would probably just prompt the attacker to port scan you to find the service.</p>
<p><strong>What Next?</strong><br />
I&#8217;d like to bring up other honeypots (on the same servers probably), and compare the relative frequency of attacks against different protocols (I suspect HTTP(S) is the most attacked).</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/plainlystated/xtwL?a=zs95WehCYMU:DZMxlTk2N2o:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/plainlystated/xtwL?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/plainlystated/xtwL/~4/zs95WehCYMU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.plainlystated.com/2013/02/ssh-honeypots-dataviz/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://www.plainlystated.com/2013/02/ssh-honeypots-dataviz/</feedburner:origLink></item>
		<item>
		<title>Bulk Loading Time-Series Data @ TempoDB</title>
		<link>http://feedproxy.google.com/~r/plainlystated/xtwL/~3/OGxCFvn4QhM/</link>
		<comments>http://www.plainlystated.com/2013/01/bulk-loading-time-series-data-tempodb/#comments</comments>
		<pubDate>Wed, 09 Jan 2013 16:46:00 +0000</pubDate>
		<dc:creator>Patrick Schless</dc:creator>
				<category><![CDATA[TempoDB]]></category>
		<category><![CDATA[hbase]]></category>
		<category><![CDATA[scaling]]></category>
		<category><![CDATA[tempodb]]></category>

		<guid isPermaLink="false">http://www.plainlystated.com/?p=584</guid>
		<description><![CDATA[(Cross-posted to blog.tempo-db.com) In addition to our REST API and language-specific client libraries, we now offer the ability to bulk import data by uploading CSVs. The intent of this feature is to support the initial load of large amounts of historical data (many millions or billions of data points). By sending us CSVs (instead of <a href='http://www.plainlystated.com/2013/01/bulk-loading-time-series-data-tempodb/' class='excerpt-more'>[...]</a>]]></description>
				<content:encoded><![CDATA[<p><em>(Cross-posted to <a href="http://blog.tempo-db.com" title="blog.tempo-db.com" target="_blank">blog.tempo-db.com</a>)</em></p>
<p>In addition to our REST API and language-specific client libraries, we now offer the ability to bulk import data by uploading CSVs. The intent of this feature is to support the initial load of large amounts of historical data (many millions or billions of data points). By sending us CSVs (instead of just using our API normally), customers save themselves from having to build and monitor a large one-time job, and the problem is simplified to CSV generation.<span id="more-584"></span></p>
<p><strong>How It Works</strong><br />
Behind the scenes, we leverage the immutability of HBase’s (our main time series data store) underlying data files, as well as some of the distribution primitives offered by our Hadoop cluster. We use HDFS (a distributed file-system), MapReduce (Hadoop’s distributed batch job framework), and Scala to transform the provided CSVs into HFiles, which is the format HBase uses internally. After generating these HFiles, it’s just a matter of directing HBase to add these files to its collection, which is a fast and efficient process.</p>
<p><strong>Immutability</strong><br />
HBase has an interesting property which permits us to create and load this data out-of-band: the underlying data files of HBase are immutable.  While the data in HBase is itself mutable (you can update records as you see fit), the HFiles which hold the data don’t change (with the exception of compactions, which can be ignored here). It achieves this by searching HFiles in reverse chronological order for relevant values, so updates (in more recent HFiles) will be found and returned instead of older (out-dated) values. For our data load, by telling HBase to add the generated files to its cache, we’re effectively doing a single bulk write to the database, with the entire data set.  In reality, due to the distributed nature of HBase, we’re not actually talking about a single bulk write, but one per server (where each server holds a portion of the data) but the general idea is the same.</p>
<p><strong>Distribution and Fault Tolerance</strong><br />
At a fundamental level, we work hard to run only horizontally scalable systems, and part of that is the understanding that although all sorts of things can and will go wrong, the system as a whole needs to continue running. For a large data set (let’s say 10 billion data points), the batch job to process the CSVs and generate HFiles can take hours or days, and at a time span like that, getting an error and starting over would be very painful. To address this, we leverage the built-in fault-tolerance and distribution mechanisms provided by Hadoop’s MapReduce framework. This system, coupled with HDFS, means that every step of the process can handle various server/networking/random problems, and the job as a whole will recover.</p>
<p>This feature is new, and (at the moment) we accept a fairly limited CSV format. More info on how to bulk import your data can be found in our Support Center here. We’re eager for feedback on how you’d like to see it fit into your process. Drop us a note to discuss the specifics of your workflow at support@tempo-db.com.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/plainlystated/xtwL?a=OGxCFvn4QhM:-9VuHyMDxdU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/plainlystated/xtwL?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/plainlystated/xtwL/~4/OGxCFvn4QhM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.plainlystated.com/2013/01/bulk-loading-time-series-data-tempodb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.plainlystated.com/2013/01/bulk-loading-time-series-data-tempodb/</feedburner:origLink></item>
		<item>
		<title>How Not To Get Sales On Etsy</title>
		<link>http://feedproxy.google.com/~r/plainlystated/xtwL/~3/5u0rB4sr-hc/</link>
		<comments>http://www.plainlystated.com/2012/09/how-not-to-get-sales-on-etsy/#comments</comments>
		<pubDate>Sat, 08 Sep 2012 20:02:57 +0000</pubDate>
		<dc:creator>Patrick Schless</dc:creator>
				<category><![CDATA[Etsy]]></category>
		<category><![CDATA[etsy]]></category>

		<guid isPermaLink="false">http://www.plainlystated.com/?p=549</guid>
		<description><![CDATA[I opened my Etsy store in January (about 9 months ago), and have learned a lot about effectively marketing my store. For the first several months I was trying everything I could think of to increase my visitor count, and I did get a ton of people coming into my store, but the effort required <a href='http://www.plainlystated.com/2012/09/how-not-to-get-sales-on-etsy/' class='excerpt-more'>[...]</a>]]></description>
				<content:encoded><![CDATA[<p>I opened my <a href="http://www.etsy.com/shop/PlainlyStated" target="_blank">Etsy store</a> in January (about 9 months ago), and have learned a lot about effectively marketing my store. For the first several months I was trying everything I could think of to increase my visitor count, and I did get a ton of people coming into my store, but the effort required on my part was substantial, and 3 months in I lost interest. That&#8217;s when things got interesting.<br />
<span id="more-549"></span></p>
<p><strong>Initial Marketing Efforts</strong><br />
When I opened my store, I used a variety of strategies to get visitors. I was active in the Etsy community forums, I participated in link exchange programs, and I discussed my work in communities outside Etsy (reddit, my blog, etc). <a href="http://www.plainlystated.com/2012/01/opening-an-etsy-store-two-weeks-in/" target="_blank">I did Etsy&#8217;s paid advertising program</a>, and I even advertised on a popular home decor blog. You can see below how effective this was for me, and you can also see the impact of me stopping my efforts, in March. The top (purple) line is visitors to any product in my store, and the bottom (blue) line is visitors to my shop&#8217;s homepage.<br />
<img src="http://www.plainlystated.com/wp-content/uploads/2012/09/Screen-Shot-2012-09-08-at-1.52.16-PM.png" alt="" title="Screen Shot 2012-09-08 at 1.52.16 PM" width="763" height="273" class="alignright size-full wp-image-557" /></p>
<p><strong>Why I Quit</strong><br />
I do not have a background in marketing, so a lot of what I was doing was guesswork (mostly based on tips from other sellers). One notable bit of advice was that once you hit some threshold of catalog size, you start to take off. The numbers people gave were different (50/100/200 items in your shop), but the general idea seems to be that having a large catalog has a big impact. I did increase my offerings (I started with 3, and added a couple a week), but I was a long way off from the numbers people were talking about. All of this was a lot of work, and the 3 sales a month I averaged over the first three months was fun and exciting, but didn&#8217;t really justify the effort.</p>
<p><strong>Performance After Quitting</strong><br />
I stopped all marketing efforts in March, 3 months into my shop. I still managed the shop, but didn&#8217;t add many new products or try to drive in visitors. You can see in the graph above that I did maintain a decent level of visitors, though. My sales (see above) dipped for a few months, then in the summer they started slowly going up (I don&#8217;t know why). This resparked my interest, but the only tactic I&#8217;ve used since then has been adding products to the store (mostly in August). This month, I&#8217;ve hit the first threshold (50 items in my shop), and whether or not there is something special about the number, hopefully the general increase in products continues to improve my sales.<br />
<img src="http://www.plainlystated.com/wp-content/uploads/2012/09/Screen-Shot-2012-09-08-at-1.52.55-PM.png" alt="Etsy sales over time" title="Etsy Sales over Time - first 8 months" width="760" height="262" class="alignright size-full wp-image-559" /></p>
<p><strong>Favorites Don&#8217;t Indicate Sales</strong><br />
On Etsy, visitors can &#8220;favorite&#8221; a product (or an entire shop). Take this metric with a big grain of salt, because people may have all sorts of reasons for favoriting (doesn&#8217;t necessary indicate they are more likely to buy), but it does mean you did something to catch their attention for a moment. You can see below that there is not much of a change in favorites in March, when I stopped driving in visitors. Furthermore, the shape of the favorites graph doesn&#8217;t really look anything like the orders graph, meaning there isn&#8217;t much of a correlation between favorites and sales. I could see an argument for a relationship between the shape of the favorites graph and the visitors graph, though it seems fairly weak.<br />
<img src="http://www.plainlystated.com/wp-content/uploads/2012/09/Screen-Shot-2012-09-08-at-1.52.44-PM.png" alt="Etsy Favorites over Time" title="Etsy Favorites" width="762" height="280" class="alignright size-full wp-image-558" /></p>
<p><strong>&#8220;Low Quality&#8221; Visitors Lead To A Low Conversion Rate</strong><br />
What I get from all this is that for the first three months I was driving in lots of low-quality visitors (meaning people unlikely to buy), and my resulting conversion rate (how often I turn a visitor into a purchaser) was therefore quite low. I read <a href="www.amazon.com/Potential-To-Profit-Online-ebook/dp/B006QLM3R0" target="_blank">a book on online marketing</a> a while back which talked about (among other things) improving your conversion rate by increasing the quality of your visitors. In my case, any visitor from outside Etsy is less likely to buy simply because there&#8217;s a high barrier to entry (creating an account, feeling comfortable buying from a stranger on Etsy, etc). My on-Etsy efforts during the early months tended to target other shop owners, which is better, but still a little off the mark. My latest efforts (adding more products, improving pictures &#038; descriptions) are not going to drive in hordes of visitors, but the people that do find them (mostly through targeted searching) will be much higher quality for me.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/plainlystated/xtwL?a=5u0rB4sr-hc:WZ8xl2nwb1U:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/plainlystated/xtwL?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/plainlystated/xtwL/~4/5u0rB4sr-hc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.plainlystated.com/2012/09/how-not-to-get-sales-on-etsy/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.plainlystated.com/2012/09/how-not-to-get-sales-on-etsy/</feedburner:origLink></item>
		<item>
		<title>Timewise</title>
		<link>http://feedproxy.google.com/~r/plainlystated/xtwL/~3/Xc_3EDCBEeg/</link>
		<comments>http://www.plainlystated.com/2012/05/timewise/#comments</comments>
		<pubDate>Wed, 02 May 2012 03:40:15 +0000</pubDate>
		<dc:creator>Patrick Schless</dc:creator>
				<category><![CDATA[Hot Or Not]]></category>
		<category><![CDATA[Power Hungry]]></category>

		<guid isPermaLink="false">http://www.plainlystated.com/?p=543</guid>
		<description><![CDATA[I have two similar data collection projects, both of which collect time-series data and serve it up with graphs and such. The first one I did uses postgres, and manually (in code, not postgres) manages averaging, data at various resolutions, and a few other complicated issues that are inherent in time-series data. For the second <a href='http://www.plainlystated.com/2012/05/timewise/' class='excerpt-more'>[...]</a>]]></description>
				<content:encoded><![CDATA[<p>I have two similar data collection projects, both of which collect time-series data and serve it up with graphs and such. The <a href="https://github.com/plainlystated/power_hungry" target="_blank">first one I did</a> uses postgres, and manually (in code, not postgres) manages averaging, data at various resolutions, and a few other complicated issues that are inherent in time-series data. For the <a href="http://hot-or-not.plainlystated.com/" title="Hot Or Not" target="_blank">second project</a>, I went with RRD instead of postgres, and it vastly simplified data management (other than having to write the RRD integration code for javascript myself). Now, I&#8217;m working on refactoring these projects, because it makes sense to move to the first project over to RRD and then there&#8217;s no reason to have the graphing bits separate.<span id="more-543"></span></p>
<p><strong>Step 1: Extract Graphing Code</strong><br />
To start with the 2-project refactoring, I created a new (third) project: <a href="https://github.com/plainlystated/Timewise" title="Timewise" target="_blank">Timewise</a>. This node.js project periodically polls a set of configurable endpoints, each of which serve up a single XML page of RRD&#8217;s built-in serialization. The XML gets read in and deserialized to a new RRD file, and this vastly simplifies the postgres replication hacks I had in place for Power Hungry. For now, the project consists only of code I yanked out of Hot or Not, but and right now that&#8217;s the only project it serves. This refactoring, though, sets up Power Hungry for the refactoring (to RRD) that is coming its way.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/plainlystated/xtwL?a=Xc_3EDCBEeg:1KVTm2oGj8k:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/plainlystated/xtwL?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/plainlystated/xtwL/~4/Xc_3EDCBEeg" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.plainlystated.com/2012/05/timewise/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.plainlystated.com/2012/05/timewise/</feedburner:origLink></item>
		<item>
		<title>Hot Or Not: Back Up, Kind Of</title>
		<link>http://feedproxy.google.com/~r/plainlystated/xtwL/~3/jwtROtTbY5Q/</link>
		<comments>http://www.plainlystated.com/2012/04/hot-or-not-back-up-kind-of/#comments</comments>
		<pubDate>Tue, 01 May 2012 04:45:03 +0000</pubDate>
		<dc:creator>Patrick Schless</dc:creator>
				<category><![CDATA[Hot Or Not]]></category>
		<category><![CDATA[arduino]]></category>
		<category><![CDATA[arduino electronics squarewave]]></category>
		<category><![CDATA[coffeescript]]></category>
		<category><![CDATA[projects]]></category>

		<guid isPermaLink="false">http://www.plainlystated.com/?p=534</guid>
		<description><![CDATA[A while back I built my own thermostat using an Arduino, nodejs, and Google Calendar. It worked really well, but when I moved to a new apartment last year I couldn&#8217;t use it (because I now have window units instead of centralized heating/AC). I finally got around to putting it back together this weekend, but <a href='http://www.plainlystated.com/2012/04/hot-or-not-back-up-kind-of/' class='excerpt-more'>[...]</a>]]></description>
				<content:encoded><![CDATA[<p>A while back I <a href="http://www.plainlystated.com/2011/07/building-a-thermostat-using-arduino/" target="_blank">built my own thermostat</a> using an Arduino, nodejs, and Google Calendar. It worked really well, but when I moved to a new apartment last year I couldn&#8217;t use it (because I now have window units instead of centralized heating/AC). I finally got around to putting it back together this weekend, but I had to rip out the (now unused) thermostat code. What was a Google-Calendar-controlled thermostat is now just a thermometer. Not nearly as cool, but I&#8217;m at least glad to have the portion that makes sense back up. You can see it <a href="http://hot-or-not.plainlystated.com/" target="_blank">here</a>.<span id="more-534"></span></p>
<p>I left the HVAC/thermostat code on the master branch of the code repository, and put my thermometer-only code on a <a href="https://github.com/plainlystated/Thermostat/tree/temperature_only" title="Temperature Only branch" target="_blank">new branch</a>.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/plainlystated/xtwL?a=jwtROtTbY5Q:bSvniP-FmJM:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/plainlystated/xtwL?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/plainlystated/xtwL/~4/jwtROtTbY5Q" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.plainlystated.com/2012/04/hot-or-not-back-up-kind-of/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.plainlystated.com/2012/04/hot-or-not-back-up-kind-of/</feedburner:origLink></item>
		<item>
		<title>Cutting Pageload Time by 50%</title>
		<link>http://feedproxy.google.com/~r/plainlystated/xtwL/~3/p-o0jTp2MZE/</link>
		<comments>http://www.plainlystated.com/2012/02/cutting-pageload-time-by-50/#comments</comments>
		<pubDate>Fri, 17 Feb 2012 05:09:40 +0000</pubDate>
		<dc:creator>Patrick Schless</dc:creator>
				<category><![CDATA[Creative Retrospection]]></category>
		<category><![CDATA[analytics]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[performance]]></category>
		<category><![CDATA[small_store]]></category>

		<guid isPermaLink="false">http://www.plainlystated.com/?p=523</guid>
		<description><![CDATA[The site I&#8217;m working on now, deploys as static files. I haven&#8217;t put up a non-server-side-dynamic site since high school, so I&#8217;m exploring my options. I thought I could just throw the whole thing up on Amazon S3, but was surprised that it was slower than the current setup (nginx on Linode). I have been <a href='http://www.plainlystated.com/2012/02/cutting-pageload-time-by-50/' class='excerpt-more'>[...]</a>]]></description>
				<content:encoded><![CDATA[<p>The <a href="http://www.creativeretrospection.com" title="Creative Retrospection" target="_blank">site I&#8217;m working on now</a>, deploys as static files. I haven&#8217;t put up a non-server-side-dynamic site since high school, so I&#8217;m exploring my options. I thought I could just throw the whole thing up on Amazon S3, but was surprised that it was slower than the current setup (nginx on Linode). I have been reading about the importance of fast load speeds on conversion, google ranking, etc (<a href="http://www.plaveb.com/blog/the-importance-of-decreasing-page-load-time-for-improving-conversions" target="_blank">for example</a>), so speed is a big priority for me. Here&#8217;s how I cut my site&#8217;s page load time down from around a second to around 500ms.<span id="more-523"></span></p>
<p><strong>Starting Point</strong><br />
To start, I threw the site up on my Linode, using nginx. The server runs a bunch of other sites, in a variety of languages, all with pretty low volumes. The server has keep-alive enabled, but not much else has been tweaked.</p>
<p><strong>Hosting-As-A-Service</strong><br />
I looked at hosting on S3, Cloudfront (amazon&#8217;s CDN), and Rackspace&#8217;s CDN. Using apachebench (from slicehost), I compared the performance between all 3 of those options, with my nginx as the baseline. S3 was the slowest (slower even then nginx on my little VPS). Cloudfront was comparable to my nginx, and Rackspace would spike to about double the requests per second of my linode, but would also dip to slower than my nginx. Rackspace also has two big drawbacks. It doesn&#8217;t let you auto-serve index.html when a directory is requested, so I would still have to run nginx for the html files (as opposed to amazon, which supports this). Rackspace also doesn&#8217;t support directories. There are work-arounds, but it&#8217;s a pain that I can&#8217;t just mirror my directory structure on their cloud. Overall, the cloud hosting solutions were a let-down, and I decided to just host it myself, on linode/nginx.</p>
<p><strong>Testing Methodology</strong><br />
I used Chrome&#8217;s debugging tools (with browser caching turned off) to get a sense of pageload times. I would refresh the page several times, and make a note of the spread of times. Not entirely scientific, but good enough for a rough idea of the relative improvements I was making.</p>
<p><strong>External Resources</strong><br />
I had several external resources being referenced. I was sourcing some images from my Etsy store, using a public CDN for jquery, google fonts, etc. I pulled all those into my own repo, rather than rely on whatever bandwidth these providers want to give out for free. I didn&#8217;t see any speed change from this, probably because the files in question were pretty small.</p>
<p><strong>Minify CSS &#038; JS</strong><br />
My site goes through a script to convert it from templates and code into static files. As part of this process, I added minifying the CSS and JS files. I combined all the JS files into one file, then ran it through yahoo&#8217;s yui compressor, and did likewise for the CSS. Javascript was compressed by 14%, and CSS was compressed by 23%. Page load times dropped from around 1 second to around 700ms.</p>
<p><strong>Resize Images</strong><br />
The same images appear in a number of places on my site, and I was using CSS to change the size. I switched to having the script generate different versions of the image, for every size I needed. This drastically reduced the filesizes, and dropped the pageload time down another 100ms to around 600ms.</p>
<p><strong>Asset Server Pool</strong><br />
The last thing I added was an asset server pool. Browsers limit the number of connections they&#8217;ll make to a given server. I made a CNAME DNS alias for the site&#8217;s url (so the same nginx serves both domains the same), and sent half the assets (images, js, css, etc) to the alias. This bought me another 100ms, and left me at around 500ms.</p>
<p><strong>Pageload Accuracy</strong><br />
The pageload times I was measuring were definitely anecdotal, and heavily influenced by my internet connection, laptop resources, etc. They are used more to show the relative improvement, rather than as a reliable indication of the speeds users will see.</p>
<p><strong>The Code</strong><br />
All the code and project setup described here is <a href="https://github.com/plainlystated/small_store" title="Small Store on Github" target="_blank">on github</a>.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/plainlystated/xtwL?a=p-o0jTp2MZE:6waCrNfrCVY:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/plainlystated/xtwL?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/plainlystated/xtwL/~4/p-o0jTp2MZE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.plainlystated.com/2012/02/cutting-pageload-time-by-50/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.plainlystated.com/2012/02/cutting-pageload-time-by-50/</feedburner:origLink></item>
		<item>
		<title>Weekend Project: Generate an (HTML + JS) eCommerce Site</title>
		<link>http://feedproxy.google.com/~r/plainlystated/xtwL/~3/5SMRwnRl2eY/</link>
		<comments>http://www.plainlystated.com/2012/02/weekend-project-generate-an-html-js-ecommerce-site/#comments</comments>
		<pubDate>Mon, 13 Feb 2012 14:20:03 +0000</pubDate>
		<dc:creator>Patrick Schless</dc:creator>
				<category><![CDATA[Creative Retrospection]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[creative_retrospection]]></category>
		<category><![CDATA[etsy]]></category>
		<category><![CDATA[projects]]></category>
		<category><![CDATA[small_store]]></category>

		<guid isPermaLink="false">http://www.plainlystated.com/?p=512</guid>
		<description><![CDATA[My Etsy store has been doing well, but I&#8217;d like to overcome the friction of requiring an Etsy account. To reach a wider audience, I&#8217;d like to additionally offer my products on a site that wasn&#8217;t specific to a community. To that end, I created a tool which generates a static HTML + Javascript eCommerce <a href='http://www.plainlystated.com/2012/02/weekend-project-generate-an-html-js-ecommerce-site/' class='excerpt-more'>[...]</a>]]></description>
				<content:encoded><![CDATA[<p>My <a href="http://plainlystated.etsy.com" title="Etsy store" target="_blank">Etsy store</a> has been doing well, but I&#8217;d like to overcome the friction of requiring an Etsy account. To reach a wider audience, I&#8217;d like to additionally offer my products on a site that wasn&#8217;t specific to a community. To that end, I created <a href="https://github.com/plainlystated/small_store" title="Small Store Project" target="_blank">a tool</a> which generates a static HTML + Javascript eCommerce site. Here&#8217;s the result: <a href="http://www.creativeretrospection.com" title="Creative Retrospection" target="_blank">Creative Retrospection</a>.<span id="more-512"></span></p>
<p><strong>Goals</strong><br />
I looked at a few options to get my own eCommerce site up and running (Shopify, etc), but everything was really out of my price range (for the volumes I&#8217;m doing). There are some open source projects that look interesting, but nothing that seemed a clear winner. For my needs, I just wanted something simple, fast, and secure. Static assets with all the logic client-side gives me that.</p>
<p><strong>Upsides</strong><br />
Static assets are served faster than anything server-side-dynamic, and they require less memory (from the server). Ultimately, the whole site could be thrown on a CDN backed by S3, and I wouldn&#8217;t have to manage hosting at all. Because I control the code and the hosting, I have a ton of flexibility for future goals, too (I have several ideas on my TODO list).</p>
<p><strong>Downsides</strong><br />
Having a Javascript shopping cart means that I am not selling to people that don&#8217;t use Javascript. About 2% of people in the US have javascript disabled (lower in other countries), and of those most seem to be the super-security conscious or older mobile phones. Not supporting these groups is a price I have to pay with my setup. The other significant downside is that I have to do manual confirmation of the purchases (amount, tax, etc), because the requests could be tampered with. This problem is not specific to my setup, and is not a big deal with my volumes. It doesn&#8217;t take a ton of effort, so I imagine this strategy will scale for quite some time before I need to come up with something different.</p>
<p><strong>Tooling</strong><br />
I looked at Jekyll (a similar tool for generating static blogs) for this. I have used Jekyll for non-blog sites before, but in this case I found myself not only wanting to skip the blog-specific features, but also add in eCommerce-specific features. I pretty quickly decided that Jekyll wasn&#8217;t the right tool for this, so I built <a href="https://github.com/plainlystated/small_store" title="Small Store Project" target="_blank">Small Store</a>. It takes a list of products and uses a template to generate product pages. It&#8217;s very much a work-in-progress, and needs a lot of cleaning up (and additional features). I&#8217;ve tried to pull everything specific to my site into config/ but I&#8217;m sure I&#8217;ve missed some things. Feel free to check it out if it might match your needs.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/plainlystated/xtwL?a=5SMRwnRl2eY:qvUFqnZxeBc:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/plainlystated/xtwL?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/plainlystated/xtwL/~4/5SMRwnRl2eY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.plainlystated.com/2012/02/weekend-project-generate-an-html-js-ecommerce-site/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<feedburner:origLink>http://www.plainlystated.com/2012/02/weekend-project-generate-an-html-js-ecommerce-site/</feedburner:origLink></item>
		<item>
		<title>Etsy – The Importance of Sales Goals</title>
		<link>http://feedproxy.google.com/~r/plainlystated/xtwL/~3/9UN-eTb0CtA/</link>
		<comments>http://www.plainlystated.com/2012/01/etsy-the-importance-of-sales-goals/#comments</comments>
		<pubDate>Tue, 31 Jan 2012 02:04:12 +0000</pubDate>
		<dc:creator>Patrick Schless</dc:creator>
				<category><![CDATA[Laser Cutting]]></category>
		<category><![CDATA[etsy]]></category>

		<guid isPermaLink="false">http://www.plainlystated.com/?p=501</guid>
		<description><![CDATA[It&#8217;s hard to say what sort of sales rate is reasonable or average for a new Etsy store. I spend a fair amount of time in the team forums, and the general consensus I&#8217;m getting is that it&#8217;s really hard to make any/many sales for smaller shops, but that larger shops (100+ items) tend to <a href='http://www.plainlystated.com/2012/01/etsy-the-importance-of-sales-goals/' class='excerpt-more'>[...]</a>]]></description>
				<content:encoded><![CDATA[<p><a href="http://www.etsy.com/listing/91116344/flowering-vine-mirror"><img alt="" src="http://img2.etsystatic.com/il_fullxfull.305156954.jpg" title="Artistic Flower Mirror" class="alignright" width="320" height="480" /></a>It&#8217;s hard to say what sort of sales rate is reasonable or average for a new Etsy store. I spend a fair amount of time in the team forums, and the general consensus I&#8217;m getting is that it&#8217;s really hard to make any/many sales for smaller shops, but that larger shops (100+ items) tend to make several sales per week. Given that understanding, I have set a goal for myself that I think is aggressive but achievable.<span id="more-501"></span></p>
<p><strong>Sales Goal</strong><br />
My goal is 1 sale per week. I picked this goal for two reasons. First, it is beyond what I am currently selling, but not that far off (some weeks I make a sale, some weeks I don&#8217;t). Second, the 1-week time period is long enough to try out a new marketing strategy or two, but short enough that I have to be really organized and diligent. As soon as a new week rolls around, regardless of the previous week I am ready to go gung-ho towards a sale.</p>
<p><strong>When I Hit My Goal</strong><br />
Hitting a goal is great. It is encouraging, and renews my excitement about this project. I start the week really working hard on making a sale, so when I do make one, I sometimes take the rest of the week to relax and let some product ideas marinate. Other weeks, I spend my extra time working on more long-game marketing strategies, like reaching out to bloggers that might be interested in my product.</p>
<p><strong>When I Miss My Goal</strong><br />
Missing my goal sucks. My week starts on Monday, so as the weekend rolls around I start to get really worried if I haven&#8217;t made a sale. I try less targeted marketing strategies, even though they never really seem to pay off.</p>
<p><strong>New Week, New Goal</strong><br />
When a week ends, its success or failure is in the past. If I missed my goal last week, I don&#8217;t worry about catching up this week, and if I sold two things last week, it doesn&#8217;t make me any less hungry for a sale this week. This is really important for me to stay calm and sane, but on the other hand, if I have a somewhat sustained series of successes or failures, I&#8217;ll know I need to reexamine my goals.</p>
<p><strong>Long Game vs Short Game</strong><br />
My goal of 1 sale per week is evaluated every 7 days, but I keep in mind that it is really a long-term goal (&#8220;1 sale *every* week.&#8221;). For sustained success, I have to look beyond the current 7-day period, so I usually spend some time in the middle of the week working on new product ideas. The new items won&#8217;t make it into the store during this week, but hopefully they will help me next week or the week after.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/plainlystated/xtwL?a=9UN-eTb0CtA:GVk1mjJ_fGw:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/plainlystated/xtwL?d=yIl2AUoC8zA" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/plainlystated/xtwL/~4/9UN-eTb0CtA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.plainlystated.com/2012/01/etsy-the-importance-of-sales-goals/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://www.plainlystated.com/2012/01/etsy-the-importance-of-sales-goals/</feedburner:origLink></item>
	</channel>
</rss><!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Page Caching using disk: enhanced

 Served from: www.plainlystated.com @ 2013-05-18 21:16:57 by W3 Total Cache -->
