年間経常収益400万ドル($4M ARR)の求職プラットフォームを構築
月商 $350,000 · 創業者2人 · 従業員5人 · Wilmington, Delaware
Alex(Founder, Global Work AI)· 創業 May 2024 · 記事掲載 May 31st, 2025 · globalwork.ai · 元の記事
2024年5月に創業し、12ヶ月で年間経常収益500万ドル(約7.5億円)に達したと2025年5月の記事で報告。創業から約2ヶ月でホワイトカラーの全職種に対応。初期の集客はソーシャルメディアへの有料広告を即座に開始し、パフォーマンスマーケティング(費用対効果を測りながら改善する広告運用)を主要戦略とした。有料ユーザーは1万人以上。創業者が2人、従業員5人。
売値の出典: 公式サイトの料金ページや商品一覧、記事の本文に金額の記載が見当たらず(有料サービスであることは確認)(2026-10-13 取得)
My name’s Alex Chepovoi, I’m a serial tech entrepreneur with five companies, eight products, and one successful exit behind my back. Today, together with my co-founder Alex Dyadischev, I’m building Global Work - a job search platform that uses AI agents to provide personalized support at every stage of the applicant’s journey. The global employment market is dynamically changing, and more people are actively seeking remote work opportunities. All of them are potential customers of Global Work, and our client base keeps growing fast. Since our launch, the platform has shown significant growth: in just 12 months we’ve reached $5M in ARR. Alex Chepovoi and Alex Dyadischev - co-founders of Global Work
As I mentioned, Global Work is my fifth company and the eighth product. Throughout my experience, I’ve had plenty of failures and have gone through many iterations. I also have prior experience with consumer subscription apps and HR tech with three of my previous companies. So we just combined these two areas of expertise, and at their intersection, the idea for a marketplace for IT specialists, called Expert Remote, was born. In the first year, we sourced and screened 50,000+ IT talents, shortlisted them to 500+ top level engineers, and sold this database to tech startups. Within the first year, the platform reached $600k in ARR. But soon we realised that we were swimming in the red ocean with no opportunity to scale. We knew we had to pivot. While most companies were focusing on corporate clients, we decided to look at the job seekers, who weren’t getting much help finding new jobs. That’s how we came to the idea to build AI agents that assist people in finding remote jobs faster and improve their chances of landing interviews. This is how Global Work was born. We started with tech-related jobs, but within two months, we expanded to cover all white-collar work verticals, including sales, consulting, marketing, copywriting, customer support, data entry and more. Today, we have over 10,000 paying users from diverse industries, locations, and age groups - everyone can find remote work or a side gig. 45% of our audience is from the US, our primary market. And soon we plan to launch blue-collar and local jobs in the US.
We already had a database of 500+ top-level verified developers from our previous startup (expertremote.io), selected after we interviewed over 50,000 candidates. So, we knew even the best talent is struggling with job search. The problem hypothesis was verified. To verify the solution hypothesis we talked to 20+ devs from this database, showed them the AI Job Search Toolset in Figma we wanted to build and the feedback was positive. We spent ~$7k and 5 weeks building an MVP. Again, we used part-time developers from our database. With our previous project (expertremote.io) the business model was B2B: we helped startups hire top-quality tech talent. The idea behind globalwork.ai pivot was switching to B2C. There were hundreds of CRMs and AI tools for recruiters, but no tools for candidates. It was a blue ocean nobody saw. Initially we put in $120k of our own money plus raised another $120k from 8 angels (friends). Remember, this was our fifth business, I had an exit in the past, etc, so we had some money but not much. Our platform is built with custom software development with node.js/react.js. No no-code/low-code/AI-generated bs. It took us 5 weeks to build the first version. Launching it was fast and easy. The biggest challenge though was that after 10 years in business, 5 companies, exit, etc we were running out of money. We could not afford an office, the team was me and my co-founder plus a few freelancers. It was our last attempt before we would go bankrupt. We did not expect that it will grow like crazy, just wanted to survive.
One of the biggest lessons I learned from the product launch was the need to move quickly. It took us one month to build an MVP for Global Work, and then we immediately launched paid ads on social media. We didn’t run any major media campaigns, we wanted to get started and validate the idea. It took us a few days to earn the first dollar, as the industry appeared to be a blue ocean of opportunities. The main goal was to get to positive unit economics asap, cause we didn’t have much capital. After about two months of tweaking both the ads and the product, we’ve achieved positive unit economics, and our user base started to grow sustainably. Performance marketing turned out to be the most effective customer acquisition strategy for us, and that hasn’t changed since. In a way, this approach has shaped the current format of Global Work, which is a unique case for me. Initially, we focused on the tech vertical, but it didn’t work out because the market wasn’t large enough for performance marketing to be effective. When we expanded into other verticals, the unit economics finally started to click. Global Work Website
As I mentioned, performance marketing remains our primary strategy for acquiring customers. In the first month, we tested over 100 different hypotheses of targeting, ad creatives, messaging, etc, until we found the ones that work. Now, we’re testing hundreds of hypotheses monthly. When we raised our Pre-Seed round, we also leveraged PR support to help refine our messaging. However, this happened after we had found our business model and achieved meaningful growth on our own. That’s why I’d advise aspiring entrepreneurs to launch quickly, even if the product isn’t perfect, work toward positive unit economics with what you have, and then start scaling. The tools and strategies may vary case by case. We found that performance marketing worked well for us, otherwise, we would have gone on testing other channels. The key is not to get distracted and stay laser-focused on what drives results and helps build sustainable profitable business.
Most of my career, especially the last 11 years in business, I’ve primarily focused on B2B sales. To be honest, I wasn’t very good at it. Scaling B2B sales was challenging for me, and persisting in B2B turned out to be one of the biggest mistakes. Consumer businesses drive me more. Over the years I came up with these principles: Don’t spend 6 months perfecting your product - build a prototype in a month and launch. Finding the right market and timing is everything. Know your customers and shape the product they truly need. Before delegating, my co-founder and I always do the task ourselves. The devil is in the details. Being a strong executor is great, but without strategy, you go nowhere - execution × strategy = success. Even if execution is a 10, if strategy is 0, the result is still zero. Last but not least, I would recommend doing regular dopamine detoxes. For several weeks or months, limit yourself from dopamine stimulants like alcohol, coffee, social media, and so on. This helps you get rid of information overload and clear your mind, opening the door to great ideas. In fact, I came up with the idea to pivot to Global Work during one of my dopamine detoxes. Check out How to Calm Your Mind by Chris Bailey - it’s a game-changer. How to Calm Your Mind
Node.js Stack 123 using React Stack 123 using Figma Design 128 using 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 PA Track your peptide protoc... · pepaiapp.com Track your peptide protocol in one simple app. $30K /mo Remote living resource hub · nomadlist.com 'Community platform for digital nomads worldwide' — Unblocked Games Site for ... · duckmath.org Unblocked Games Site for kids in school $15K /mo Open-source ai model hub · huggingface.co Open-source AI platform for sharing ML models. — F The only fully Instagram ... · followbuddy.com The only fully Instagram compliant IG unfollower tracking tool. $17K /mo Client onboarding software · binderr.com Client onboarding software for accountants, lawyers, and financial services. $10K /mo NF Ai music video generator · neuralframes.com AI music video generator for musicians and AI artists. $17K /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 Global Work AI? When did Alex start Global Work AI? How much money has Alex made from Global Work AI? {"@context":"https://schema.org","@type":"FAQPage","mainEntity":[{"@type":"Question","name":"Who is the owner of Global Work AI?","acceptedAnswer":{"@type":"Answer","text":"Alex is the founder of Global Work AI."}},{"@type":"Question","name":"When did Alex start Global Work AI?","acceptedAnswer":{"@type":"Answer","text":"2024"}},{"@type":"Question","name":"How much money has Alex made from Global Work AI?","acceptedAnswer":{"@type":"Answer","text":"Alex started the business in 2024, and currently makes an average of $4.2M/year."}}]}