毎月1.5万ドル($15K)を稼ぐ、男性向けデートコーチ業
月商 $15,000 · 創業者1人 · 従業員0人 · Portland
Vincent Chan(Founder, Based Dating)· 創業 March 2024 · 記事掲載 October 11th, 2025 · baseddating.net · 元の記事
創業者は自身の経験からビジネスを構築。RedditやYouTube、Discordのコミュニティでコンテンツを投稿して集客を開始。Instagramのリール動画で500万回再生を超え、フォロワーを倍増させた。月商は1.5万ドル(約225万円)。記事掲載は2025年10月11日時点、創業者1名・従業員0名の個人事業
売値の出典: 売値は確認できず(2026-10-14 取得)
Hello! My name is Vincent Chan, and I run Based Dating, a premium dating profile photography and coaching service. I help professional men, especially Asian guys in tech, finance, and other high-achieving fields, transform their dating app results through world-class photos, strategic profiles, and coaching that builds real confidence. What makes my business unique is that I’m not just a photographer, and I’m not just a coach. I combine both. I lived through the same struggles most of my clients face, and I developed a system that took me from zero matches to consistent dating success. Now I deliver that system through custom photoshoots, profile rewrites, and coaching that actually gets results. Today, the business brings in around $15,000/month and is growing quickly as I scale my reach through content and ads. My image
Skills What skills did Vincent Chan have that led to their success? Content Production Strategy Product Development B2B Content Writing Sales Strategy Business Savvy Skills Negotiation Skills Delegation Property Management
The idea for Based Dating came directly from my own struggles. A few years ago, I was like most of my clients. I was working hard in my career, but frustrated on dating apps. I tried every piece of generic advice online, and nothing worked. The “aha” moment came when I realized that my photos were the biggest bottleneck. I started experimenting with photography, style, and profile presentation, and within weeks, I went from almost no matches to consistent results. That experience gave me confidence that this wasn’t just about luck. It was a system that could be taught. I combined my background in photography with years of self-education in dating psychology, communication, and branding to create a unique offer not just taking great photos, but giving men the full playbook to succeed. I validated the idea by working with friends at first, and then early clients from Reddit and YouTube by getting the same breakthroughs I had. That feedback made it clear this was the right business to pursue, especially since no one else in the space was combining photography with actionable coaching at a high level.
Vincent Chan built Based Dating by combining his background in photography with self-education in dating psychology and branding. He experimented with photography, style, and profile presentation to create a system that transformed his own dating app results. The first version of Based Dating took about a year to develop, starting with helping friends and early clients from Reddit and YouTube. The experience of building it involved challenges like waiting too long to start and the need for persistence and consistency in content creation to attract the right audience.
Before Based Dating, I had already built an online fitness business after investing heavily into a fitness business coach. That experience gave me the foundation to sell online, structure offers, and understand how to attract clients. When guys started reaching out to me from Reddit posts and YouTube videos I made about dating, I realized I could apply the same business model here helping them as clients, just like I did with fitness. My launch wasn’t flashy. It was mainly posting content, sharing transformations, and starting conversations with men who were curious to learn more. The first client I ever signed came from a Reddit post where I detailed a friend’s transformation that I had done for free. That post got traction, and one reader reached out. He first booked a coaching call, and as we talked, it became clear I could do more for him. That was my first paid client in October 2023, about a year after I had helped my friend in September 2022. From there, momentum built as I engaged with online Asian male communities on Reddit and Discord. Word of mouth and results carried me forward, and each client win reinforced that I was on the right track. The lesson I learned was that building authority and trust through real results is the best launch strategy. No paid ads or flashy funnels were needed in the beginning, just authentic proof and conversations.
At first, my growth came from organic content and conversations. I wrote Reddit posts, engaged in Discord communities, and uploaded YouTube videos where I broke down my findings for free. On YouTube, I kept a call-to-action in the description so guys who wanted to learn more could book a call with me. I also pivoted my old fitness business Instagram into dating coaching and began posting dating-related content there. One strategy that really took off was experimenting with educational dating IG reels with meme energy. I combined everything I had learned about content creation such as storytelling, hooks, editing, and pacing to turn 60-second profile reviews or texting interactions into catchy, educational, and funny videos. The response was huge. Within four months, I doubled my Instagram following from 3,000 to 7,000 and racked up over 5 million views. Not only did this explode my reach, but it also brought in paying clients who told me directly that they related to my humor, saw me as authentic, and trusted me as someone who actually understood their struggles. This worked because it wasn’t just content for content’s sake. It was educational, entertaining, and authentic all at once. Aspiring entrepreneurs can learn from this: don’t just chase views. Make content that actually speaks the language of your audience and shows that you “get it.” That’s how you stand out and attract customers who are eager to work with you. My image
The biggest mistake I’ve made is waiting too long to start. The type of content I create today peaked in the early 2020s. If I had started back then, I’d be 100x further ahead with a fraction of the effort. Instead, I’m doing the heavy lifting now to catch up. That delay taught me a hard lesson: the best time to start was yesterday, the second-best time is today. What’s kept me going is persistence. Over the years I’ve gathered enough proof of concept through clients getting results and content resonating, that I know this business works and has real value. My challenge isn’t whether it can succeed; it’s figuring out how to consistently market it with enough exposure to reach the right audience. That means I’m always experimenting, always testing new tactics, and always learning. The main lesson I’ve learned is that consistency beats everything else. When I started making 60-second dating reels, I assumed they’d perform like my old fitness content. Instead, my third reel blew up. I rode that momentum and posted consistently for weeks, which led to millions of views and new clients. But I also made the mistake of deviating through posting low-effort content or taking days off. Every time I let momentum slip, I saw my results dip. I’ve had multiple swings like that: a big surge of views, followed by burnout, followed by chasing the next spike. If there’s one thing I’d tell other entrepreneurs, it’s this: ride momentum while you have it, and build systems that keep you consistent even when motivation drops. Chasing virality is out of your control. What you can control is your output, your persistence, and your willingness to keep showing up. That’s what separates people who build something lasting from those who fade out after a single big hit.
Amazon Other 413 using What Vincent has to say about Amazon newDocumentReady(function () { $(".database-result-bottom").unbind().click(function() { $(this).find(".database-result-bottom-contents").toggle(); }) // Mobile DB view toggle — switch between the compact row list (default) // and the rich card view, remembered in localStorage. Instant, no reload. // Leading ';' guards against ASI: the preceding statement ends in `})`. ;(function () { var group = document.querySelector('.db-view-toggle-group'); if (!group) return; var rowsPanel = document.getElementById('db-view-rows'); var cardsPanel = document.getElementById('db-view-cards'); function applyView(view) { var isCards = view === 'cards'; if (cardsPanel) cardsPanel.classList.toggle('hidden', !isCards); if (rowsPanel) rowsPanel.classList.toggle('hidden', isCards); group.querySelectorAll('.db-view-toggle').forEach(function (b) { b.classList.toggle('db-view-toggle-active', b.dataset.view === view); }); } var saved = 'rows'; try { saved = window.localStorage.getItem('dbMobileView') || 'rows'; } catch (e) {} applyView(saved === 'cards' ? 'cards' : 'rows'); group.querySelectorAll('.db-view-toggle').forEach(function (b) { b.addEventListener('click', function () { var v = b.dataset.view; try { window.localStorage.setItem('dbMobileView', v); } catch (e) {} applyView(v); }); }); })(); // Search UX: debounced auto-submit + global "/" focus shortcut. // Server-side pg_search is GIN-indexed and returns in <50ms; combined // with the page render, total feedback after the debounce window is // ~500ms — close enough to "live" without an XHR/Turbo refactor. var searchInput = document.getElementById('search'); if (searchInput) { var debounceTimer = null; var lastSubmittedValue = searchInput.value; searchInput.addEventListener('input', function () { clearTimeout(debounceTimer); debounceTimer = setTimeout(function () { // Don't submit if the value hasn't changed (e.g. arrow keys). if (searchInput.value === lastSubmittedValue) return; lastSubmittedValue = searchInput.value; searchInput.form && searchInput.form.submit(); }, 350); }); // Enter still submits immediately — short-circuits the debounce. searchInput.addEventListener('keydown', function (e) { if (e.key === 'Enter') { e.preventDefault(); clearTimeout(debounceTimer); searchInput.form && searchInput.form.submit(); } }); } // Global "/" shortcut to focus search — GitHub/Linear pattern. document.addEventListener('keydown', function (e) { if (e.key !== '/' || e.metaKey || e.ctrlKey || e.altKey) return; var t = e.target; if (t && (t.tagName === 'INPUT' || t.tagName === 'TEXTAREA' || t.isContentEditable)) return; var s = document.getElementById('search'); if (s) { e.preventDefault(); s.focus(); s.select(); } }); function prettySliderValue(func, value) { var n = Math.round(Number(value)); if (func == "money") { if (n >= 1000000000) return "$" + (n / 1000000000).toFixed(n % 1000000000 === 0 ? 0 : 1) + "B"; if (n >= 1000000) return "$" + (n / 1000000).toFixed(n % 1000000 === 0 ? 0 : 1) + "M"; if (n >= 1000) return "$" + (n / 1000).toFixed(n % 1000 === 0 ? 0 : 1) + "K"; return "$" + numberWithCommas(n); } else if (func == "daystomonths") { return (n / 30) + " months"; } else if (func == "hours") { return n + " hours"; } else { return n; } } function getInitialSliderValues(el) { var initial = el.dataset.initial; var defMin = Number(el.dataset.defaultmin); var defMax = Number(el.dataset.defaultmax); if (initial) { var parts = initial.split("|"); var a = parts[0] === "" ? defMin : Number(parts[0]); var b = parts[1] === "" ? defMax : Number(parts[1]); return [a, b]; } return [defMin, defMax]; } function createTwoProngedSlider(id) { var el = document.querySelector(id); if (!el || el.noUiSlider) return; var min = Number(el.dataset.min); var max = Number(el.dataset.max); var step = Number(el.dataset.step); var cleanfunc = el.dataset.cleanfunc; var values = getInitialSliderValues(el); var container = el.closest(".range-filter") || el.parentElement; var input = container.querySelector('input[type="hidden"]'); var label = container.querySelector(".preview-label"); noUiSlider.create(el, { start: values, connect: true, step: step, range: { min: min, max: max }, behaviour: "tap-drag" }); el.noUiSlider.on("update", function(vals) { var lo = Math.round(Number(vals[0])); var hi = Math.round(Number(vals[1])); if (label) label.textContent = prettySliderValue(cleanfunc, lo) + " – " + prettySliderValue(cleanfunc, hi); if (input) input.value = lo + "|" + hi; }); el.noUiSlider.on("change", function() { var form = el.closest("form"); if (form) form.submit(); }); } createTwoProngedSlider("#revenue-slider"); createTwoProngedSlider("#starting-costs-slider"); createTwoProngedSlider("#time-to-revenue-slider"); createTwoProngedSlider("#min-hours-per-week"); createTwoProngedSlider("#market-size"); createTwoProngedSlider("#startup-costs"); createTwoProngedSlider("#case-studies"); $(".mobile-filters-applied-button").click(function() { $(".database-filters").addClass("inView") }) $(".close-mobile-filters").click(function() { $(".database-filters").removeClass("inView") }) // Explore "More filters" — reveal/hide the secondary filter pills. var moreFiltersToggle = document.getElementById("explore-more-filters-toggle"); if (moreFiltersToggle) { moreFiltersToggle.addEventListener("click", function () { var panel = document.querySelector(".explore-secondary-filters"); if (!panel) return; var nowHidden = panel.classList.toggle("hidden"); moreFiltersToggle.setAttribute("aria-expanded", String(!nowHidden)); }); } // Infinite scroll lives in its OWN init block below (initSSInfiniteScroll), // deliberately decoupled from this newDocumentReady callback. Anything that // throws above (a slider lib that didn't load from CDN, a jQuery plugin, // etc.) would otherwise abort the rest of THIS callback and silently kill // infinite scroll — the "only works on a hard reload" bug. Keeping it // separate means nothing here can take it down. }); // ---- Infinite scroll (pro/admin/free-access; table + tile views) ---- // Driven off Kaminari's next-page URL, which the partial renders into // #infinite-scroll-sentinel only when the visitor is eligible. We fetch the // next full page, lift out the children of its .database-append-target // container (<tbody> rows for the table view, tiles for the grid views), // append them, then chain to that page's own sentinel URL. DOMParser does // NOT execute the fetched page's scripts, so only content nodes are added — // sliders/search/PostHog never re-run. The sentinel is absent for non-pro // visitors, so this whole block no-ops for them and their paywall is intact. // // Idempotent: guarded by sentinel.dataset.ssInfiniteInit so re-running on // pageshow (bfcache/back-forward restore, where DOMContentLoaded never fires) // can't double-observe an already-wired sentinel. function initSSInfiniteScroll() { var sentinel = document.getElementById('infinite-scroll-sentinel'); if (!sentinel || !sentinel.dataset.nextUrl) return; if (sentinel.dataset.ssInfiniteInit === '1') return; sentinel.dataset.ssInfiniteInit = '1'; // The "database" view renders TWO append targets — the mobile card list // and the desktop table tbody (one is display:none per viewport). Append // to both so infinite scroll works no matter which is visible. Tile views // have a single target. containers[0] drives the loaded-count readout. var containers = Array.prototype.slice.call(document.querySelectorAll('.database-append-target')); if (!containers.length) { delete sentinel.dataset.ssInfiniteInit; return; } var container = containers[0]; // Infinite scroll is live — hide the prev/next fallback for JS clients. var paginate = document.querySelector('.paginate'); if (paginate) paginate.style.display = 'none'; var numResults = document.querySelector('.num-results'); var loadingEl = sentinel.querySelector('.infinite-scroll-loading'); var nextUrl = sentinel.dataset.nextUrl; var loading = false; // Item nodes only — tile partials (e.g. _video) emit a sibling <style> // per render; those are global CSS we already have, so skip them when // appending and counting. function itemNodes(root) { return Array.prototype.filter.call(root.children, function (n) { return n.tagName !== 'STYLE' && n.tagName !== 'SCRIPT'; }); } function updateCount() { if (!numResults) return; var count = itemNodes(container).length; // Keep the "of N …" suffix; just bump the leading loaded-count. numResults.textContent = numResults.textContent.replace(/Showing\s+[\d,]+/, 'Showing ' + count.toLocaleString()); } function loadMore() { if (loading || !nextUrl) return; loading = true; if (loadingEl) loadingEl.style.display = ''; fetch(nextUrl, { headers: { 'X-Requested-With': 'XMLHttpRequest' } }) .then(function (r) { return r.text(); }) .then(function (html) { var doc = new DOMParser().parseFromString(html, 'text/html'); var srcs = doc.querySelectorAll('.database-append-target'); Array.prototype.forEach.call(srcs, function (src, i) { var dest = containers[i]; if (!dest) return; itemNodes(src).forEach(function (node) { dest.appendChild(document.importNode(node, true)); }); }); var ns = doc.getElementById('infinite-scroll-sentinel'); nextUrl = (ns && ns.dataset.nextUrl) || null; sentinel.dataset.nextUrl = nextUrl || ''; updateCount(); if (!nextUrl) { observer.disconnect(); sentinel.style.display = 'none'; } }) .catch(function () { /* leave nextUrl intact so a later scroll retries */ }) .finally(function () { loading = false; if (loadingEl) loadingEl.style.display = 'none'; }); } var observer = new IntersectionObserver(function (entries) { entries.forEach(function (e) { if (e.isIntersecting) loadMore(); }); }, { rootMargin: '600px 0px' }); observer.observe(sentinel); } newDocumentReady(initSSInfiniteScroll); // bfcache/back-forward restore doesn't fire DOMContentLoaded; pageshow does. // Idempotency guard above makes the re-call a no-op when already wired. window.addEventListener('pageshow', initSSInfiniteScroll); .blur-row { filter: blur(4px); pointer-events: none; user-select: none; } /* Mobile view toggle (rows ↔ cards) */ .db-view-toggle { display: inline-flex; align-items: center; gap: 5px; padding: 5px 11px; border: 0; border-radius: 6px; background: transparent; color: #64748b; font-size: 12px; font-weight: 600; cursor: pointer; transition: background-color 0.12s, color 0.12s; } .db-view-toggle-active { background: #0f172a; color: #ffffff; } .database-video-grid { display: grid; grid-template-columns: 1fr; gap: 18px; } @media (min-width: 768px) { .database-video-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } } /* Airbnb-style range slider (uses noUiSlider) */ .range-filter { display: inline-flex; flex-direction: column; justify-content: center; gap: 4px; padding: 6px 16px 10px; border: 1px solid rgb(226 232 240); background: #fff; border-radius: 9999px; min-width: 220px; margin-bottom: 0 !important; } .range-filter .range-filter-header { display: flex; align-items: baseline; gap: 6px; line-height: 1; } .range-filter .range-filter-header label { font-size: 0.875rem; color: rgb(100 116 139); font-weight: 500; margin: 0 !important; line-height: 1.2; flex-shrink: 0; } .range-filter .range-filter-header label::after { content: "|"; margin-left: 6px; color: rgb(203 213 225); font-weight: 400; } .range-filter .preview-label { font-size: 0.875rem; color: rgb(15 23 42); font-weight: 600; line-height: 1.2; margin: 0 !important; white-space: nowrap; } .range-filter .filter-slider.noUi-target { height: 3px; background: rgb(226 232 240); border: 0; box-shadow: none; border-radius: 9999px; margin: 3px 6px 0; } .range-filter.is-active { border-color: rgb(15 23 42); background: rgb(241 245 249); } .range-filter.is-active .range-filter-header label { color: rgb(15 23 42); } .range-filter .filter-slider .noUi-connect { background: rgb(15 23 42); } .range-filter .filter-slider .noUi-handle { height: 20px; width: 20px; top: -8px; right: -10px; border-radius: 9999px; background: #fff; border: 1px solid rgb(203 213 225); box-shadow: 0 1px 2px rgba(15, 23, 42, 0.12), 0 2px 4px rgba(15, 23, 42, 0.08); cursor: grab; transition: transform 0.1s ease, box-shadow 0.1s ease, border-color 0.1s ease; outline: none; } .range-filter .filter-slider .noUi-handle::before, .range-filter .filter-slider .noUi-handle::after { display: none; } .range-filter .filter-slider .noUi-handle:hover { border-color: rgb(15 23 42); transform: scale(1.05); } .range-filter .filter-slider .noUi-handle.noUi-active, .range-filter .filter-slider .noUi-handle:focus-visible { cursor: grabbing; box-shadow: 0 0 0 6px rgba(15, 23, 42, 0.08), 0 2px 6px rgba(15, 23, 42, 0.18); border-color: rgb(15 23 42); } .range-filter .filter-slider.noUi-horizontal { height: 4px; } .range-filter input[type="hidden"] { display: none; }
IDEA REVENUE Drop shipping store builder · ecomkingvault.com Drop shipping mentorship for aspiring entrepreneurs. $100K /mo Online language tutoring ... · languatalk.com Online language tutoring platform for global learners. $292K /mo Customized nutrition coac... · haleyhugheswellness.com Customized nutrition coaching for sustainable lifestyle changes. $3.5K /mo Dating and relationship c... · patstedman.com Dating and relationship coaching for men. $30K /mo Career transition coachin... · screwthecubicle.com Career coaching for escaping the 9-to-5 grind. $10K /mo Consulting business growt... · consultingsuccess.com Consulting Success: Coaching and courses for budding consultants. $240K /mo Freelancer training platform · fvaconsultancy.com Comprehensive training for aspiring Filipino freelancers. $1K /mo newDocumentReady(function() { // Save-bookmark hover — delegated on document (guarded once) so rows // appended by infinite scroll get the behavior too. mouseover/mouseout // bubble (mouseenter/leave don't); closest('tr') scopes to the hovered row, // and the relatedTarget check suppresses flicker when moving cell-to-cell // within the same row. if (!window.__saveBookmarkHoverInit) { window.__saveBookmarkHoverInit = true; document.addEventListener('mouseover', function(e) { var row = e.target.closest('tr'); if (!row) return; var saveBookmark = row.querySelector('.save-bookmark'); if (saveBookmark) saveBookmark.classList.remove('invisible'); }); document.addEventListener('mouseout', function(e) { var row = e.target.closest('tr'); if (!row) return; if (e.relatedTarget && row.contains(e.relatedTarget)) return; var saveBookmark = row.querySelector('.save-bookmark'); if (saveBookmark) saveBookmark.classList.add('invisible'); }); } // ---- Tag-pill hover tooltip (LLM-generated context for each Tagging) ---- if (!window.__tagTooltipInit) { window.__tagTooltipInit = true; const tip = document.createElement('div'); tip.className = 'tag-tooltip-popover'; tip.style.cssText = [ 'position:fixed','z-index:9999','max-width:340px','display:none', 'background:#0f172a','color:#fff','font-size:12px','line-height:1.4', 'padding:8px 10px','border-radius:6px','box-shadow:0 8px 24px rgba(0,0,0,.18)', 'pointer-events:none','white-space:normal' ].join(';'); document.body.appendChild(tip); const showTip = function(e) { const target = e.currentTarget; const text = target.getAttribute('data-tag-tooltip'); if (!text) return; tip.textContent = text; tip.style.display = 'block'; const r = target.getBoundingClientRect(); const tr = tip.getBoundingClientRect(); let top = r.bottom + 8; if (top + tr.height > window.innerHeight - 8) top = r.top - 8 - tr.height; let left = r.left; if (left + tr.width > window.innerWidth - 8) left = window.innerWidth - tr.width - 8; if (left < 8) left = 8; tip.style.top = Math.round(top) + 'px'; tip.style.left = Math.round(left) + 'px'; }; const hideTip = function() { tip.style.display = 'none'; }; document.addEventListener('mouseover', function(e) { const el = e.target.closest('[data-tag-tooltip]'); if (el) showTip({ currentTarget: el }); }); document.addEventListener('mouseout', function(e) { const el = e.target.closest('[data-tag-tooltip]'); if (el) hideTip(); }); } });
Who is the owner of Based Dating? When did Vincent Chan start Based Dating? How much money has Vincent Chan made from Based Dating? {"@context":"https://schema.org","@type":"FAQPage","mainEntity":[{"@type":"Question","name":"Who is the owner of Based Dating?","acceptedAnswer":{"@type":"Answer","text":"Vincent Chan is the founder of Based Dating."}},{"@type":"Question","name":"When did Vincent Chan start Based Dating?","acceptedAnswer":{"@type":"Answer","text":"2024"}},{"@type":"Question","name":"How much money has Vincent Chan made from Based Dating?","acceptedAnswer":{"@type":"Answer","text":"Vincent Chan started the business in 2024, and currently makes an average of $180K/year."}}]}