← 一覧へ

FixTheMusic

私のDJ手配プラットフォームは月商10万ドル($100K)を稼いでいます
月商 $100,000 · 創業者2人 · 従業員3人 · London
Edward Southall(Founder, FixTheMusic)· 創業 December 2015 · 記事掲載 November 30th, 2025 · fixthemusic.com · 元の記事

何の商売か
誰がイギリス・ヨーロッパで結婚式や企業イベントを企画する人(新郎新婦、イベントプランナー)。イベントにぴったりのプロのミュージシャン・バンド・DJを見つけ、確実に手配したい人
何のために理想のライブパフォーマーを簡単かつ透明性の高い方法で探し、安全に予約して、イベントを魔法のような特別な瞬間にしたい
何を買うかイギリスとヨーロッパの厳選されたプロのミュージシャン、バンド、DJを紹介するプラットフォームで、見積もりを受け取り、安全に予約する。手数料体系は記事やサイトからは確認できないが、マーケットプレイスとして運営されているため、パフォーマーからのコミッション(成果報酬)または顧客からの手数料(推測)。売値は確認できず

創業者がミュージシャン兼弁護士だった経験を活かし、市場のギャップを見つけて創業。Facebookの結婚式グループでの手動での営業から始め、口コミとSEO、Instagram、特定のキーワードに絞ったGoogle広告で集客を拡大した。月商10万ドル(約1,500万円)は2025年11月の記事公開時点での自己申告。従業員は3人

売値の出典: 売値は確認できず(2026-10-13 取得)

Who are you and what business did you start?

Hello! I’m Ed Southall, and I run FixTheMusic, a platform that helps people hire professional musicians, bands and DJs for private events across the UK and Europe. We operate as a curated marketplace, connecting wedding couples and corporate event planners with outstanding performers, while also giving talented artists a reliable way to secure high-quality bookings. What makes FixTheMusic special is our emphasis on transparency, ease of use and exceptional talent. We streamline the entire booking process so clients can discover and book brilliant acts within minutes, while musicians benefit from fair, straightforward opportunities. Today we bring in around $100K per month. Live music that makes the moment magical.

How do you come up with the idea for FixTheMusic?

The idea for FixTheMusic came to me on a train about ten years ago, while chatting with a friend about all the new “Airbnb-style” platforms emerging. As a lifelong musician, who also worked as a lawyer in London, I realised there wasn’t a proper marketplace for booking live performers. I remember the ‘aha’ moment vividly. Other ideas I’d explored, like launching a British seaweed crisp company, needed far more capital and had no clear route to early profitability. This one matched my background perfectly: I’d studied music, played professionally and understood the challenges freelance musicians face. I validated the idea by building a simple MVP, promoting it in Facebook wedding groups and using musician communities to fulfil early enquiries: proof that real demand existed.

How did you build the initial version of FixTheMusic?

Edward Southall built FixTheMusic by developing a simple MVP to validate the idea, promoting it in Facebook wedding groups and utilizing musician communities to fulfill early enquiries. The first version of the product did not have a public website or online payments, with everything being handled by email and bank transfer for the first sale which came within a couple of weeks. Southall focused on organic SEO and Instagram for growth, while running targeted PPC campaigns on Google for specific types of musicians, realizing the importance of focusing on niche searches for higher conversion rates. He learned the power of persistence, the importance of focusing on the higher end of the market, and the value of real customer feedback early on in the building process.

How did you launch FixTheMusic and get initial traction?

We didn’t do a big launch. FixTheMusic simply went live, and I started by searching Facebook wedding groups where couples asked for recommendations. I would comment “Try FixTheMusic” and wait to see if they filled in our enquiry form. To my surprise, they did. We then used musician Facebook groups to match those enquiries, which helped us build both sides of the marketplace at once. Early reactions were very positive, and people told us the site filled a real gap. One lesson was that simple, manual outreach can be very effective and that early traction does not require a big marketing budget. Our first sale came within a couple of weeks: a string quartet for an Army Christmas ball. We did not even have a public website or online payments, so everything was handled by email and bank transfer. It taught me that I enjoyed the hustle and that there was real demand if we could capture it.

