← 一覧へ

Studyquick

初年度に4万ユーロ(約600万円)を稼いだ勉強アプリの作り方
月商 $2,000 · 創業者1人 · 従業員0人 · Braunfels
Jonas Schmidt(Founder, Studyquick)· 創業 July 2023 · 記事掲載 May 31st, 2025 · www.studyquick.io · 元の記事

何の商売か
誰が大学の勉強で良い成績を取りたいが、膨大な学習時間やモチベーションの維持に悩む大学生・専門学校生(欧州中心、主にドイツ語圏と推測)
何のために科学的な学習方法に基づいたツールを使って、短時間で効率的に試験対策を終え、「非常に良い」成績を無理なく取得したい
何を買うか学生向け学習ソフトウェア「Studyquick」を156ユーロ(約23,400円)の「ラージパッケージ」で利用する。他にも小・中規模のパッケージがあり、無料トライアル後に購入。払い方は買い切りか定期かは不明。その他の料金プランは不明

創業者が元々通っていた大学のニュースレター、コールドメール、SNSで最初のユーザーを獲得。最も効果的だったのはSEOで、Googleからのオーガニック流入。Instagram、TikTok、YouTubeでもショート動画などを活用し、無料の資料を配布して集客。無料登録者へのメールシーケンスで、購入までの期間を30日から半分以下に短縮した。月商2,000ドル(約30万円)、創業者1人の規模は2025年5月の記事時点の自己申告

売値の出典: 記事の本文(2025年時点、ラージパッケージの値段として156ユーロと記載。サイトに料金ページはなし)(2026-10-14 取得)

Who are you and what business did you start?

I'm Jonas and I am the founder of Studyquick. Studyquick is a software that enables students to achieve a "very good" grade in their next exam in just 5 hours. According to a study we conducted ourselves, students spend an average of 34 hours studying for a “satisfactory” grade in an exam. With Studyquick, you can write your desired grade in a relaxed manner and in less time. Unique about Studyquick is that it is based on my own story as a failed student. From consistently mediocre at university, completely stressed out and 0 motivation to an excellent A student who was even flown to the USA as a university representative. My professor, us USA student reps and our coach Based on what I discovered on this journey, science based study methods and a German team of developers we packed the ultimate (individual) learning path for every student in one tool. Free to try for everyone here: my link I started with my own money right after I quit university (spoiler: I then took up my studies again and passed with excellence). Today Studyquick is profitable and made over 40.000€ in revenue in the first full year after launch (2024).

How do you come up with the idea for Studyquick?

I had the idea when I went abroad to Dubai after I quit my studies (I quit them because it was not satisfying and I lost my motivation). I was working there on another educational software as a head of product and I saw a huge potential in it. That's why I went to my boss and told him about features I wanted to implement and suggestions for repositioning etc. He did not like my approach and even send me a warning letter at a certain point to make sure to keep me in line. This showed me that this is not the place to operate on my full potential. So I quit. I went back to my hometown in Germany. I was furious, angry and lost. I had an idea for a great product but nobody wanted to execute it. So I decided to do it on my own. As a former student I was sure that what I had in my mind would be a game changer for every student. I was so sure that I spent all the money I saved on this project. I started with a proof of concept (POC) to test if I could earn real money with it (I payed a Bulgarian software agency to do this as cheap as possible). First POC

How did you build the initial version of Studyquick?

Jonas built Studyquick by starting with a proof of concept, which he tested to see if it could earn real money. He then invested his own money into the project and worked with a Bulgarian software agency to create the initial prototype. Despite doubts about user willingness to pay, Jonas added a paywall and sold his first package within four months. The development process took him a year, with an initial revenue of over 40.000€ in the first full year after launch. Jonas faced challenges but remained focused on execution.

How did you launch Studyquick and get initial traction?

I launched the POC by pushing it to the university newsletter. I had access to it because I discovered how to study more efficiently and re-applied for my universities program. Originally I just wanted to gain some feedback but I ended up with more than 300 users. And the feedback was incredible: Feedback on Studyquick I immediately sat together with the users to discover what were the main drivers of this success and if they would also pay for it. There where some bug fixes and feature requests but at the end I still was not sure if users really would pay for it (even if they said so). So I stopped asking them and just added a paywall. I mean, what is the worst thing that could happen? I know a lot about pricing and marketing from my previous work, interests and studies so I created 3 packages (small, medium and large) for people to upgrade to. And on the same day I sold my first package - the large one. It is even more crazy if you consider that broke university students normally do not have 156€ (price for the large oackage) for some bullshit. In total it took me 4 months to make the first dollar.

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

