├── .gitignore ├── src ├── index.js ├── utils │ ├── Banner.js │ ├── removeNull.js │ ├── Logger.js │ └── BrowserOption.js └── helper │ ├── extractLink.js │ ├── waitForReviews.js │ └── extractData.js ├── package.json ├── LICENSE ├── README.md ├── index.js └── data.csv /.gitignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | /data.csv -------------------------------------------------------------------------------- /src/index.js: -------------------------------------------------------------------------------- 1 | const { extractData } = require("./helper/extractData"); 2 | const { extractLinks } = require("./helper/extractLink"); 3 | const { waitForReviews } = require("./helper/waitForReviews"); 4 | module.exports = { 5 | extractLinks, 6 | waitForReviews, 7 | extractData 8 | } -------------------------------------------------------------------------------- /src/utils/Banner.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | Banner: function(){ 3 | return ` 4 | ▒█▀▄▀█ ░█▀▀█ ▒█▀▀█ ▒█▀▀▀█ ▒█▀▀▄ ▒█░▒█ ▒█▀▄▀█ ▒█▀▀█ ▒█▀▀▀ ▒█▀▀█ 5 | ▒█▒█▒█ ▒█▄▄█ ▒█▄▄█ ░▀▀▀▄▄ ▒█░▒█ ▒█░▒█ ▒█▒█▒█ ▒█▄▄█ ▒█▀▀▀ ▒█▄▄▀ 6 | ▒█░░▒█ ▒█░▒█ ▒█░░░ ▒█▄▄▄█ ▒█▄▄▀ ░▀▄▄▀ ▒█░░▒█ ▒█░░░ ▒█▄▄▄ ▒█░▒█ 7 | by: @Tegal1337`; 8 | }, 9 | } -------------------------------------------------------------------------------- /src/helper/extractLink.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @version 1.0.0 3 | * @license MIT 4 | * @example node index.js 5 | * @author: Abdul Muttaqin 6 | */ 7 | async function extractLinks(page) { 8 | return page.$$eval('a[href]', anchors => { 9 | return anchors 10 | .map(anchor => anchor.getAttribute('href')) 11 | .filter(href => href.includes('https://www.google.com/maps/place/')); 12 | }); 13 | } 14 | module.exports = { 15 | extractLinks 16 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "enquirer": "^2.3.6", 4 | "express": "^4.18.2", 5 | "json2csv": "^6.0.0-alpha.2", 6 | "ora": "^8.2.0", 7 | "puppeteer": "^20.7.4" 8 | }, 9 | "name": "mapsdumper", 10 | "version": "1.0.0", 11 | "main": "index.js", 12 | "scripts": { 13 | "start": "node index.js" 14 | }, 15 | "author": "Abdul Muttaqin", 16 | "license": "MIT", 17 | "description": "dumping place and review with simple ways", 18 | "keywords": [ 19 | "maps", 20 | "googlemaps", 21 | "scraper" 22 | ] 23 | } 24 | -------------------------------------------------------------------------------- /src/utils/removeNull.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @version 1.0.0 3 | * @license MIT 4 | * @example node index.js 5 | * @author: Abdul Muttaqin 6 | */ 7 | function removeNulls(obj) { 8 | let isArray = obj instanceof Array; 9 | for (let k in obj) { 10 | if (obj[k] === null) { 11 | isArray ? obj.splice(k, 1) : delete obj[k]; 12 | } else if (typeof obj[k] == "object") { 13 | removeNulls(obj[k]); 14 | } 15 | if (isArray && obj.length != k) { 16 | removeNulls(obj); 17 | } 18 | } 19 | } 20 | 21 | module.exports = { 22 | removeNulls 23 | }; 24 | -------------------------------------------------------------------------------- /src/utils/Logger.js: -------------------------------------------------------------------------------- 1 | /** 2 | * @version 1.0.0 3 | * @license MIT 4 | * @example node index.js 5 | * @author: Abdul Muttaqin 6 | */ 7 | function Logger(message, color) { 8 | const timeString = `\x1b[37m[${new Date().toLocaleTimeString()}]\x1b[0m`; 9 | 10 | switch(color){ 11 | case "red": 12 | // red 13 | console.log(`${timeString} \x1b[1;31m${message}\x1b[0m`); 14 | break; 15 | case "yellow": 16 | // yellow 17 | console.log(`${timeString} \x1b[1;33m${message}\x1b[0m`); 18 | break; 19 | case "green": 20 | // bright green 21 | console.log(`${timeString} \x1b[1;32m${message}\x1b[0m`); 22 | break; 23 | default: 24 | // default white 25 | console.log(`${timeString} \x1b[1;37m${message}\x1b[0m`); 26 | break; 27 | } 28 | } 29 | 30 | module.exports = { 31 | Logger 32 | } 33 | -------------------------------------------------------------------------------- /src/utils/BrowserOption.js: -------------------------------------------------------------------------------- 1 | const { executablePath } = require("puppeteer") 2 | 3 | /** 4 | * @version 1.0.0 5 | * @license MIT 6 | * @example node index.js 7 | * @author: Abdul Muttaqin 8 | */ 9 | 10 | module.exports = { 11 | BrowserOption: function () { 12 | return { 13 | headless: "new", 14 | args: [ 15 | "--log-level=3", // fatal only 16 | "--no-default-browser-check", 17 | "--disable-infobars", 18 | "--disable-web-security", 19 | "--disable-site-isolation-trials", 20 | "--no-experiments", 21 | "--ignore-gpu-blacklist", 22 | "--ignore-certificate-errors", 23 | "--ignore-certificate-errors-spki-list", 24 | "--mute-audio", 25 | "--disable-extensions", 26 | "--no-sandbox", 27 | 28 | "--no-first-run", 29 | "--no-zygote", 30 | ], 31 | executablePath: executablePath("chrome") 32 | } 33 | } 34 | } 35 | 36 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2023 TEGALSEC 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 |
2 |

3 | 4 | ```elixir 5 | 6 | 7 | ▒█▀▄▀█ ░█▀▀█ ▒█▀▀█ ▒█▀▀▀█ ▒█▀▀▄ ▒█░▒█ ▒█▀▄▀█ ▒█▀▀█ ▒█▀▀▀ ▒█▀▀█ 8 | ▒█▒█▒█ ▒█▄▄█ ▒█▄▄█ ░▀▀▀▄▄ ▒█░▒█ ▒█░▒█ ▒█▒█▒█ ▒█▄▄█ ▒█▀▀▀ ▒█▄▄▀ 9 | ▒█░░▒█ ▒█░▒█ ▒█░░░ ▒█▄▄▄█ ▒█▄▄▀ ░▀▄▄▀ ▒█░░▒█ ▒█░░░ ▒█▄▄▄ ▒█░▒█ 10 | by: @Tegal1337 11 | 12 | ``` 13 | 14 |

MAPSDUMPER

15 | 16 | Demo 17 | • 18 | Installation 19 | • 20 | Feature 21 | • 22 | Credits 23 |

24 | A tool for dumping place details from Google Maps such as phone numbers, emails, websites, and reviews 25 |

26 |
27 | 28 | 29 | ## Demo 30 | 31 | 32 | 33 | ```bash 34 | $ see this DEMO in here > https://www.youtube.com/watch?v=jHwfN4i4M8A 35 | 36 | ``` 37 | 38 | ## Run / Installation 39 | How to run ? 40 | 41 | ```bash 42 | > git clone https://github.com/tegal1337/mapsdumper 43 | > cd mapsdumper 44 | > npm install 45 | > node index.js 46 | ``` 47 | 48 | 49 | ## Feature 50 | 51 | Feature | Status | 52 | | -------------:|------------- | 53 | | Get Adress | Ok| 54 | | Get Phone Number | Ok| 55 | | Get Website | Ok| 56 | | Get Reviews | Ok | 57 | | Get Review date | Ok | 58 | | Get Star Count per Review | Ok| 59 | 60 | ## Requirements 61 | 62 | - Windows / Linux 63 | - Google Chrome 64 | 65 | 66 | [![Donate](https://img.shields.io/badge/Donate-PayPal-green.svg)](https://www.paypal.me/fdciabdul) 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | -------------------------------------------------------------------------------- /src/helper/waitForReviews.js: -------------------------------------------------------------------------------- 1 | const delay = (ms) => new Promise((res) => setTimeout(res, ms)); 2 | /** 3 | * @version 1.0.0 4 | * @license MIT 5 | * @example node index.js 6 | * @author: Abdul Muttaqin 7 | */ 8 | async function waitForReviews(page) { 9 | const reviewsButtonXPath = "//button[contains(., 'Reviews')]"; 10 | const sortButtonXPath = '//button[.//span[contains(text(), "Sort")]]'; 11 | const newest = '//div[@role="menuitemradio"][.//div[contains(text(), "Newest")]]'; 12 | 13 | // use a library to run exponential backoff 14 | // https://www.npmjs.com/package/exponential-backoff 15 | 16 | backoff_seconds = 1; 17 | while (true) { 18 | try { 19 | await page.waitForXPath(reviewsButtonXPath, { timeout: 3000 }); 20 | break; 21 | } 22 | catch (err) { 23 | console.log('Reviews button not found'); 24 | if (backoff_seconds > 8) { 25 | console.log("the loop ran too many times, got passed 8, breaking") 26 | throw err; 27 | } 28 | console.log('Trying again in ' + backoff_seconds + ' seconds'); 29 | await delay(backoff_seconds * 1000); 30 | backoff_seconds *= 2; 31 | } 32 | } 33 | await page.waitForXPath(reviewsButtonXPath, { timeout: 3000 }); 34 | 35 | const reviewsButtons = await page.$x(reviewsButtonXPath); 36 | 37 | if (reviewsButtons.length > 0) { 38 | await reviewsButtons[0].click(); 39 | } else { 40 | throw new Error('Reviews button not found'); 41 | } 42 | 43 | await page.waitForXPath(sortButtonXPath); 44 | const [sortButton] = await page.$x(sortButtonXPath); 45 | 46 | if (sortButton) { 47 | await sortButton.click(); 48 | } else { 49 | throw new Error('Sort button not found'); 50 | } 51 | await delay(2000); 52 | 53 | await page.waitForXPath(newest); 54 | let [newestDiv] = await page.$x(newest); 55 | if (newestDiv) { 56 | await newestDiv.click(); 57 | } else { 58 | console.log("Element not found"); 59 | } 60 | await delay(3000); 61 | } 62 | 63 | module.exports = { 64 | waitForReviews, 65 | }; 66 | -------------------------------------------------------------------------------- /index.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | /** 3 | * @version 1.0.0 4 | * @license MIT 5 | * @example node index.js 6 | * @author: Abdul Muttaqin 7 | */ 8 | const puppeteer = require('puppeteer'); 9 | const { 10 | extractData, 11 | extractLinks 12 | } = require('./src'); 13 | const Enquirer = require('enquirer'); 14 | const enquirer = new Enquirer(); 15 | const fs = require('fs'); 16 | const { 17 | Logger 18 | } = require('./src/utils/Logger'); 19 | const Banner = require('./src/utils/Banner'); 20 | const { 21 | BrowserOption 22 | } = require('./src/utils/BrowserOption'); 23 | console.clear(); 24 | console.log(Banner.Banner()); 25 | async function scraperPlace(query, latlong) { 26 | const browser = await puppeteer.launch(BrowserOption()); 27 | Logger("Start the process ..", "green"); 28 | const page = await browser.newPage(); 29 | await page.setViewport({ 30 | width: 1366, 31 | height: 4268 32 | }); 33 | await page.goto('https://www.google.com/maps/search/' + encodeURIComponent(query) + '/?authuser=0&hl=en&entry=ttu'); 34 | Logger("Open Maps ..", "green"); 35 | const links = await extractLinks(page); 36 | let allData = []; 37 | for (let i = 0; i < links.length; i++) { 38 | let link = links[i]; 39 | Logger(`Open Links [ ${i+1} ]`, "green"); 40 | const scrapplace = await browser.newPage(); 41 | try { 42 | await scrapplace.setViewport({ 43 | width: 1366, 44 | height: 4268 45 | }); 46 | await scrapplace.goto(link); 47 | let data = await extractData(scrapplace); 48 | allData.push(data); 49 | } catch (error) { 50 | console.log(error) 51 | await scrapplace.close() 52 | } 53 | } 54 | await browser.close(); 55 | return allData; 56 | } 57 | 58 | async function scraperSinglePlace(url) { 59 | const browser = await puppeteer.launch(BrowserOption()); 60 | const scrapplace = await browser.newPage(); 61 | try { 62 | await scrapplace.setViewport({ 63 | width: 1366, 64 | height: 1268 65 | }); 66 | await scrapplace.goto(url); 67 | let data = await extractData(scrapplace); 68 | await browser.close() 69 | return data; 70 | } catch (error) { 71 | await scrapplace.close() 72 | } 73 | } 74 | 75 | async function main() { 76 | try { 77 | const methodAnswer = await enquirer.prompt({ 78 | type: 'select', 79 | name: 'method', 80 | message: 'What do you want to do?', 81 | choices: ['Scrape a place', 'Scrape a single place'] 82 | }); 83 | 84 | if (methodAnswer.method === 'Scrape a place') { 85 | const placeAnswers = await enquirer.prompt([{ 86 | type: 'input', 87 | name: 'query', 88 | message: 'Enter the query to scrape' 89 | }]); 90 | try { 91 | await scraperPlace(placeAnswers.query, placeAnswers.latlong); 92 | } catch (error) { 93 | console.log(error) 94 | Logger("Something wrong ..", "red"); 95 | } 96 | 97 | } else if (methodAnswer.method === 'Scrape a single place') { 98 | const urlAnswer = await enquirer.prompt({ 99 | type: 'input', 100 | name: 'url', 101 | message: 'Enter the URL of the place to scrape' 102 | }); 103 | try { 104 | await scraperSinglePlace(urlAnswer.url); 105 | } catch (error) { 106 | Logger("Something wrong ..", "red"); 107 | } 108 | } 109 | } catch (err) { 110 | Logger("No Reviews Found", "red"); 111 | } 112 | } 113 | 114 | main(); -------------------------------------------------------------------------------- /src/helper/extractData.js: -------------------------------------------------------------------------------- 1 | require("console"); 2 | const { Logger } = require("../utils/Logger"); 3 | const { waitForReviews } = require("./waitForReviews"); 4 | const fs = require('fs'); 5 | const { Parser } = require('json2csv'); 6 | 7 | async function extractData(page) { 8 | try { 9 | Logger("Extracting data ..", "green"); 10 | 11 | const dataplace = await page.evaluate(() => { 12 | const title = document.querySelector('h1')?.innerText || ''; 13 | const ratingText = document.querySelector('div.F7nice')?.innerText || ''; 14 | 15 | let rating = null; 16 | let numberOfReviews = null; 17 | 18 | if (ratingText) { 19 | rating = parseFloat(ratingText.slice(0, 3).replace(',', '.')); 20 | numberOfReviews = parseInt(ratingText.slice(3).replace(/\D/g, ''), 10); 21 | } 22 | 23 | const category = document.querySelector('button[jsaction="pane.rating.category"]')?.innerText || ''; 24 | const address = document.querySelector('button[data-item-id="address"]')?.innerText || ''; 25 | const website = document.querySelector('a[data-item-id="authority"]')?.href || ''; 26 | const phone = document.querySelector('button[data-item-id^="phone:tel:"]')?.getAttribute('data-item-id').replace('phone:tel:', '') || ''; 27 | const imgLink = document.querySelector('.RZ66Rb.FgCUCc img')?.src || ''; 28 | 29 | return { 30 | title, 31 | rating, 32 | numberOfReviews, 33 | category, 34 | address, 35 | website, 36 | phone, 37 | imgLink, 38 | }; 39 | }); 40 | 41 | Logger(`Get data from [${dataplace.title}] `, "yellow"); 42 | 43 | await waitForReviews(page); 44 | 45 | Logger("Looking for reviews ..", "green"); 46 | 47 | await page.waitForSelector('::-p-xpath(//div[contains(@class, "jftiEf") and contains(@class, "fontBodyMedium")])'); 48 | 49 | const reviewData = await page.evaluate(() => { 50 | const reviews = []; 51 | 52 | const reviewContainers = document.evaluate( 53 | '//div[contains(@class, "jftiEf") and contains(@class, "fontBodyMedium")]', 54 | document, 55 | null, 56 | XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, 57 | null 58 | ); 59 | 60 | for (let i = 0; i < reviewContainers.snapshotLength; i++) { 61 | const reviewElement = reviewContainers.snapshotItem(i); 62 | 63 | const nameElement = document.evaluate( 64 | './/div[contains(@class, "d4r55")]', 65 | reviewElement, 66 | null, 67 | XPathResult.FIRST_ORDERED_NODE_TYPE, 68 | null 69 | ).singleNodeValue; 70 | 71 | const imageElement = document.evaluate( 72 | './/img[contains(@class, "NBa7we")]', 73 | reviewElement, 74 | null, 75 | XPathResult.FIRST_ORDERED_NODE_TYPE, 76 | null 77 | ).singleNodeValue; 78 | 79 | const dateElement = document.evaluate( 80 | './/span[contains(@class, "rsqaWe")]', 81 | reviewElement, 82 | null, 83 | XPathResult.FIRST_ORDERED_NODE_TYPE, 84 | null 85 | ).singleNodeValue; 86 | 87 | const reviewTextElement = document.evaluate( 88 | './/span[contains(@class, "wiI7pd")]', 89 | reviewElement, 90 | null, 91 | XPathResult.FIRST_ORDERED_NODE_TYPE, 92 | null 93 | ).singleNodeValue; 94 | 95 | const filledStarsElements = document.evaluate( 96 | './/span[contains(@class, "hCCjke") and contains(@class, "elGi1d")]', 97 | reviewElement, 98 | null, 99 | XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, 100 | null 101 | ); 102 | 103 | const name = nameElement?.innerText || ''; 104 | const imageUrl = imageElement?.src || ''; 105 | const date = dateElement?.innerText || ''; 106 | const reviewText = reviewTextElement?.innerText || ''; 107 | const starCount = filledStarsElements.snapshotLength; 108 | 109 | if (name && reviewText) { 110 | reviews.push({ 111 | date, 112 | name, 113 | imageUrl, 114 | reviewText, 115 | starCount 116 | }); 117 | } 118 | } 119 | 120 | return reviews; 121 | }); 122 | 123 | if (reviewData.length === 0) { 124 | Logger("No Reviews - Skip this", "red"); 125 | return []; 126 | } 127 | 128 | Logger("Done .. Got " + reviewData.length + " Reviews", "green"); 129 | 130 | const csvData = reviewData.map(review => ({ 131 | placeTitle: dataplace.title, 132 | placeRating: dataplace.rating, 133 | placeNumberOfReviews: dataplace.numberOfReviews, 134 | placeCategory: dataplace.category, 135 | placeAddress: dataplace.address, 136 | placeWebsite: dataplace.website, 137 | placePhone: dataplace.phone, 138 | placeImgLink: dataplace.imgLink, 139 | reviewerName: review.name, 140 | reviewerImageUrl: review.imageUrl, 141 | reviewDate: review.date, 142 | reviewText: review.reviewText.replace(/,/g, ';'), 143 | reviewStarCount: review.starCount 144 | })); 145 | 146 | const json2csvParser = new Parser(); 147 | const csv = json2csvParser.parse(csvData); 148 | 149 | const fileExists = fs.existsSync('data.csv'); 150 | if (!fileExists) { 151 | fs.writeFileSync('data.csv', csv + '\n'); 152 | } else { 153 | const csvLines = csv.split('\n'); 154 | const dataWithoutHeader = csvLines.slice(1).join('\n'); 155 | fs.appendFileSync('data.csv', dataWithoutHeader + '\n'); 156 | } 157 | 158 | await page.close(); 159 | return [{ dataplace: dataplace, review: reviewData }]; 160 | 161 | } catch (error) { 162 | Logger("Error in extractData", "red"); 163 | console.log(error); 164 | Logger("No Reviews - Skip this", "red"); 165 | return []; 166 | } 167 | } 168 | 169 | module.exports = { 170 | extractData 171 | }; -------------------------------------------------------------------------------- /data.csv: -------------------------------------------------------------------------------- 1 | "title","rating","numberOfReviews","category","address","website","phone","imgLink","reviewText" 2 | "CLEANY LAUNDRY & WET CLEANING BALIKPAPAN",5,73,"Laundry service","Jl. Sepinggan Baru No.154, Sepinggan, Kecamatan Balikpapan Selatan, Kota Balikpapan, Kalimantan Timur 76116","","082351112958","https://lh5.googleusercontent.com/p/AF1QipP8j6P4UauooJNNgQwknd96tIjYgofp3WqYLAvB=w408-h544-k-no","Murah, cepat bagus,Bersih,wangi,packing nya rapih,,satu lg yg pasti cleany laundry ada garansinya,Gak nyesel deh laundry dsni,selain ownernya ramah pakaiannya jg bersih dan wangi..,Sangat sangat memuaskan , bersih , wangi , pelayanan yang sangat ramah,Bagus ,bersih,harum dan pelayananya ramah..pokoke top banget👍👍👍👍👍,Ownerx ramah banget,baik,dan kurirx tepat wktu serta londrix wangi banget dan rapi🙏🙏🥰,laundry nya bersih pengerjaan nya bener"" teliti sehingga hasilnya memuaskan😊👍🏻,Selalu puas klo habis nyuci disini.. makasih yaa kkaa gk takut kena luntur🥰,Pelayanan nya ramah dan sangat profesional terimaksih 🙏😁,hasilnya bagus, pelayanan juga bagus.. pertahankan yah ." 3 | "title","rating","numberOfReviews","category","address","website","phone","imgLink","reviewText" 4 | "Laundry Coin Balikpapan Regency (Laundromart)",4.7,47,"Laundry service","balikpapan regency W6, 38, Sepinggan, Balikpapan Selatan, Balikpapan City, East Kalimantan 76114","https://laundry-coin-balikpapan-laundromart.business.site/","08118643888","https://lh5.googleusercontent.com/p/AF1QipON-bcnkBrqfnAr-xvpDYG7yfXeP1RnYnQSCyjF=w480-h240-k-no","Sekarang buka 24 jam yaa,Salah satu laundry yg berada di kompleks perumahan Balikpapan Regency yg menggunakan sistem coin dan termasuk laundry termurah dengan fasilitas terbaik,murah n bersih,dekat pos securyti,Bersih, harum, & terjangkau harganya,Pelayanan baik dan hasil memuaskan,Cuci baju bersih murah dan cepat genk,Oke, laundry 1 hari selesai 👍,Sangat menyenangkan,Cepat, wangi, pemilik dan pegawainha ramah ramah" 5 | "title","rating","numberOfReviews","category","address","website","phone","imgLink","reviewText" 6 | "Max Coin Laundry",4.6,59,"Laundry","Jl. Siaga No.RT 17, Damai, Kec. Balikpapan Kota, Kota Balikpapan, Kalimantan Timur 76114","","08115425005","https://lh5.googleusercontent.com/p/AF1QipMNvymQU3X980-4K5ZwTJdeyjPwNCZNCme--lVT=w426-h240-k-no","Kualitas cucian terjamin dan tidak dicampur oleh cucian orang lain, bersih, rapi, dan harum.,Bagus, cozy, murah, cuman kurang mnyediakan menu makanan. Tapi ada camilan sih, jadi mending lah. 7 | 8 | Tapi juga tidak ada meja untuk beresin baju yg udh di giling, pelanggan malah dimanjakan dgn tv besar dan tmpat duduk besi yg didudukin untuk waktu yg sampai ber jam², pdhal lbh penting meja besar sih atau spot buat nyetrika atau minimal buat melipat baju lah gapapa. Saran sih.,Alhamdulillah sdh masuk 1thn bersama max coin laundry, rapih harum tepat waktu, karyawan nya jg humble trims max coin laundry. Kedepan nya makin ok dan kece. Good job,Sangat baik untuk bersantai dan menghirup udara seger di pagi dan sore hari walaupun di tengah kota tapi terdapat banyak jenis tumbuhan di taman bekapai,Cepat layananya,Respon cepat dgn fasilitas antar jemput. Hasilnya sesuai dgn waktu yg dijanjikan, bersih dan wangi.,Laundrynya murah banget, wangi dan pelayanannya oke dan cepat banget. Terima antar jemput lagi. Sangat memuaskan deh,Respon dari petugas penanggung jawab laundry nya bagus dan ramah, tapi utk mencuci baju, kurang bersih dan setrika pakaian kurang rapih 😔,Tempatmya bersih pelayanannya baik dan ramah 🙏🙏,Saking populernya sampai gak bisa nyuci di situ alasannya penuh teruss hahahaha😅😭😅" 9 | "title","rating","numberOfReviews","category","address","website","phone","imgLink","reviewText" 10 | "WASH & GO LAUNDRY BALIKPAPAN",4.4,65,"Laundry service","BDS, Jln. Manunggal Komp. Ruko No.243 (antara hotel athar 88&TPU BDS, Gunung Bahagia, Balikpapan Selatan, Balikpapan City, East Kalimantan 76115","","08115866830","https://lh5.googleusercontent.com/p/AF1QipNW7Wm0ASSHaZt4EM3E0ButGgTjtwBjIHUQxf7g=w408-h725-k-no","1. Tidak ada nota awal/receipt laundry. Cuma disuruh ninggal nama sama no hp?? 11 | 2. Tidak tepat waktu, katanya 3 hari kalau sudah selesai dihubungi: sengaja baru dateng 4 hari eh belum selesai juga? 12 | 3. Laundry awalnya kiloan tapi akhirnya dihitung satuan seenaknya sendiri tanpa pemberitahuan sebelumnya?? 13 | 4. Udah dihitung satuan seenaknya sendiri tapi masih ada pakaian yg luntur??,,Menurut ku harga terlalu mahal, getok nya gila sih, setidaknya beri tahu pelanggan soal harga di awal ,, kenapa juga pakaian dalam ada tambahan? Alasannya SOP ,, lah kenapa sop gak di jelaskan di awal ke customer??? Pakaian yg di antar ke customer masih basah loh, pakaian masih kotor juga,, ini gimana sih ,, udah gak tepat waktu lagi, I say it, very bad 👎👎👎 ngga rekomend sama sekali,,👍🤓🙏,,Benar² tidak memuaskan, tidak amanah. Lepas tanggung jawab. 👎,,," 14 | "title","rating","numberOfReviews","category","address","website","phone","imgLink","reviewText" 15 | "LaundryKlin (Laundry Antar Jemput Balikpapan)",4.8,52,"Laundry service","Jl. Jenderal Sudirman, Ruko Bandar No.07, Klandasan Ulu, Kec. Balikpapan Kota, Kota Balikpapan, Kalimantan Timur 76112","http://laundryklin.com/","08118112150","https://lh5.googleusercontent.com/p/AF1QipNCw99_i_3EKK4WAgE9gLxEyAkjTmEa1u6lS0Q0=w408-h272-k-no","Cucian bersih, biasa nyuci ad sisa kotoran. Cuci di sini pda hilang. pelayanan baik, pada ramah ramah. Top markotop deh,Loundrynya bersih,wangi dan rapi . Bakal menjadi langganan tetap saya ini. Sukses selalu ya . Tetap memberikn yang terbaik gan,Pertama kali nyoba nyuci stroller dan bedcover. Hasilny memuaskan, bersih, packagingny rapi,Mantap laundry nya, bersih dan wangi. Cuci sepatu ny juga mantap. Pasti berlangganan.,Loundrian yg sangat recomendet dan harga terjangkau. Buat Kalangan anak2 kost seperti saya .-_-,Loundry nya sangat bagus recomended.cepat wangi.dan tepat waktu..pelayanannya juga sangat bagus ..,Mantap gan loundrynya sangat rapi dan wanginya awet.. Sukses selalu ya gan.,banyak pengamen pak gubenurnya gk bagus,Recommended. Pelayanannya ramah. Nyuci g pake lama.,Bagus" 16 | "title","rating","numberOfReviews","category","address","website","phone","imgLink","reviewText" 17 | "Aldi Laundry",4.6,48,"Laundry service","Jl. Jembatan Mariati Gg. Dahlia No.8, Gunungsari Ilir, Kec. Balikpapan Tengah, Kota Balikpapan, Kalimantan Timur 76113","http://bit.ly/OrderLaundryDong","08125571553","https://lh5.googleusercontent.com/p/AF1QipNgXrrfJMGN4NPFtkzoHDiB7APIuvnKSnNmkgU=w520-h240-k-no","Pelayanan bagus.. Hasil laundry bersih, rapi dan wangi..,bagi yg mau laundry, sortir dlu dan foto sebelum di serahkan ke pihak laundry,Mahal, kalo mau laundry pake yg coin aja di sebelah hotel Budiman,,,Udah bertahun-tahun langganan di sini. Pelayanannya mantab.,Pelayanan nya baik,Very good laundry! Bagus sekalih!,Bagus cepat dan bersih,Pelayanan okeee,Rapi..harga licin..memuaskan,Besok langsung jadi plus wangi 👍" 18 | "title","rating","numberOfReviews","category","address","website","phone","imgLink","reviewText" 19 | "Tiga Putra Laundry",4.7,26,"Dry cleaner","Baru Toronto JB 21, Damai, Kec. Balikpapan Kota, Kota Balikpapan, Kalimantan Timur 76114","","085246621500","https://lh5.googleusercontent.com/p/AF1QipN3aAPxQLh81f4xip0GjjbA-_lGWEEnxbX-OHJ9=w426-h240-k-no","Bagus rapi bersih,Lokasi kantor Representatif WIKA....,,,Jasa cuci karpet, sofa dan springbed berkualitas di Balikpapan, pencucian menggunakan mesin modern, insya Allah bersih, wangi dan rapi.👍👍👍,,Mantapp👍,,,Langganan laundry karpet di sini... cocok... Hasilnya bersih & wangi.." 20 | "title","rating","numberOfReviews","category","address","website","phone","imgLink","reviewText" 21 | "BILAS LAUNDRY - PJHI",5,33,"Laundry service","Jl. PJHI Batakan, Manggar, Kec. Balikpapan Tim., Kota Balikpapan, Kalimantan Timur","","082336685544","https://lh5.googleusercontent.com/p/AF1QipN-txZ9voSb-nssid9m0LSypAQvP7FEnHLk_LOD=w420-h240-k-no","Gak nyesel berlangganan laundry disini, hasilnya bersih, wangi banget dan selalu tepat waktu, recommended banget.,Tempat laundry dengan hasil bersih, wangi, dan tepat waktu, terbaik 👍,Bersih ,rapi dan wangi selesai tepat waktu,Bersih, wangi mbak""nya ramah. 22 | Rekomend pokoknya,,Pelayanan prima, bisa diandalkan ketepatan waktu,Cuci nya bersih, harum setrika nya rapi..,Tepat waktu,r rapih dan harum,Sangat memuaskn tepat wktu.hrum dn rapi.playananx pun sangat ramah.,Pelayanan nya oke, selesai tepat waktu ga pernah molor. Mbak nya juga fast respon kalo di wa. Rapi banget lagi hasil laundry nya. Mantaapp 🙏🏻👌🏼" 23 | "title","rating","numberOfReviews","category","address","website","phone","imgLink","reviewText" 24 | "Laundry 10 Gunung Malang",4.5,25,"Laundry","Jl. Letjen S Parman No.14, Gunungsari Ulu, Kec. Balikpapan Tengah, Kota Balikpapan, Kalimantan Timur 76113","","085787395100","https://lh5.googleusercontent.com/p/AF1QipO-E3VfhBr-N0UBenTyYOWygABTPxG-ts3LJC1_=w408-h306-k-no","Rekom,Bolehlah,Bagus,,,,,,," 25 | "title","rating","numberOfReviews","category","address","website","phone","imgLink","reviewText" 26 | "Coin Laundry Mart",4.5,53,"Laundry service","Jl. Mayor TNI A.D. Imat Saili No.36, Sumber Rejo, Kec. Balikpapan Tengah, Kota Balikpapan, Kalimantan Timur 76114","","","https://lh5.googleusercontent.com/p/AF1QipNO7BuzBx7o4ELsufnbHlFR8kMfW4FPl2NRFSW-=w408-h544-k-no","tempat bagus lengkap ada ruang tunggu hanya saja karyawan nya kalo gosip di area tunggu dan sangat mengganggu. 27 | menunggu laundry selama 2 jam saja sudah cukup membosankan, sepertinya tidak perlu disuguhkan dengan suara2 gosip para karyawan nya , overall good lah untuk laundry nya.,Ada beberapa tempat koin laundrymart. Yg dimartadinta sering kali penuh sebb dibooking oleh pihak hotel. Koin laundrymart yg disungai ampal samping pom bensin sungai ampal, cepat tutup. Pukul 16.30 dah tutup. Lebih bagus koin laundrymart yg disamping hotel budiman. Buka hingga pukul 21.00,Pertama x nghub utk order dan info pengantaran, responnya cepet.. Tapi pas orderan berikut2 ny, WA ga d bls, tlp ga d jwb, jadiny susah mw infoin sy mw paket apa, yg brpa hari, lalu menginfokan klo saya ambil dan anter cucian pke jasa ojek online.. Ujung2ny pas salah order, baruuu sibuk nghub.. Padahal sy udh WA dr sewaktu ojek online menuju lokasi laundry utk mengantar cucian tp ga d respon..,Mba2mya ga judes, ngelipet bajunya tenang ada tempat duduknya,Serasa nyuci di apartemen di Amerika...nyuci sendiri pakai coin...hasily bersih..nunggu ambil wi fii an,Mahal,Thanks Bu... pelayanannya ramah & helpful... nyaman... sambil nunggu bisa nyaman bubur samarinda di sebelah...hehehe,Oke lah...cucian bersih wangi. Solusi untuk keluarga suami istri karir,Bagus nih bs self service jg 👍,Selalu cuci baju kesini kalo mati air dirumah.." 28 | "title","rating","numberOfReviews","category","address","website","phone","imgLink","reviewText" 29 | "Mom's Laundry Balikpapan",4.6,25,"Laundry service","Jl. Mayor Pol. Zainal Arifin No.103, RT.58, Damai, Kec. Balikpapan Kota, Kota Balikpapan, Kalimantan Timur 76114","","082155727241","https://lh5.googleusercontent.com/p/AF1QipMHLSIbt3LHz_ugbympK8p5ev1B1u4CyKa1QO_4=w426-h240-k-no","Hasil cuciannya bersih,rapi dan wangi bakal balik lgi kesini,Pakaian saya bersih wangi ga bau apek,pengerjaannya cepat,Terima kasih,Bersih bangetttttttt rapi bangettttt✅,Pelayanan terbaik,Mantul ❤️,Bersih banget 👍👍👍,,," 30 | "title","rating","numberOfReviews","category","address","website","phone","imgLink","reviewText" 31 | "Premier, Laundry & Wet/Dry Cleaning",4.5,123,"Dry cleaner","Jl. Jenderal Sudirman No.253, Damai, Kec. Balikpapan Kota, Kota Balikpapan, Kalimantan Timur 76113","https://premier-laundry-wetdry-cleaning.business.site/?utm_source=gmb&utm_medium=referral","0542744810","https://lh5.googleusercontent.com/p/AF1QipNDkoyAZS4LcZZOu2xG0Vg1dSKm6uFmT0jUiysg=w408-h306-k-no","Pelayanan baik, petugas ramah2, dan yang paling penting bedcover jadi bersih dan wangi. Ada diskon dengan keanggotaan seperti ace hardware atau informa,Orang nya baik2 sangat ramah tamah,Pelayanan Buruk 32 | 33 | Ini kli pertama saya Laundry pakaian ditempat ini. Kesan pertama kli karyawannya kurang welcome dan tidak mengerti how to handling the customer. Menanyakan detail pelanggan dr nama, alamat dan tlpn untuk untuk diinput dikomputer, tp ujung2nya masih meminta lagi menulis manual ke customer. saya rasa buang waktu. Dan ketika saya meminta tolong untuk skalian membersihkan cover jas saya karena bnyak bulu woll, karyawan tersebut yg bernama Lisa langsung menolak dengan alasan covernya dibawa pulang saja biar tidak hilang. Saya rasa ini pertama dan terakhir saya Laundry ditempat tsb.,Nyuci dua bantal yang kena noda di sini, hasilnya gagal total. Penasaran apa memang tidak bisa hilang, saya bawa ke laundry sebelah (tidak ada niat membandingkan). Harganya lebih murah jadi nggak berharap banyak, eh tapi ternyata kaget juga pas dua bantal saya kembali putih sempurna. Sejak itu nggak pernah lagi ke sini.,Strategis tempatnya,Laundri satuan yg cukup profesional. Pelayanan ramah kadang ditawarkan promo.,Pelayanannya Profesional. Jarang ada laundry (bahkan mungkin tidak ada di balikpapan) yang mengerti tentang cara treatment kain tertentu.,mantap terbaik 👍,Pelayanannya cepat, pegawainya ramah dan sering ada discountnya... Seperti hari ini ada discount utk pakaian wanita.....,Assalamu'alaikum. Saya pelanggan sejak 2009. Ga pernah kecewa. Kasih saya kartu exclisive donk. Member berat nih. Nmr saya 081233803343. Thanks sejak 2009." 34 | "title","rating","numberOfReviews","category","address","website","phone","imgLink","reviewText" 35 | "Coin Laundry Services",4.1,39,"Laundry service","Jl. Martadinata Balikpapan Kelurahan No.10 Rt. 22, Mekar Sari, Kec. Balikpapan Tengah, Kota Balikpapan, Kalimantan Timur 76121","https://www.instagram.com/coinlaundrybpn/","0542422786","https://lh5.googleusercontent.com/p/AF1QipPty8ebVlQLSwpiQi-IBqzINxRuUjEB_y-8kBkH=w408-h306-k-no","Sdh sepi bahkan di katakan hampir tutup,Mantap pelayanan cepat,harum mntap,Tempat yg luas dan bersih,Hasilnya bersih dan rapi.. + plus wangi..,Cepat dan bersih,Pelayananx bagus,Semngt baik,Josss...,G bersih,Recomended" 36 | "title","rating","numberOfReviews","category","address","website","phone","imgLink","reviewText" 37 | "Balie Laundry Balikpapan",4.9,65,"Laundry service","Perumahan Balikpapan Regency Ruko De Blossom Ville, Jl. Syarifuddin Yoes No.10, Sepinggan, Kecamatan Balikpapan Selatan, Kota Balikpapan, Kalimantan Timur 76115","","085252899899","https://lh5.googleusercontent.com/p/AF1QipPkIuDlW6lU_DzJxsAwpaXYAE9st2RLVigq-VBB=w427-h240-k-no","Hasil sesuai ekspektasi,, packing rapih dan wangi,, kayak ngelaundry dihotel aja 🤭👍,Percaya hasilnya bersih dan rapi, antar jemput tepat waktu, dan customer servicenya yang ramah menjadikan satu ciri profesionalisme Bali' Laundry . Selalu laundry kesini jika mampir Balikpapan.,Konsisten pelayanan terbaik.. 👍🏽,Hasil londry bersih dan wangi melayani londre kg atau satuan dan tepat waktu mempunyai fasiltas ambil dan antar baju londry ke rumah pelangan,Wangi, tepat waktu bisa antar jemput juga. The best lah pokoknya londrian nya,Kalau ke Balikpapan cuci jas dan jaket kulit disini tempatnya. Semoga bisa pertahankan kualitasnya ya.,Okey banget tuk perawatan jacket kulitnya..👍,Loundry jas u suami, tepat waktu, dan wanginya aweet... suka parfumnya...,FO nya ramah. 38 | cucian bersih. 39 | bisa anter jemput buat kalian yg mager ... 40 | hehe..,Karyawan yg ramah serta respon yg cepat😉😉" 41 | "title","rating","numberOfReviews","category","address","website","phone","imgLink","reviewText" 42 | "Arsyfa Laundry",5,21,"Laundry service","PVM3+4M4, Jl. Siaga, Damai, Kecamatan Balikpapan Selatan, Kota Balikpapan, Kalimantan Timur 76114","","","https://lh5.googleusercontent.com/p/AF1QipPGwmab9o0YmhLqt_kbh2dya6pupmtKhYHkd5bK=w408-h544-k-no",",,,,,,,,," 43 | "title","rating","numberOfReviews","category","address","website","phone","imgLink","reviewText" 44 | "Geo Laundry East Kalimantan",5,23,"Laundry service","Ruko Sentra Eropa Blok AB2 No.33, Gn. Samarinda, Kec. Balikpapan Utara, Kota Balikpapan, Kalimantan Timur 76114","","08115404118","https://lh5.googleusercontent.com/p/AF1QipNhH7c2iH5A78Htw3XLvCx4R26wLgJfBjPNQKpm=w408-h408-k-no","Wangiiii, bersih, tanpa kuman dan bau apek. Top markotop dah,,,pelayanan nya ramah, on time service, hasil laundry nya rapi, bersih+ wangi nya tahan lama,Makasih kak. Pelayanan nya bagus sekali. Laundryanku wangiii banget. Hehe,Sepatu jd bersih wangi. Tas juga. Mantapss,,bersih n wangi, tempatnya dekat dari rumah, pelayanan ramah,Laundry bersih & rapi, cepat.," 45 | "title","rating","numberOfReviews","category","address","website","phone","imgLink","reviewText" 46 | "One Click Laundry",4.5,18,"Laundry service","Jl. MT Haryono Keluarahan No.01, Gn. Bahagia, Kecamatan Balikpapan Selatan, Kota Balikpapan, Kalimantan Timur 76114","https://oneclicklaundryid.business.site/","085393158320","https://lh5.googleusercontent.com/p/AF1QipOxfVaBpH0GjyvmzLgCUbGWxQod_dE5_KYjsBRl=w426-h240-k-no","Laundry ekspres 4 jam sekilo 20k, worth it banget, wangi banget dipake seharian.. dan meski masih disuasana weekend lebaran tp mereka tetep on schedul cucinya. Rekomend banget bagi aku yg pelancong,murah, bersih, cepat, dan memuaskan,Luandry Kilat Balikpapan.. one click laundry juga melayani antar jemput. Pokoknya Josss..,Hrg 27ribu/3,5kg. Bs sehari selesai. Mantapp,,,Loundry nya dekat dengan RS siloam sangat membantu kami yang berobat dan rumah jauh. Pelayanan cepat , penjaga ramah, on time sesuai perjanjian.,Harga lumayan Pricefull,Mahal," 47 | "title","rating","numberOfReviews","category","address","website","phone","imgLink","reviewText" 48 | "Bunga Laundry",4.8,13,"Laundry","Jl. Prapatan, Telaga Sari, Kec. Balikpapan Kota, Kota Balikpapan, Kalimantan Timur 76111","","082158123577","https://lh5.googleusercontent.com/p/AF1QipOpAdE5DYaa1tvj3SSfutr9_pK8Iycl3E26CWQD=w408-h523-k-no",",," 49 | "title","rating","numberOfReviews","category","address","website","phone","imgLink","reviewText" 50 | "Cinta Laundry",5,9,"Laundry service","Jl. Bukit Niaga No.rt16 no 33, Klandasan Ilir, pasar baru, Kota Balikpapan, Kalimantan Timur","","081346575901","https://lh5.googleusercontent.com/p/AF1QipNw_xqnakIPjRRjJrEecIt1C-JyAYNjOQEfJqfY=w408-h725-k-no",",,Pelayanannya bagus dan bersih serta bersih👏👏,,,Pelayanan memuaskan👍,,," 51 | "title","rating","numberOfReviews","category","address","website","phone","imgLink","reviewText" 52 | "MONDAY CAR",5,1,"Auto repair shop","Jl. Ruhui Rahayu II No.80, Sepinggan, Kecamatan Balikpapan Selatan, Kota Balikpapan, Kalimantan Timur 76115","","","https://streetviewpixels-pa.googleapis.com/v1/thumbnail?panoid=V88Kzl7QGLwMXw6hWFejgw&cb_client=search.gws-prod.gps&w=408&h=240&yaw=67.88668&pitch=0&thumbfov=100","Mntap" 53 | "title","rating","numberOfReviews","category","address","website","phone","imgLink","reviewText" 54 | "AS Autocars Garage",4.8,5,"Car dealer","Jl. Manchester No.82, RT.001/RW.009, Panunggangan Bar., Kec. Cibodas, Kota Tangerang, Banten 15138","","081318168099","https://lh5.googleusercontent.com/p/AF1QipNRXe9cWpvn9zEpKs7YVG9gSUB_W7VfY1h1rRZe=w408-h544-k-no","Showroom mobil second terpercaya,,Mobil2 seken Bergaransi,Cukup bagus ..dan banyak manfaatnya," 55 | "title","rating","numberOfReviews","category","address","website","phone","imgLink","reviewText" 56 | "Wearnes Pre-Owned",4.6,21,"Car dealer","45 Leng Kee Rd, Singapore 159103","https://www.wearnesauto.com/pre-owned/","+6564304800","https://lh5.googleusercontent.com/p/AF1QipOY_zzWq_85njn898jqKJ2SZl7oK2dS3oAcAnv3=w408-h364-k-no","I would like to comment on Shawn's professionalism, service and attitude. From the start, Shawn is detailed, friendly and not pushy. He is very patient and answered the questions that we have. We are very comfortable with Shawn and that is why we have decided to proceed with the purchase. Shawn is truly a gem to the company.,Great experience with Shawn! 57 | 58 | From day one of enquiry to handover of car and even the after sales service, Shawn has been nothing but professional and always willing to go the extra mile. 59 | 60 | Will definitely recommend him to family and friends.,The many good reviews on Shawn Loh is a testament to his professionalism-sincerity-commitment in providing the clients he served with the best customer experience. I have bought both new and used cars over my 30+ years of driving and this transaction with Shawn for my family's second car is nothing short of spectacular and I am not an easy person to be impressed. You are indeed an asset to Wearnes and have set the benchmark for quality sales consultant in your industry. Keep up the good work Shawn!,Got a 420i and was served by Shawn, responsible, straightforward and not pushy. Let us make our own decision after presenting all the options. Personally send down the vehicle to agent to settle most of the wear & tear found just before his vacation. Despite a minor hiccup @ agent side, Shawn still the best sales that I've met while searching in the 2nd hand market, & also responsive to all my what apps messages during & after the purchase,Shawn make the deal seamlessly easy for me despite the very short time frame given. He was clear and concise with the details of the car. From viewing to dealing , he was very professional in his ethics and information of work. He did his well timely check even after i’ve purchased and driven the car. In all, im very satisfied with his professionalism and his ethics. All the best, bro!,Saw a Lexus ES250 and went down to look at the car. Was served by a lady named Yoyo. Told us that no test drive is allowed unless we are firm on buying the car because, and I quote: ""when we let customer test drive the car, the milage will go up by 1,000. So we don't allow test driving."". 61 | 62 | In my years of owning different cars, this is the first time I heard of no-test driving. 63 | Makes me doubt on their car quality. 64 | 65 | Will not recommend.,Didn’t get Shawn or Christopher or any of the good experience. Was served by a lady who didn’t bother to ask our names or seems interested to serve. She looks like she just want to sit in aircon office to pass her Deepavali holiday away,After rounds of hunting for a used BMW X1, with various car dealers, we finally bought this beauty from Shawn. 66 | 67 | We were very impressed by the product knowledge displayed by Shawn where he explain every bit of the car in detailed to us and is able to answer all our questions - something that most used car dealers failed to do. Other car dealers merely let you test drive the car and failed to do a proper introduction of the car. 68 | 69 | Moreover, Wearnes is very transparent in the pricing and no ""fees"" or ""GST"" on unknown amounts that many others quoted to me. 70 | 71 | After we paid the deposit, Shawn's service did not just stopped there. Shawn helped us send the car down to our preferred workshop for inspection, and then to PML to replace parts that are worn-out and under warranty. Lastly, he did a round of interior grooming and polishing before handing over the car in tip top condition, all within 1 week. 72 | 73 | Throughout the whole purchase experience, Shawn is very prompt in replying my messages even when he is not on duty, kept us very updated on the progress proactively. 74 | 75 | In conclusion, IMPECCABLE SERVICE AND PROFESSIONAL.,Hi all, I've recently purchased an X4 at Wearnes. I contacted their sales consultant Shawn LOH to inquire about the car. Shawn has been very professional thru out the inquiry process. When I asked to view the car that very same day, he came back to office and attended to me even when it was his rest day. The entire experience was seamless and I appreciate his every effort in putting the customer's interests before his. I would recommend anyone looking to get a car from Wearnes to give him a ring. Thanks Shawn.,Kinda a funny story..... I was on the pre owned Wearnes website and sent in a request on a Range Rove Velar..... Within 30 mins, I got a call from Shawn at Wearnes saying ""Hello Mr X.... I know if you are looking you will purchase...... "" He was correct and this is my 2nd car in 3 year that I purchased from Shawn. I was at the shop that weekend, signed everything and Shawn delivered my new beauty to me within two weeks. Shawn goes above and beyond for service and support....... Thanks Shawn and see you in 3-5 years when I trade in again :-)" 76 | --------------------------------------------------------------------------------