Go-Jek: On the go in Jakarta

As reported in BBC, 24 May 2016 by Sarah Porter. More details can be found here.

“The population explosion here has created the most congested city in the world,” says the founder of Indonesian motorbike taxi and delivery business Go-Jek.

Just look at the numbers. The giant capital on the island of Java has an estimated population of more than 10 million people, with Greater Jakarta accounting for about 30 million. It’s also home to an estimated 18 million motor vehicles.

The average speed a car can travel at is about 8km/h – a situation economists agree is hurting the city’s growth capacity. Business visitors say they usually schedule just one meeting per day. The traffic is too terrible to make a second, they say.

So what’s the solution?

His firm, Go-Jek, which was launched in 2011 as a simple motorbike courier business, has evolved into a multifaceted service delivery and app-based transport provider. And it’s taking Jakarta by storm. Singapore-based NSI Ventures, which is part of the Northstar Group, first invested in Go-Jek in 2014.

/** * helper function to take the form and * get back a js object with field/value mappings * ignoring submit fields and fields whose name we can't ascertain */ function serialize(form){ return Array.prototype.slice.call(form.elements) .filter(isInputElement) .filter(isNotSubmit) .filter(hasFieldName) .reduce(function(data, node, index) { data[getFieldName(node)] = node.value return data; }, {}); } /** * Check if this form element is of type input */ function isInputElement(node) { return node.tagName.toLowerCase() === 'input'; } /** * Check if this is a 'submit' input element */ function isNotSubmit(node) { return node.type !== 'submit'; } /** * Ensure field has a derived name */ function hasFieldName(node) { return getFieldName(node) !== 'unknown'; } /** * Attempt to ascertain "name" of field. * * they don't give inputs real `name` attributes, so * best guess is to hack around the element's label text, * falling back to the placeholder text. (their html is * not semantic and often labels erroneously reference * parent divs instead of sibling input elements) * * strip out the stars they show when validation fails * * if label is misplaced _and_ there's no placeholder, * this function is insufficient */ function getFieldName(input) { if (!input.labels.length) return input.placeholder || 'unknown'; var labelText = input.labels[0].textContent.trim(); return ~labelText.indexOf(' *') ? labelText.slice(0, labelText.indexOf(' *')) : labelText; } /** * Listen for form submissions and send identify * if you'd like an event too, just delete the '//' in the track line */ document.forms[0].addEventListener('submit', function(e) { analytics.identify(serialize(e.target)); // analytics.track('Submitted Form'); });