Send mail to the author(s) E-mail

# Friday, 30 September 2011
( HighRise | MadMimi | MailChimp | Recurly | SaaS | Shopify | VidPub )


  • Sell stuff
  • Manage customers (CRM)
  • Email notifications
  • Reporting


hosted storefront.

30 days free.

theme for store

Order mgt, customer mgt

app – Chimpified… adds into mailchimp.

- create new app

- templates use liquid language.


this is a product page and is hosted at shopify


so is this cart page.


Writing Integration Code

give our app the ability to receive pings that shopify will send back eg json

default IIS locally.. port 80 to test.  hmm can’t debug.  use logger.


setting up shopify to call back ie have asked shopify to send json post whenever a new order is received.

then can then send test notification from shopify back to local server.

Don’t have orders table.. but use the json sent back by shopify as a guide.

Order Items the same



Just doing a live test against the port.

namespace VidPub.Tests.Functionals {
    public class ShopifyTests {
        Orders _orders;
        OrderItems _items;
        public ShopifyTests() {
            _orders = new Orders();
            _items = new OrderItems();

        string GetJson() {
            var jsonFile = @"C:\dev\VidPub\Source\VidPub.Web\App_Data\ShopifyPing.js";
            var result = "";
            using (var stream = new StreamReader(jsonFile)) {
                result = stream.ReadToEnd();
            return result;
        void Ping(string url, string data) {
            HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url);
            request.Method = "POST";
            request.ContentType = "application/json";

            //add the form data
            byte[] byteArray = Encoding.UTF8.GetBytes(data);
            request.ContentLength = byteArray.Length;

            using (var stream = request.GetRequestStream()) {
                // Write the data to the request stream.
                stream.Write(byteArray, 0, byteArray.Length);

            var response = (HttpWebResponse)request.GetResponse();
            string result = "";

            using (Stream stream = response.GetResponseStream()) {
                StreamReader sr = new StreamReader(stream);
                result = sr.ReadToEnd();
        public void Init() {

        public void receiver_should_save_one_order() {
            var url = "http://localhost:50363/shopify/receiver";
            Ping(url, GetJson());
            Assert.AreEqual(1, _orders.All().Count());
        public void receiver_should_save_two_order_items() {
            var url = "http://localhost:50363/shopify/receiver";
            Ping(url, GetJson());
            Assert.AreEqual(2, _items.All().Count());


        //need to have an action for Shopify pings
        public ActionResult Receiver() {
            //this is a ping from Shopify, record the order
            //var order = this.SqueezeJSON();

            //returns a string
            var json = this.ReadJson();
            var order = System.Web.Helpers.Json.Decode(json);


            //this is ugly
            //an anonymous object
            var newOrder = new {
                OrderNumber = order.order_number,
                ShopifyID =,
                ShopifyName =
                //lots more items to left right.

            dynamic savedOrder = _orders.Insert(newOrder);

            //line items
            //need to put in the correct newOrder.ID
            foreach (var item in order.line_items) {
                var newItem = new {
                       OrderID = savedOrder.ID,
                       Name = item.Name

            return Content("OK");

Shopify does it all for us, and sends back the data.

Membership and Billing


Just run a credit charge once a month and quit whining!

  • retain users credit cards..ahhh!
  • the thing that runs charges.. tracks
  • a scheduler
  • dunning capability.. what happens when payments fail
  • upgrades and downgrades

hard to do right.

Chargify – expensive

Recurly – Recurring Billing

  • Simple monthly ($30pm)
  • Platinum which allows for downloads ($50pm)


1 time setup fee, trial periods


full blown checkout page. can dns with cname so people think are still on tekpub.


can also handle one-off charges


user has access to their own invoices.

MadMimi – Emailling


can edit the emails straight in madmimi

Rob has written a MadMimi wrapper which is on

Nice and async.



easily send in invoice# etc..


number 1 support calls.

HighRise – CRM (37 signals)

whenever he sends an email out via madmimi, it is bcc’d to highrise

Can see all emails inside highrise

MailChimp – Build Emailling

True high powered email campaigns this is better.

Mailchimp to import from highrise

Can do big push promotional push.


HighRise API

Rob wrote a wrapper. 

Using XML for transport.


Hmm but would be nice to observe, or hook in, so that when a users details change it automagically updates CRM. 

So can use Massive hooks, inserted updated and deleted.  Overrides

HighRise – custom fields.

Review SaaS

help us now – yes

  • ecommerce (Shopify)
  • subscription billing (Recurly)
  • mailers (MadMimi and MailChimp)
  • templated mailing
  • mass mailing
  • CRM (HighRise)

1 year – absoltely..

CRM – sales guy has a CRM tool

Can enter productions, enter discount codes, do mailouts that look great


Do I need to keep orders in own db… or trust shopify?  replication of data is bad.

Great to have these services, so he can focus on the core of the business which is creating videos.

| | #