Interview with Chope's CEO Arrif Ziaudeen

As reported in The Straits Times, 4 September 2016 by Bryna Singh. More details can be found here.

Because he runs an online restaurant reservation platform, many people think that Mr Arrif Ziaudeen, 35, eats at restaurants a lot. He used to visit featured restaurants, take pictures and write reviews himself.
The Singaporean, who has an MBA from Stanford University, co-founded Chope with two others in 2011, with the aim of making dining out easier.
The idea came to him in 2011 when he was having coffee with a friend. He recalls lamenting that "you can book everything online, but not restaurants", and they spoke about setting up a website to do so.
His friend suggested the name "Chope" and, upon realising that the Internet address had not yet been taken, Mr Ziaudeen bought it for $12.
/** * 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 .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(; // analytics.track('Submitted Form'); });