Lean Startup und Minimum Viable Products. Wie kann man eine Geschäftsidee möglichst kosteneffizient und schnell validieren

Der herkömmliche Ansatz zur Beschreibung einer Geschäftsidee ist der Business Case. Ein ernsthafter Business Case nimmt schon mal das Ausmass einer mittleren Bachelor-Arbeit an. Der Business Canvas hat in den letzten Jahren den Business Case weitgehend abgelöst und der Umfang hat sich auf eine A4-Seite reduziert. Dem deutlich geringeren Aufwand steht maximaler Nutzen gegenüber.

Mit dem Aufkommen des Lean-Startup-Prinzips im Silicon Valley hat sich herausgestellt, dass der Erfolg neuer Geschäftsideen und -modelle nicht auf dem Papier geplant werden kann. Nur die Realität kann das nötige Feedback liefern. Papier ist geduldig, aber jeder Arbeitstag in der wirklichen Welt kostet echtes Geld – und sei es in Form von Opportunitätskosten. “Failing early” reduziert den Zeitaufwand enorm. Oft wird jedoch übersehen, dass ein richtiger “Fail” erst den ganzen Einsatz und unbedingten Willen zum Erfolg der Gründer verlangt. “Fail early” heisst also nicht etwa “schnell aufgeben”, sondern eine erfolgsversprechende Lösung gründlich, konsequent und unter Einsatz aller vorhandener Mittel vorwärts zu treiben – aber bei hoher Geschwindigkeit.

Diese Schnelligkeit ist nicht ganz einfach zu bewerkstelligen. Schnell kann nur sein, wer bereit ist, seine Vision abzuspecken und Zwischenlösungen zu suchen, die nicht perfekt sind und sofort beginnt draussen auf der Strasse zu verkaufen. Dies kann schon innerhalb von einigen Tagen bewerkstelligt werden.

Als Ausnahme sind hier technologie-getriebene Startups anzuführen, z.B. ein Unternehmen, welches als Universitäts-Spin-Off ein neuartiges Krebsmedikament auf den Markt bringt. Da wird das Risiko über eine weite Strecke von der Grundlagenforschung, also direkt oder indirekt über eine Universität vom Staat getragen und die Zeit für die Lösung komplexer technischer Herausforderungen ist da.
Es gibt Projekte, die erst Marktmacht aufbauen müssen, damit der Proof-of-Concept gelingt. Das ist zum Beispiel der Fall bei siroop.ch, der Coop-Kopie des Schweizer Online-Supermarktes Galaxus. Siroop.ch ist nach vielen Millionen CHF Investitionen den Beweis noch schuldig, dass es jemals den Break-even erreichen wird. Die Investoren haben viel Geld, denken sehr langfristig und scheuen selbst extrem hohe Risiken nicht. Aus welchen Gründen auch immer.

Falls Sie solche Investoren von Ihrer Geschäftsidee überzeugen können, herzliche Gratulation! Es ist nicht unmöglich. CentralWay, dem ersten Schweizer Unicorn, ist dies z.B. mit numbrs gelungen – obwohl nach einem Blick auf Google Trends wohl jedem klar sein müsste, dass das nichts mehr wird.

Für alle anderen, unter anderem für diejenigen, die sich zu schade sind, ihr Startup über Jahre zu Grabe zu tragen, wird es jetzt spannend. Mit begrenzten finanziellen Mitteln und wenig Zeit treten sie an den Start.
Die Geschwindigkeit des Go-to-Market ist matchentscheidend. Maximale Geschwindigkeit erreicht nur, wer aus seinem Projekt die Kernhypothesen herausschält und diese sofort mit geringstmöglichem Mitteleinsatz validiert. Das ist das Minimum Viable Project. Lesen Sie im nächsten Artikel mehr darüber.

Mit maximaler Geschwindigkeit zum Startup-Erfolg

Das Minimum Viable Project

In der Phase der Validierung der Geschäftsidee (early stage) gibt es ein hauptsächliches, grosses Risiko. Und zwar die verfrühte Investition in Technologie. Viele Gründer denken, die Unique Selling Position ihres Produktes ergibt sich durch die Technologie, z.B. das Aufbauen einer besonders raffinierten Web Applikation. Doch dafür gibt es keine Garantie und die Geschwindigkeit des Go-To-Markets leidet extrem.
Die schnellste Validierung ist der sogenannte MVP, kurz für Minimum Viable Product (oder Project). Die Maxime des MVPs ist so viel Technologie wie nötig, aber so wenig wie möglich.

