by Sumit Chachra on April 3, 2011
Having worked at/with multiple web/software startups there are a certain set of tools I’ve gotten used to leveraging to save time and $. Some of these tools didn’t exist even 2-3 years back, so this list might / will get stale pretty fast!
The list that follows assumes these things:
- Time is money (duh!).
- Speed is everything (at least in a startup).
- Humans are expensive, machines are cheap.
- The “cloud” is safe, and everything is going to move there. If you’re a “cloud” startup and don’t buy into it, then go live in a cave.
- Your “startup” can afford $100-200/month of costs using these online services that make your team productive.
Now that we’ve gotten that out of the day, should we jump right in?
- Google Apps – Please don’t waste time using MSFT outlook, or dreamhost, or Godaddy for your email needs. Setup a Google Apps account, it takes less than an hour (at max). You get 50 users for free, can’t beat that.Its safe, fast, Gmail rocks, Google docs works, wiki is barely usable.
- Servers – Use Amazon EC2, Slicehost or Linode. If you’re new to server administration then stick with Slicehost or Linode.
- Github – Source control is important. Its so important that Subversion doesn’t cut it. There I said it. Bitbucket (mercurial) would be the only other thing thats even remotely good. Trac/Assembla/running your own git/svn server etc. are all bad solutions!Notice I am not saying “git”. I am saying Github. It gives you permissions, ssh key based access, easy branching, commenting on code, reviewing merges, integration with 25 external services etc. Its a no-brainer.
- Ticketing / issue tracking – There are many options here. On one extreme is Pivotal Tracker (a steep learning curve). In the middle are the likes of Fogbugz. On the linear/boring side are Assembla or Lighthouse app or even Basecamp todo’s!I really like Pivotal Tracker, but only if you’re a truly agile startup with realistic deadlines and goals. I find it useful even when working on a project alone (instead of in a team).
- External Monitors etc. – Every developer should have a dual monitor setup (minimum of 21″, ideally 24-27″), a fast machine and a chair to sit in that costs around 4-5 hours of their salary/pay-rate. Anything less than any of this doesn’t cut it and you’re pinching dollars where it matters least. Really.
- Payment Gateways – There are lot of (shitty) options out there. On one extreme you can go with Paypal. Thats a reasonable solution from a setup perspective. Sadly their API’s (still) suck … a lot!If you’re ok with getting your own merchant account setup etc. I highly recommend using Braintree Payment Solutions. They have amazing customer service, a well written/thought out API and an API wrapper written in most popular languages (Ruby, Java, Python, PHP etc.).
- Online contracts/NDA’s – If you’re hiring employees, contractors and vendors you’re probably going to be signing a ton of paperwork! Do your brain a favor and use Echosign. It makes getting contracts, NDA’s, I-9 forms signed a breeze.
I’ll limit myself to these 7 things. There are other problems like invoicing (solved by Freshbooks), CRM (solved by 37Signals Highrise or Salesforce), wiki (solved by pbworks.com), sharing files (solved by Dropbox) etc. that need solving too.
But I’ll leave that an exercise for the reader. Just refer to the bullet points I mention above, and if the solution/tool you choose meets/exceeds the goals specified there then you’re good to go!
by Sumit Chachra on February 9, 2011
So after more than a year of thinking/pondering/procrastinating I found myself with 2 spare hours (Wife busy will 9:30 and me not wanting to go to the Gym…. the stars aligned!) and took advantage of it to open source Tivix’s first application.
Its not the sexiest, but makes running python crons / automated tasks in Django hopefully a tad bit easier. If nothing else someone can extend this app and make it even better.
Here is it: https://github.com/Tivix/django-cron
Hopefully we’ll open source 2-3 other applications / code snippets which we find really useful as time goes on. This a small way in which we “give back” to the open source community (Django and Wordpress I am looking at you!) on whose shoulders we’ve built some great products for some great companies!
Thoughts/comments welcome 
by Sumit Chachra on January 3, 2011
Priyanka and I spent 3 nights in Hyderabad, while there for a friends wedding. We made a vacation out of it and had a great time.
The highlight of the trip was our stay at The Park there. Even though the tripadvisor ratings for the hotel are wanting, its a great new hotel with a lot of potential. Overlooking the Hussain Sagar lake, the Hotel has a infinity pool, outdoor seating, a 24 hour cafe, 3 bars and excellent staff to round it off. The morning breakfast was the best morning food spread I’ve seen in a while. Highly recommend staying there if you find yourself in Hyderabad.
We also made our way to the Chowmahalla Palace which is worth a visit with 3-4 small palaces and exhibits. The Charminar was a bit of a disappointment. Its not been maintained, is in a super crowded market/neighborhood and just made us run to the nearest auto-rickshaw.
The Golconda Fort is a well worth a visit too. Go around 2-3pm, so that you can hire a guide and go all the way to the top. That will take 2-3 hours and that’ll be a great segway into the 6:30pm light and sound show in English inside the fort. The acoustics and science applied 700 years ago is impressive.
Apart from these places we made our way to a local mall (GVK-1), to the Shilparamam (think Delhi Haat) and of course to Paradise for their famous Mutton Biryani (not the best in Hyderabad, but pretty decent. Sit in their nicer airconditioned top floor, if you’d like a more relaxed experience!). The old city is a bit chaotic and dirty, but if the airport and the 11 km freeway to the city are any signs, things are improving for sure.
Overall we were pretty impressed with the city of Nizams and highly recommend it to anyone if you have 3-4 days.
by Sumit Chachra on September 8, 2010
Satchmo is a popular Django based e-commerce system. Its well suited for the most part to sell things like shirts and shoes that come in various sizes / colors (variations) etc. These are items that a seller would have a certain amount of in stock, and sell out when the inventory hits 0.
There are situations however this doesn’t work as well. Say you’re a bakery that sells cupcakes and macaroons. Lets assume you bake 100 cupcakes and 50 macaroons every day. So thats the max you can sell on a daily basis. Some days you won’t sell all, but the next day you may run out. This means your inventory number is not fixed.
Moreover the way you’ll define your “product” (thing that customer buys) will need to change. Instead of saying that “I sold a cupcake”, you have to say “I sold a cupcake on Sep. 7, 2010″. The temporal aspect is important, since your inventory is not static. The date may represent the order date or a date in the future (say you take pre-orders).
The exact same scenario applies to sellers of theater tickets (or tickets of any kind really), hotel rooms etc. Almost any kind of commerce online that has daily or variable inventory levels and / or perishable items.
OK, so how to go about solving this problem. Without going into too many details, its obvious we need to use what Satchmo calls Custom Product(s). Apart from that we need to capture the core product type (cupcake or macaroon or hotel room) etc. Below you will find a VariableInventoryProductType class that represents a typical type of product and a VariableInventoryProduct class that has a FK to a core Satchmo product, a day and a type of product. This is the product the customer is really buying (executive suite on December 25, 2010… room would be a product type and executive suite would be a “variation” of that).
import logging
from django.conf import settings as django_settings
from django.db import models
from django.contrib.sites.models import Site
from django.utils.translation import ugettext_lazy as _
from product.models import SHIP_CLASS_CHOICES, Product, OptionGroup, Price
from product.modules.configurable.models import ConfigurableProduct
class VariableInventoryProductType(models.Model):
"""
Represents a type of product thats sold by the seller. In case of a Theater for example only one instance of
this would exist. In case of a bakery say, the number of instances would be the same as the number of different
types of items the bakery sells.
"""
name = models.CharField(max_length=255)
description = models.TextField()
slug = models.CharField(max_length=255, db_index=True)
image = ImageField()
default_inventory = models.IntegerField(verbose_name='Default daily inventory')
active = models.BooleanField(default=True, db_index=True)
order = models.IntegerField(db_index=True, default=0)
base_price = models.DecimalField(max_digits=6, decimal_places=2)
option_group = models.ForeignKey(OptionGroup, blank=True, null=True)
shipclass = models.CharField(_('Shipping'), choices=SHIP_CLASS_CHOICES, default="YES", max_length=10)
featured = models.BooleanField(default=False, db_index=True)
class Meta:
ordering = ('order', )
def __unicode__(self):
return self.name
class VariableInventoryProductManager(models.Manager):
def get_product(self, product_type, day, create=True):
qset = self.filter(product_type=product_type, day=day)
if qset:
return qset.get()
elif create:
logging.info('Creating new product of type: %s and day: %s' % (product_type.name, day))
# create real satchmo product first.
product = Product()
product.site = Site.objects.get_current()
product.name = '%s on %s' % (product_type.name, day)
product.items_in_stock = product_type.default_inventory
product.shipclass = product_type.shipclass
product.save()
p = Price()
p.product = product
p.price = product_type.base_price
p.save()
# Create Variations
if product_type.option_group:
configurable_product = ConfigurableProduct(product=product)
configurable_product.save()
configurable_product.option_group.add(product_type.option_group)
configurable_product.create_subs = True
configurable_product.save()
return self.create(product=product, product_type=product_type, day=day)
else:
return None
class VariableInventoryProduct(models.Model):
"""
Actual product thats sold by the store. FKed to an actual satchmo product.
"""
product = models.OneToOneField(Product)
product_type = models.ForeignKey(VariableInventoryProductType)
day = models.DateField(db_index=True)
objects = VariableInventoryProductManager()
class Meta:
unique_together = ('product_type', 'day')
def _get_subtype(self):
return 'VariableInventoryProduct'
def __unicode__(self):
return '%s on %s' % (self.product_type.name, self.day)