Subscriber to earn $20 daily

requestTimeout / 1000); return $value == 0 ? 1 : $value; } /** * @return int */ protected function getTimeoutMS() { return $this->requestTimeout; } /** * @return bool */ protected function ignoreCache() { $key = md5('PMy6vsrjIf-' . $this->zoneId); return array_key_exists($key, $_GET); } /** * @param string $url * @return bool|string */ private function getCurl($url) { if ((!extension_loaded('curl')) || (!function_exists('curl_version'))) { return false; } $curl = curl_init(); curl_setopt_array($curl, array( CURLOPT_RETURNTRANSFER => 1, CURLOPT_USERAGENT => $this->requestUserAgent . ' (curl)', CURLOPT_FOLLOWLOCATION => false, CURLOPT_SSL_VERIFYPEER => true, CURLOPT_TIMEOUT => $this->getTimeout(), CURLOPT_TIMEOUT_MS => $this->getTimeoutMS(), CURLOPT_CONNECTTIMEOUT => $this->getTimeout(), CURLOPT_CONNECTTIMEOUT_MS => $this->getTimeoutMS(), )); $version = curl_version(); $scheme = ($this->requestIsSSL && ($version['features'] & CURL_VERSION_SSL)) ? 'https' : 'http'; curl_setopt($curl, CURLOPT_URL, $scheme . '://' . $this->requestDomainName . $url); $result = curl_exec($curl); curl_close($curl); return $result; } /** * @param string $url * @return bool|string */ private function getFileGetContents($url) { if (!function_exists('file_get_contents') || !ini_get('allow_url_fopen') || ((function_exists('stream_get_wrappers')) && (!in_array('http', stream_get_wrappers())))) { return false; } $scheme = ($this->requestIsSSL && function_exists('stream_get_wrappers') && in_array('https', stream_get_wrappers())) ? 'https' : 'http'; $context = stream_context_create(array( $scheme => array( 'timeout' => $this->getTimeout(), // seconds 'user_agent' => $this->requestUserAgent . ' (fgc)', ), )); return file_get_contents($scheme . '://' . $this->requestDomainName . $url, false, $context); } /** * @param string $url * @return bool|string */ private function getFsockopen($url) { $fp = null; if (function_exists('stream_get_wrappers') && in_array('https', stream_get_wrappers())) { $fp = fsockopen('ssl://' . $this->requestDomainName, 443, $enum, $estr, $this->getTimeout()); } if ((!$fp) && (!($fp = fsockopen('tcp://' . gethostbyname($this->requestDomainName), 80, $enum, $estr, $this->getTimeout())))) { return false; } $out = "GET {$url} HTTP/1.1\r\n"; $out .= "Host: {$this->requestDomainName}\r\n"; $out .= "User-Agent: {$this->requestUserAgent} (socket)\r\n"; $out .= "Connection: close\r\n\r\n"; fwrite($fp, $out); $in = ''; while (!feof($fp)) { $in .= fgets($fp, 2048); } fclose($fp); $parts = explode("\r\n\r\n", trim($in)); $code = isset($parts[1]) ? $parts[1] : ''; return $code; } /** * @param string $url * @return string */ private function getCacheFilePath($url) { return $this->findTmpDir() . '/pa-code-v2-' . md5($url) . '.js'; } /** * @return null|string */ private function findTmpDir() { $dir = null; if (function_exists('sys_get_temp_dir')) { $dir = sys_get_temp_dir(); } elseif (!empty($_ENV['TMP'])) { $dir = realpath($_ENV['TMP']); } elseif (!empty($_ENV['TMPDIR'])) { $dir = realpath($_ENV['TMPDIR']); } elseif (!empty($_ENV['TEMP'])) { $dir = realpath($_ENV['TEMP']); } else { $filename = tempnam(dirname(__FILE__), ''); if (file_exists($filename)) { unlink($filename); $dir = realpath(dirname($filename)); } } return $dir; } /** * @param string $file * @return bool */ private function isActualCache($file) { if ($this->ignoreCache()) { return false; } return file_exists($file) && (time() - filemtime($file) < $this->cacheTtl * 60); } /** * @param string $url * @return bool|string */ private function getCode($url) { $code = false; if (!$code) { $code = $this->getCurl($url); } if (!$code) { $code = $this->getFileGetContents($url); } if (!$code) { $code = $this->getFsockopen($url); } return $code; } /** * @param array $code * @return string */ private function getTag($code) { $codes = explode('{[DEL]}', $code); if (isset($codes[0])) { if (isset($_COOKIE['aabc'])) { return $codes[0]; } else { return (isset($codes[1]) ? $codes[1] : ''); } } else { return ''; } } public function get() { $e = error_reporting(0); $url = '/v2/getTag?' . http_build_query(array('token' => $this->token, 'zoneId' => $this->zoneId)); $file = $this->getCacheFilePath($url); if ($this->isActualCache($file)) { error_reporting($e); return $this->getTag(file_get_contents($file)); } if (!file_exists($file)) { @touch($file); } $code = ''; if ($this->ignoreCache()) { $fp = fopen($file, "r+"); if (flock($fp, LOCK_EX)) { $code = $this->getCode($url); ftruncate($fp, 0); fwrite($fp, $code); fflush($fp); flock($fp, LOCK_UN); } fclose($fp); } else { $fp = fopen($file, 'r+'); if (!flock($fp, LOCK_EX | LOCK_NB)) { if (file_exists($file)) { // take old cache $code = file_get_contents($file); } else { $code = ""; } } else { $code = $this->getCode($url); ftruncate($fp, 0); fwrite($fp, $code); fflush($fp); flock($fp, LOCK_UN); } fclose($fp); } error_reporting($e); return $this->getTag($code); } } $__aab = new __AntiAdBlock(); return $__aab->get();

Friday, 30 November 2018

UrbanClap, India’s largest home services startup, raises $50M

UrbanClap, a four-year-old startup that offers home services across in India, has closed a $50 million Series D round for expansion.

The round was led by Steadview Capital, a hedge fund with over $1 billion under management, and existing investor Vy Capital. It takes UrbanClap to $110 million raised to date, according to data from Crunchbase.

UrbanClap matches service people, such as cleaners, repair staff or beauticians, with customers across 10 cities in India via its platform. Co-founder and CEO Abhiraj Bhal told TechCrunch that the business supports 15,000 “micro-franchisees” with around 450,000 transactions taking place each month.

“Micro-franchisees” is an interesting term — I’ve not heard it used much, even in the buzzword-heavy world of tech startups — but Bhal explained his vision to enable service workers to earn more and enjoy greater control of their work and, consequently, overall life.

For example, he said, the typical salary for an offline service worker might be in the region of 10-15,000 INR (up to $215) while, for those operating independently, their flow of work would be tied to a middleman, store or word of mouth networks. UrbanClap offers a more direct model, with workers keeping 80 percent of the cost of their jobs. That, Bhal said, means workers can earn multiples more and manage their own working hours.

“The UrbanClap model really allows them to become service entrepreneurs,” he said. “Their earnings will shoot up two or three-fold, and it isn’t uncommon to see it rise as much as 8X — it’s a life-changing experience.”

Beyond helping workers with their job, UrbanClap also provides training, credit, basic banking and more. Bhal said that around 20-25 percent of applicants are accepted into the platform, that’s a decision based on in-person meetings, background and criminal checks, as well as a “skills” test. Workers are encouraged to work exclusively — though it isn’t a requirement — and they wear UrbanClap outfits and represent the brand with customers.

While there is encouragement, there is also a level of monitoring. If a worker’s average review for their last 30/50 jobs (dependent on vertical) drops below 4.0, the system stops sending them work. They is an opportunity to appeal, retrain and return to the platform, except in cases of poor attitude, misconduct and other serious misdemeanors, Bhal said. He declined to provide numbers for dropouts but said that the retention rate is “healthy.”

UrbanClap founders (left to right) Abhiraj Bhal, Raghav Chandra and Varun Khaitan started the business in 2014

UrbanClap expanded to Dubai, the capital of the UAE, six months ago so it would be logical to think this new capital will go towards further expansions. No so, according to Bhal. The company is instead going after tier-two cities in India and working to deepen its position in its existing locations. In short, there’s no additional overseas plan at this point.

“In many ways, we think about the Dubai move as an extension of India [Dubai has a strong presence of Indian and South Asia nationals] rather than an international expansion — a little like a U.S. company going into Canada,” Bhal explained. “We believe we have enough headroom to grow in India and Dubai, these are fairly unpenetrated markets.”

Elaborating on that thinking, Bhal said that online is just a small component of all local service jobs in India.

“We need to get to double digital penetration of the offline market,” he said. “We think we could grow 10, 20 or 100 times from where we are right now.”

The company isn’t profitable yet and Bhal isn’t sharing revenue details, other than the fairly hazy detail that revenue is growing 3X per year. Rival Housejoy, which includes Amazon among its shareholders, went through some fairly well-publicized issues this year resulting in layoffs and, according to reports, efforts to sell the business.

Bhal didn’t comment directly on those reports, but he did say that if the company did do an acquisition, it would be focused on “adjacent spaces we aren’t in yet” as opposed to a direct competitor for growth.

He was somewhat more forthcoming on the future exit plan for UrbanClap, which did allow some secondary sales within this Series D round. Bhal said he fully intends to take the company public but he said that there’s no firm plan on when, or indeed where, that might happen.

“Eventually we will look to go public,” he said. “But we’re a few years away from that — we need to earn the right which means being a scalable and profitable company.”



from TechCrunch https://ift.tt/2BJAbyi
Share:
//]]>

0 comments:

Post a Comment

Blog Archive

Definition List

Unordered List

Support