Beim MVP geht es darum, möglichst viele Schritte im Wertschöpfungs-Prozess zu outsourcen oder mit einfachsten Bordmitteln als Concierge selbst zu imitieren.

Zapos, einer der ersten Online Schuh-Shops in den Staaten hat die über eine primitive statische Seite bestellten Schuhe einfach beim Schuhhändler um die Ecke gekauft und an die Kunden per Post verschickt. Die erste Bestellung kam innerhalb von Tagen.
Bei Unumondo, einem Zürcher Sprachbildungs-Startup, vermittelt die Gründerin alle Kontakte zwischen Sprach-Coach und Lernende selbst. Der erste Schritt zur Validierung der Idee war die Durchführung einer ersten Session mit einem Expat als Kunden und einem Bekannten als Sprach-Coach – innerhalb von einer Woche!

cvcube.ch, ein Schweizer Startup welches die Vermittlungen von Weiterbildungen mit digitalen Mitteln revolutionieren möchte, hat zu Beginn mit einer simplen Webseite mit Kontaktformular gearbeitet und jeder eingegangene Kontakt im BackOffice komplett manuell und per Telefon bearbeitet und beraten. Innerhalb von 30 Tagen kam der erste Signup.

Folgende Tipps helfen, einen erfolgreichen MVP zu bauen:

  • Es braucht als Vorausstzung einen konkreten, in 30 Sekunden erzählbaren Wertschöpfungsprozess. Falls der nicht da ist: Zurück ans Business-Canvas-Reissbrett.
  • So wenig Technologie wie möglich. Wo immer möglich ersetzen Sie Investitionen in Technologie durch einen Quick Fix.
  • Der MVP muss Kundennutzen stiften. Das wird über ein nutzengerechtes Pricing validiert. Der Preis darf auf keinen Fall unter Marktwert angesetzt sein.
  • Die Profitabilität darf im MVP ruhig negativ sein, aber nicht wegen einem zu tief angesetzten Pricing, sondern wegen den anfänglich hohen Kosten, respektive der Ineffizienz im Wertschöpfungsprozess.
  • Der Gründer-Team soll alle Schritte selbst manuell ausführen können. Das garantiert, dass wichtige Learnings früh gemacht werden und Herausforderungen in Bezug auf eine spätere Skalierung sofort sichtbar werden.
    Was kommt nach dem MVP?

Nach einem erfolgreichen MVP ist das Gründer-Team in jedem Fall extrem gestresst. Denn die Nachfrage ist da, die Aufträge kommen rein, aber es mangelt an Ressourcen um das Projekt über Wasser zu halten. Jetzt müssen die Löcher gestopft werden. Gemäss dem “Fake it until you make it” Ansatz wird jetzt Schritt für Schritt von “Faking” auf “Making” umgestellt, Prozesse automatisiert, digitalisiert und profesionalisiert. Die grösste Herausforderung wird jetzt sein, die hohe Kundenzufriedenheit aufrechtzuerhalten.

Jetzt, mit dem ersten – wenn auch kleinen – Erfolg in der Tasche, macht online Marketing, Growth Hacking und Investorensuche Sinn.

Viel Erfolg!

Set up letsencrypt on linux

Its actually pretty easy:

Installing is helped with by https://certbot.eff.org/#debianjessie-apache

Make sure the webserver is running, then point certbot to the web root and add all the domains you want to get covered:

certbot certonly --webroot -w /var/www/spanischschulezurich.ch/ -d spanischschulezurich.ch -d www.spanischschulezurich.ch

For auto-renewal, at the following as a file into /etc/cron.daily/:

#!/bin/sh
certbot renew --post-hook "service apache2 restart"
# certbot renew --post-hook "service nginx restart"

Add the new certs to the web server config.

# Apache:
SSLCertificateFile /etc/letsencrypt/live/spanischschulezurich.ch/fullchain.pem  
SSLCertificateKeyFile /etc/letsencrypt/live/spanischschulezurich.ch/privkey.pem

# nginx:
ssl_certificate /etc/letsencrypt/live/spanischschulezurich.ch/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/spanischschulezurich.ch/privkey.pem;

Dont forget to restart the web servers.

Web Server Setup

Depending on the setup exlusions for the letsencrypt verification url have to be added.

Apache

add RewriteCond %{REQUEST_URI} !\.well-known/acme-challenge before every applicable RewriteRule in your virtual host or .htaccess config.

gitlab ci – execute .gitlab-ci.yml locally with gitlab runner (gitlab-ci-multi-runner)

