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();

Monday, 28 October 2019

Kenya’s Twiga Foods eyes West Africa after $30M raise led by Goldman

Kenya’s Twiga Foods has raised a total of $30 million from lenders and investors led by Goldman Sachs.

The B2B food distribution company financed $6.25 million of the funding in convertible debt and $23.75 million in equity, classified as a Series B round. IFC, TLcom Capital, and Creadev joined Goldman on the VC side.

Twiga will use the funds to set up a distribution center in Nairobi and deepen its conversion to offering supply chain services for both agricultural and FMCG products.

The Nairobi based company will invest in expanding into more cities in Kenya, including Mombasa. Twiga is also targeting Pan-African expansion by third quarter 2020.

“We’re working on French West Africa…we see significant opportunity in those markets,” Twiga CEO Peter Njonjo told TechCrunch. The company will name the new country (or countries) in the following year, he added.Peter Njongo Twiga Foods CEO

Goldman Sachs confirmed to TechCrunch its lead on Twiga’s Series B funding. The U.S. based finance firm has backed several African startups, including e-commerce venture Jumia and South African fintech startup Jumo.

Twiga’s financing comes 11 months after a $10 million raise and announcement it would create additional revenue streams by moving into B2B supply chain for FMCG and other consumer products.

Prior to this, Twiga focused primarily on agricultural goods and connecting the product of farmers more efficiently to marketplaces.

The venture has moved quickly on diversifying its supply-chain product mix. “We’re not just doing fruits and vegetables…I’d say we’re at 50/50 now between FMCG and fresh,” said Njonjo.

“We’ve pivoted a bit as a company…we see our purpose as an organization around what I would call aggregating the informal retail, then using technology, and then using that buying power to essentially provide lower, better cost goods across cities,” he said.

Co-founded in Nairobi in 2014 by Njonjo and Grant Brooke, Twiga Foods serves around 3,000 outlets a day with produce through a network of 17,000 farmers and 8,000 vendors. Parties can coordinate goods exchanges via mobile app using M-Pesa mobile money for payment.

The company has reduced typical post-harvest losses in Kenya from 30% to 4% for produce brought to market on the Twiga network, according to Njonjo.

Transferring these gains from improved supply-chain to a wider variety of food products has upside for economies and and consumers, he believes.

“[If you] get farmers now producing at large scale and supplying into you, and manufacturers that don’t need to invest in distribution systems, it has huge benefit,” said Njonjo.

“Think about in some of these economies, if you’re spending 55% of disposable income on food, if that number were to go down to 40% — because of…gaining efficiency — what you’ve done is to release 15% for consumers to spend for other things.”

As TechCrunch reported in November, Twiga Foods’ consistent volume and revenue flow from agricultural goods provides a foundation to add other product categories to its B2B network.

“If we can build a business around fresh fruit and vegetables…It’s now much easier to lay things over that would have been very expensive to get to end retailers,” Twiga co-founder Grant Brooke said.

This could put the startup in a position to enter or supply B2C e-commerce with more favorable margins than existing players, i.e., online retailer Jumia — with high fulfillment expenses.

On that prospect, “It’s not something we”re thinking about from a strategic standpoint,” said CEO Njonjo.

But Twiga has factored for its advantages in the B2C e-commerce space. “Let me put it this way, if you’re able to serve Nairobi’s 180,000 retailers, it means that the furthest customer would be less than 2 kilometers away from any shop. That’s the power of building a B2C business on top of a B2B platform. So definitely, the potential is there,” said Njonjo.

That leaves some room for conjecture that Twiga Foods could pivot toward supplying or entering online retail in Africa.

For now the company will focus on performance metrics around its current model.

“We’re not sharing data around revenue and profitability. But…over the next 12 months as we scale, our unit economics is front and center to ensure we’re growing our margins faster than our costs,” said Njonjo.

 



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

0 comments:

Post a Comment

Blog Archive

Definition List

Unordered List

Support