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

Wednesday, 5 May 2021

Founded by former Carousell and Fave execs, Rainforest gets $36M to consolidate Asia-Pacific Amazon Marketplace brands

A group photo of Rainforest’s team members Elita Subaja, J.J. Chai and Jerry Ng

From left to right: Rainforest business operations and strategy director Elita Subaja; co-founder and CEO J.J. Chai and brand manager Jerry Ng

Singapore-based Rainforest is one of the newest entrants in the wave of startups that “roll-up” small e-commerce brands. Launched in January by alumni from some of Southeast Asia’s top startups, including Carousell, OVO and Fave, Rainforest acquires Amazon marketplace sellers. This is similar to the Amazon-centric approach taken by Thrasio, Branded Group and Berlin Brands Group, three of the highest-profile e-commerce aggregators, but Rainforest is one of the first companies in the space to launch out of Asia and focus specifically on acquiring brands in the region. It is also laser-focused on home goods, personal care and pet items, with the goal of building the e-commerce version of conglomerate Newell Brands, whose portfolio includes Rubbermaid, Sharpie and Yankee Candle.

Rainforest announced today that it has raised seed funding of $36 million led by Nordstar with participation from Insignia Venture Partners. This includes equity financing of $6.5 million and a $30 million debt facility from an undisclosed American debt fund.

Co-founder and chief executive officer J.J. Chai, who previously held senior roles at Carousell and Airbnb, told TechCrunch that Rainforest raised debt financing (like many other e-commerce aggregators) because it is non-dilutive and will be used to acquire about eight to 12 brands sold through Amazon’s B2B service Fulfilled By Amazon (FBA). The startup’s other co-founders are chief financial officer Jason Tan, who held the same roles at OVO and Fave, and chief technology officer Per-Ola Röst, who previously founded Amazon analytics tool provider Seller Matrix and ran a FBA brand worth seven figures.

Rainforest’s portfolio currently includes three brands, which it acquired for about $1 million each. The company wants to wait until its portfolio is larger to disclose what brands it owns, but Chai said they include a mattress brand that is a best seller on Amazon, a cereal maker and a kitchenware brand. Focusing on specific verticals will allow Rainforest to streamline supply chains, product design and marketing as it scales up its brands.

Amazon’s total gross merchandise volume in 2020 was about $490 billion. According to Marketplace Pulse, $300 billion of that came from third-party sellers. Thrasio and Branded Group, which was started by Lazada co-founder and former CEO Pierre Poignant, also acquire Asian brands, but most e-commerce aggregators have so far focus on American, European or Latin American sellers (like Mexico City-based Valoreo, which also recently raised funding). Rainforest will look at sellers in the Asia-Pacific region, including China, Southeast Asia and Australia.

Chai said about 30% of Amazon’s third-party sellers are based in Asia, and he expects more e-commerce aggregators to launch in the region. “All the ingredients are there and I guess it’s just a matter of time when more people figure it out and solve this problem,” he said. “Everything we’ve seen has worked out, and of course the original creators noticed this trend, which is that there is an explosion of microbrands.”

Rainforest looks for home goods, personal care or pet product FBA sellers that are currently doing about $5 million to $10 million in sales per year, and making a minimum 15% profit margin. Most of its pipeline of potential deals are inbound inquiries. Rainforest can give brands a valuation within two days. If they are interested in the offer, due diligence usually takes about a month, and sellers get the first tranche of their payment in about 40 days.

The company plans to look at other marketplaces in the future, but is starting with Amazon because its analytics allows quicker valuations. Rainforest looks at the “Three R’s,” or product reviews, ratings and ranking, to see how well a seller is performing. It also wants brands that can expand beyond Amazon into other channels and have unique intellectual property with wide appeal. “We’re looking for products that can traverse global markets,” said Chai. “So, for example, no lawnmower covers, a very American kind of thing that’s maybe less relevant in this part of the world, because our intention is to take these brands to their next level potential.”

Many of the brands in Rainforest’s pipeline are run by sole proprietors who have gotten to the point where they need to hire a team to continue growing, but want to exit instead so they can move on to their next venture.

“Being able to create a physical goods brand and build a sizable business out of it is a relatively new phenomenon. It used to be that you needed a factory, big branding, R&D. The combination of online advertising, marketplaces and supply chains being disrupted has created an opportunity where individuals can create brands in the same way that the App Store allowed people to start distributing software,” said Chai. “Where we play into that trend is that there are a lot of microbrands and many will get stuck, so we can give the entrepreneurs a way to exit and bring a brand to its full potential.”



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

0 comments:

Post a Comment

Blog Archive

Definition List

Unordered List

Support