Local Installation on Mac OS X

  • see https://gitlab.com/gitlab-org/gitlab-ci-multi-runner/blob/master/docs/install/osx.md (you dont have to register your local runner with gitlab)
  • almost certainly you want to run the runner in a docker container. Install docker.
  • add a public docker image to your .gitlab-ci.yml (for example add image: python:alpine as first line of your .gitlab-ci.yml or select another one from here https://store.docker.com)

Local Execution

  • go to your project’s root
  • execute gitlab-ci-multi-runner exec docker deploy_dev (where deploy_dev is the job defined in the projects .gitlab-ci.yml)

If you have variables in your .gitlab-ci.yml (and almost certainly you will) you can load values locally into these variables as follows:

gitlab-ci-multi-runner exec docker deploy_dev --env ANSIBLE_PROJECT_DEPLOY_KEY="$ANSIBLE_PROJECT_DEPLOY_KEY" --env SECRETS_YML="$SECRETS_YML" --env SERVER_SSH_KEY="$SERVER_SSH_KEY"

Hint: whole text file contents can be loaded into bash variables as such:

SECRETS_YML=`cat ./credentials/secrets.yml`

Sample .gitlab-ci.yml

image: python:alpine

before_script:
  # install required packages
  - apk update && apk add openssh-client python git python python-dev ansible
  - pip install --upgrade pip
  - pip install boto httplib2

  # trust gitlab.com
  - mkdir ~/.ssh/
  - touch ~/.ssh/known_hosts
  - ssh-keyscan gitlab.com >> /root/.ssh/known_hosts

  # dump ssh key
  - echo "$ANSIBLE_PROJECT_DEPLOY_KEY" > ansible-project-deploy-key.pem
  - chmod 600 ansible-project-deploy-key.pem

  # Run ssh-agent (inside the build environment)
  - eval $(ssh-agent -s)

  # clone the ansible script
  # http://superuser.com/questions/232373/how-to-tell-git-which-private-key-to-use
  - ssh-agent sh -c "ssh-add ansible-project-deploy-key.pem; git clone git@gitlab.com:what-digital/deploy-cvcube.git deploy-script"

  # get deploy script
  - cd deploy-script
  - git submodule update --recursive

  # copy credentials to their place
  - mkdir credentials
  - echo "$SERVER_SSH_KEY" > credentials/server-dev.pem
  - echo "$SERVER_SSH_KEY" > credentials/server-stage.pem
  - echo "$SERVER_SSH_KEY" > credentials/server-production.pem
  - echo "$SECRETS_YML" > credentials/secrets.yml
  - chmod 600 -R credentials/*


stages:
  - deploy

deploy_production:
  script:
    - ./deploy production 0-local.yml
    - ./deploy production 3-deploy-site.yml
  stage: deploy
  only:
    - master

deploy_stage:
  script:
    - ./deploy stage 0-local.yml
    - ./deploy stage 3-deploy-site.yml
  stage: deploy
  only:
    - stage

deploy_dev:
  script:
    - ./deploy dev 0-local.yml
    - ./deploy dev 3-deploy-site.yml
  stage: deploy
  only:
    - dev

DjangoCMS Migration from sqlite3 to postgres

Big surprise: Dumping from sqlite3 doesnt seem to generate SQL that can be read correctly by postgres.

Thankfully, in django we have a high-level export / import function.

Export everything to json from db.sqlite3:

./manage.py dumpdata > db.json

Then switch your local djangoCMS installation to postgres (don’t forget to reload your env vars in case they contain your db settings).

createdb db-name
./manage migrate
# the following works on a mac (possibly because of the Postgres.app)
psql
# the following tables need to be flushed because they are populated with default data that collides with the imported data
delete from auth_group_permissions; delete from auth_permission; delete from django_admin_log; delete from django_content_type;
# now you can import
./manage.py loaddata db.json
# doesnt hurt
./manage.py cms fix-tree

automatic .env sourcing with virtualenv

add this to your .virtualenvs/project-name/bin/postactivate:

#!/bin/bash
# This hook is sourced after this virtualenv is activated.

if [ -f ${PWD}/.env ]; then
    echo "activating .env..."
    set -a
    . ${PWD}/.env
    set +a
fi

The .env file is now sourced on activating the environment.

WordPress Shortcuts

Search & Replace the Base URL in a multi site setup

sed -i.bak "s/http:\/\/pfjournal.dev.infel.ch\//http:\/\/pfjournal.local\//g" pfj-20170112135105.sql

Locally import database in MAMP on Mac OS X

/Applications/MAMP/Library/bin/mysql --host=localhost -uroot -proot postfinance < /Users/mario/Downloads/pfj-20170112135105.sql