Recording of the visual regression run on www.listmymrr.xyz · List My MRR — founder dashboard walkthrough.

In this video· click a step to jump to it

W
Passed ✓

Test recording

List My MRR — founder dashboard walkthrough

75,764 ms · 3,042 pixels changed

We built this regression test for www.listmymrr.xyz — it's yours to keep, free.

Take this test with you

This is a real Playwright test, recorded against www.listmymrr.xyz. Claim it into your own workspace and re-run it on every deploy — free.

export async function test(page, baseUrl, screenshotPath, stepLogger) {
  const STAMP = Date.now().toString(36);
  const shot = (n, slug) => screenshotPath.replace('.png', '-' + n + '-' + slug + '.png');
  const SCROLL_THROUGH = "(async () => { const ease = t => 1 - Math.pow(1 - t, 3); const max = Math.max(0, document.body.scrollHeight - window.innerHeight); if (max < 40) return; const anim = (a, b, ms) => new Promise(res => { const t0 = performance.now(); const step = now => { const p = Math.min(1, (now - t0) / ms); window.scrollTo(0, a + (b - a) * ease(p)); p < 1 ? requestAnimationFrame(step) : res(); }; requestAnimationFrame(step); }); await anim(0, max, 1400); await new Promise(r => setTimeout(r, 350)); await anim(max, 0, 800); })()";

  await page.context().setExtraHTTPHeaders({ 'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/132.0.0.0 Safari/537.36' });
  await page.route('**/cdn-cgi/scripts/**/email-decode.min.js', function (r) { r.abort(); }).catch(function () {});

  // ─── 1. Public home ───────────────────────────────────────────────────────
  stepLogger.log('Home - the leaderboard pitch');
  await page.goto(baseUrl, { waitUntil: 'domcontentloaded' });
  await page.waitForLoadState('networkidle', { timeout: 4000 }).catch(function () {});
+96 more lines — claim the test to get the full code.

Checks run

Run
✓
Visual
7.03%
Text
—
DOM
✓
Network
+0 −13
Console
✓
A11y
A
Perf
182 over
URL
✓
Variables
—
Full report
Log in →
3,042
Diff px
1m 16s
Duration
A
Accessible
WCAG 2.2 · 93
C
Fast
Web Vitals · 70

Notes from the demo run

AI-generated

We signed in with Google and walked the founder side of List My MRR the day after you shipped it: dashboard, the listing form, the three leaderboard rankings and the explore directory. The listing flow is the strongest part — six payment providers behind one picker, and the API-key panel tells people exactly how to make a read-only key and that you never store it, before they have to decide whether to trust you. That paragraph is doing the heavy lifting on a page where trust is the whole conversion.

Highlights
  • The API-key ask is handled well
    "Click here to create a read-only API key · Scroll down and click 'Create key' · Don't change the permissions · Your key is used once to read your revenue totals and is never stored — revoke it in Stripe any time." Numbered, specific, and it pre-answers the objection instead of hoping nobody has it.
  • Six providers, not just Stripe
    Stripe, LemonSqueezy, Polar, Dodo Payments, Paddle and RevenueCat in the picker. RevenueCat in particular means mobile founders are not locked out on day one.
  • Paid placement is explicitly separated from rank
    "A Featured slot puts your business at the top... pure visibility, not rank manipulation. Your organic MRR ranking stays exactly where it is." On a leaderboard product that sentence is the entire credibility model, and you put it on the dashboard rather than burying it.
  • Anonymous mode exists at listing time
    Letting a founder publish a number without publishing themselves will get you listings from people who would otherwise never submit.
Friction points
  • Every ranking view is empty, including for a signed-in founder
    Leaderboard (all three tabs) and Explore both render "No businesses found" / "Showing 0 businesses". That is expected the day after launch, but it means a visitor's first impression of a leaderboard product is an empty leaderboard. Seeding even a handful of verified listings, or showing a "first 10 founders get the top slots" state instead of a null result, would convert far better than the empty table.
  • The listing form scrolls inside a fixed card
    On a 1280x720 viewport the Website URL field sits below the card's internal scroll line while the Add startup button stays pinned in view — so the primary CTA is visible before the required field is. Letting the card grow with the page would stop people clicking Add startup on a half-filled form.
Couldn't reach
  • Add startup (submit)·Completing it requires a live Stripe read key — we fill the form and stop there rather than connect real payment credentials.
  • /dashboard Upgrade to Pro / Book Featured Slot·Checkout flows; we do not enter them on someone else's product.

Visual change

Step 113,042 px changed
Before
Before
After
After
Diff
Diff

Share this run

Earned · Lastest awards

Proof your app is not AI slop

LASTEST
starter
tests
all passing
regressions
0
Badges stay live, ratchet upward, only downgrade on confirmed regression.
57,226 test runs recorded · 1,151 products tested with Lastest

This test was built for www.listmymrr.xyz — claim it free

One click copies the test and baseline screenshots into your own Lastest workspace. Re-run on every deploy and catch regressions before your users do — free, no card required.