What was the growth strategy for FixTheMusic and how did you scale?

Our main growth strategy has been organic SEO. We focused on it from day one, consistently creating high-quality pages for specific types of musicians and events. Instagram has also been important, as it is such a visual platform and widely used in the wedding world. By regularly posting content, tagging venues and planners, and sharing performances from our artists, we have steadily increased our visibility. One specific tactic that has worked well is running very targeted PPC campaigns on Google. Rather than broad ads, we focus on niche searches for particular types of bands or musicians. These users are already looking for exactly what we offer, so the conversion rate is strong. In contrast, more general Facebook ads have been harder to convert because booking a musician is rarely an impulse decision. This taught us to put our budget where the intent already exists. For aspiring entrepreneurs, my main advice is to start quickly and speak to real customers as early as possible. They will show you what truly matters, what to improve and, importantly, what does not need your attention yet. Getting real feedback early saves enormous time and helps you build something that genuinely solves a problem.

What were the biggest lessons learned from building FixTheMusic?

At the start, I made the mistake of trying to build the business with several friends, only to realise that very few people have the resolve to commit fully when things get tough. One of the best decisions we made was focusing on the higher end of the market. By curating only high-quality bands and positioning FixTheMusic as an exclusive platform, we built trust early and avoided competing on price. A few similar platforms launched in the UK around the same time, completely independently. Although it created competition, the timing actually helped. It educated musicians about online bookings and made the market more receptive to what we were offering. The biggest lesson I learned was the power of persistence. I spent hours manually building profiles, uploading images and writing copy. None of it was glamorous, but those small efforts compounded. Many entrepreneurs switch ideas too quickly. If something shows early traction, keep going and stay focused.

What platform/tools does FixTheMusic use?

Amazon Web Services Platform 147 using OpenAI Platform 64 using Django Platform 39 using Postmark Platform 35 using Custom Built Stack 232 using Google Analytics Analytics 1,073 using Slack Productivity 821 using G Suite Productivity 507 using Trello Productivity 383 using YouTube Social Media 1,053 using Pinterest Social Media 478 using TikTok Social Media 277 using Instagram Social Media 20 using Facebook Social Media 19 using LinkedIn Social Media 12 using Stripe Payments 781 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; }

Discover Similar Business Ideas Like FixTheMusic

IDEA REVENUE Collaborative video gifti... · vidday.com Video maker for celebrations, collaborative videos, and digital gifts. $80K /mo Affordable web design agency · aundigital.ae Affordable web solutions specializing in UAE startups. $20K /mo RH The Global Drone Service ... · reboot-hub.com The Global Drone Service Foundation. DJI drone repair &amp; refurbishment specialist. $2.8K /mo Affordable stylish eyewear · specscart.co.uk Fastest Growing Eyewear Brand in the UK $350K /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(); }); } });

More about FixTheMusic:

Who is the owner of FixTheMusic? When did Edward Southall start FixTheMusic? How much money has Edward Southall made from FixTheMusic? {"@context":"https://schema.org","@type":"FAQPage","mainEntity":[{"@type":"Question","name":"Who is the owner of FixTheMusic?","acceptedAnswer":{"@type":"Answer","text":"Edward Southall is the founder of FixTheMusic."}},{"@type":"Question","name":"When did Edward Southall start FixTheMusic?","acceptedAnswer":{"@type":"Answer","text":"2015"}},{"@type":"Question","name":"How much money has Edward Southall made from FixTheMusic?","acceptedAnswer":{"@type":"Answer","text":"Edward Southall started the business in 2015, and currently makes an average of $1.2M/year."}}]}