The strongest and most stable lead source is SEO. I pushed the first users through cold emails and social media to the website but even if I do not do any marketing activities there still will be 10 to 20 registrations just trough Google. We made the algorithm understand that www.studyquick.io is a relevant source for students in order to generate AI handouts, exams and answers. So we really doubled down on keywords and technical improvements like loading time of the website, small images etc. Social media (Instagram, TikTok and YouTube) is the second most important channel because it gives me the chance to push specific ressources like whitepapers, studies and other free stuff to my audience. I focus always on the latest updates and features of these social media platforms like short form content or the new "Trial Reel" feature by Instagram to maximize reach. Lead generation of Studyquick After the registration I started with a short email sequence of 3 emails. But I quickly discovered that it took on average 30 days to upgrade to the payed version. So I increased the number of days people receive an email after registration from 3 to 30: This is how I could decrease the time until purchase from 30 to less than 50% (15 days) which means more liquidity and faster scaling. I would recommend to any founder to use all of his ressources, try them out and check which one works the best and then double down on it. You start with 0 but you want 100. You will not get it if you spread your focus.

What were the biggest lessons learned from building Studyquick?

An important learning from my trip: Startup founders are not managers. Here's why: “There is NO EXCUSE for NO EXECUTION.” With my 12 months in the startup scene in Germany, I'm really anything but a veteran. And yet there's one thing that always annoys me among other peer founders: "I need investors first before I can get started." "I'm still waiting for a grant to be approved." "I still need a Tecci so that I can start up." Valid challenges, no question - but also a cheap excuse. And much worse: not entrepreneurship (but management)! As part of my business studies at Justus Liebig University Giessen, I learned to make a fundamental distinction between these two things: Entrepreneurship = seizing market opportunities with existing resources and achieving the greatest possible goal. Management = Achieving a given goal with the addition of necessary (external) resources. As startup founders, we don't start out as managers! What do we want to manage if we don't even have a real company yet, but "only" an entrepreneurial spirit and an idea? Instead, we have very limited resources. And it's our job to deal with that and decide the best possible next step on the chessboard. We have to prove ourselves before someone else believes in us and provides resources. If I had waited for an investor, co-founder or grant a year ago, I would 100% NOT be working on Studyquick 3.0 today. I would not have been able to attract 2000 users and would probably still be working on the first iteration of the landing page (https://lnkd.in/eYvhKn89). And this as a non-techie who wanted to found a software AI startup and was fresh out of university. So for the rest of my life I will remember the following: “There is NO EXCUSE for NO EXECUTION.” One last thing, which might be useful: A Gift idea for entrepreneurs or founders in your inner circle: Buy their offer at full price and leave review. Better than any bottle of wine, trust me. I speak from experience. :) My image

What platform/tools does Studyquick use?

Google Sheets Platform 288 using Webflow Platform 119 using OpenAI Platform 64 using Klaviyo Email 300 using Laravel Stack 43 using Google Analytics Analytics 1,073 using Google Tag Manager Analytics 259 using MixPanel Analytics 42 using Asana Productivity 262 using Figma Design 128 using YouTube Social Media 1,053 using TikTok Social Media 277 using Instagram Social Media 20 using LinkedIn Social Media 12 using Stripe Payments 781 using Zapier Other 335 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 Studyquick

IDEA REVENUE Simulated marketing inter... · stukent.com Simulated internships for real-world digital marketing experience. $2.16M /mo Frontend coding challenge... · frontendmentor.io Real coding projects for aspiring developers $30K /mo Gamified backend coding c... · boot.dev "Interactive coding courses for aspiring backend developers." $1M /mo SaaS mentorship marketplace · mentorcruise.com Mentorship marketplace connecting aspiring professionals with industry experts. $25K /mo Hands-on steams education... · upbrainery.com Tech-driven STEAM educational kits and platform for kids. $87K /mo TA Ai-powered note-taking as... · turbolearn.ai AI note-taking tool for students. — Online business growth guide · onehourprofessor.com Blog sharing online business strategies and income reports $40K /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 Studyquick:

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