Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
59 changes: 59 additions & 0 deletions components/CustomerCaseStudy.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
import Link from 'next/link'

import { ABRICH_RVU_AUDIT_CASE } from '../data/customerCaseStudies'

export default function CustomerCaseStudy() {
const customerCase = ABRICH_RVU_AUDIT_CASE

return (
<section
className="border-b border-hairline bg-ground px-5 py-16 md:py-24"
data-testid="customer-case-study"
>
<div className="mx-auto max-w-5xl">
<div className="grid gap-8 rounded-2xl border border-hairline bg-panel p-6 shadow-[0_12px_40px_rgba(35,40,31,0.06)] md:grid-cols-[0.9fr_1.1fr] md:p-10">
<div>
<p className="eyebrow">Customer result</p>
<h2 className="mt-3 font-display text-2xl font-semibold tracking-tight text-ink md:text-3xl">
{customerCase.title}
</h2>
<p className="mt-4 text-base leading-relaxed text-ink-2">
{customerCase.summary}
</p>
<p className="mt-5 text-sm leading-relaxed text-ink-3">
<span className="font-semibold text-ink">
{customerCase.customer.name}
</span>
<br />
{customerCase.customer.role}
<br />
{customerCase.customer.organization}
</p>
<Link
href={`/customers/${customerCase.slug}`}
className="btn-ink mt-7 inline-block"
>
Read the case study
</Link>
</div>

<div className="grid content-start gap-3 sm:grid-cols-3 md:grid-cols-1">
{customerCase.results.map((result) => (
<div
key={result.label}
className="rounded-xl border border-hairline bg-ground p-5"
>
<p className="font-display text-2xl font-semibold tracking-tight text-ink">
{result.value}
</p>
<p className="mt-1 text-sm leading-relaxed text-ink-2">
{result.label}
</p>
</div>
))}
</div>
</div>
</div>
</section>
)
}
4 changes: 4 additions & 0 deletions components/NavHeader.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,10 @@ const SOLUTIONS_LINKS = [

const PRODUCT_LINKS = [
{ label: 'How it works', href: '/how-it-works' },
{
label: 'Customer results',
href: '/customers/rvu-audit-heart-care',
},
{ label: 'Platforms & deployment', href: '/#product-status' },
{ label: 'Workflows', href: '/workflows' },
{ label: 'Safety', href: '/safety' },
Expand Down
42 changes: 42 additions & 0 deletions data/customerCaseStudies.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
export const ABRICH_RVU_AUDIT_CASE = {
slug: 'rvu-audit-heart-care',
customer: {
name: 'Dr. Victor Abrich, MD',
role: 'Board-certified electrophysiologist',
organization: 'MercyOne Waterloo Heart Care',
profileUrl:
'https://www.mercyone.org/provider/victor-abrich-md-electrophysiology',
},
title: 'Recovering missed billables with automated RVU audits',
summary:
'OpenAdapt automated the repetitive EMR navigation, clicking, and data entry behind Dr. Abrich’s monthly RVU audits.',
challenge:
'RVU audits took several hours every month and still did not consistently surface every missed billable.',
workflow: [
'Review the month’s procedures and expected RVUs.',
'Navigate the relevant records in the EMR.',
'Enter and reconcile audit information through the existing interface.',
'Surface missed billables for correction and follow-through.',
],
results: [
{
value: '≈$75,000',
label: 'recovered billables per year',
},
{
value: 'Several hours',
label: 'of manual audit work saved each month',
},
{
value: 'EMR-native',
label: 'navigation, clicking, and data entry automated',
},
],
result:
'The automated audit caught billables that manual review did not consistently find, recovering approximately $75,000 per year while saving several hours of physician time each month.',
surface: 'Electronic medical record',
workflowType: 'Monthly physician RVU audit',
industry: 'Healthcare',
}

export const CUSTOMER_CASE_STUDIES = [ABRICH_RVU_AUDIT_CASE]
178 changes: 178 additions & 0 deletions pages/customers/rvu-audit-heart-care.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,178 @@
import Head from 'next/head'
import Link from 'next/link'

import Footer from '@components/Footer'
import { ABRICH_RVU_AUDIT_CASE } from '../../data/customerCaseStudies'

const customerCase = ABRICH_RVU_AUDIT_CASE
const canonical = `https://openadapt.ai/customers/${customerCase.slug}`

const articleSchema = {
'@context': 'https://schema.org',
'@type': 'Article',
headline: customerCase.title,
description: customerCase.result,
url: canonical,
about: {
'@type': 'MedicalBusiness',
name: customerCase.customer.organization,
},
mentions: {
'@type': 'Person',
name: customerCase.customer.name,
jobTitle: customerCase.customer.role,
url: customerCase.customer.profileUrl,
},
publisher: {
'@type': 'Organization',
name: 'OpenAdapt.AI',
url: 'https://openadapt.ai',
},
}

export default function RvuAuditHeartCareCaseStudy() {
return (
<div className="min-h-screen bg-ground text-ink">
<Head>
<title>
RVU Audit Automation at MercyOne Waterloo Heart Care |
OpenAdapt
</title>
<meta name="description" content={customerCase.result} />
<link rel="canonical" href={canonical} />
<meta
property="og:title"
content={`${customerCase.title} | OpenAdapt`}
/>
<meta
property="og:description"
content={customerCase.result}
/>
<meta property="og:url" content={canonical} />
<script
type="application/ld+json"
dangerouslySetInnerHTML={{
__html: JSON.stringify(articleSchema),
}}
/>
</Head>

<main>
<section className="border-b border-hairline px-5 py-16 md:py-24">
<div className="mx-auto max-w-4xl">
<p className="eyebrow">Customer case study · Healthcare</p>
<h1 className="mt-3 max-w-3xl font-display text-3xl font-semibold tracking-tight text-ink md:text-5xl">
{customerCase.title}
</h1>
<p className="mt-6 max-w-3xl text-lg leading-relaxed text-ink-2 md:text-xl">
{customerCase.result}
</p>
<div className="mt-7 rounded-xl border border-hairline bg-panel p-5 text-sm leading-relaxed text-ink-2">
<a
href={customerCase.customer.profileUrl}
target="_blank"
rel="noopener noreferrer"
className="font-semibold text-ink hover:underline"
>
{customerCase.customer.name}
</a>
<br />
{customerCase.customer.role}
<br />
{customerCase.customer.organization}
</div>
</div>
</section>

<section className="border-b border-hairline bg-panel px-5 py-14 md:py-20">
<div className="mx-auto grid max-w-4xl gap-4 md:grid-cols-3">
{customerCase.results.map((result) => (
<div
key={result.label}
className="rounded-xl border border-hairline bg-ground p-6"
>
<p className="font-display text-3xl font-semibold tracking-tight text-ink">
{result.value}
</p>
<p className="mt-2 text-sm leading-relaxed text-ink-2">
{result.label}
</p>
</div>
))}
</div>
</section>

<section className="px-5 py-16 md:py-24">
<div className="mx-auto max-w-4xl">
<div className="grid gap-10 md:grid-cols-2">
<div>
<p className="eyebrow">The challenge</p>
<h2 className="mt-2 font-display text-2xl font-semibold tracking-tight text-ink">
High-value work hidden inside a manual audit
</h2>
<p className="mt-4 text-base leading-relaxed text-ink-2">
{customerCase.challenge}
</p>
<p className="mt-4 text-base leading-relaxed text-ink-2">
The job required moving through the existing
EMR, reconciling procedure and RVU
information, and entering the audit results
through the same interface used by the
clinical team.
</p>
</div>

<div>
<p className="eyebrow">The workflow</p>
<h2 className="mt-2 font-display text-2xl font-semibold tracking-tight text-ink">
Let automation handle the repetition
</h2>
<ol className="mt-4 space-y-3">
{customerCase.workflow.map((step, index) => (
<li
key={step}
className="flex gap-3 text-base leading-relaxed text-ink-2"
>
<span className="font-mono text-sm font-semibold text-accent">
{String(index + 1).padStart(2, '0')}
</span>
<span>{step}</span>
</li>
))}
</ol>
</div>
</div>

<div className="mt-14 rounded-2xl border-2 border-ink bg-panel p-7 md:p-10">
<p className="eyebrow">The result</p>
<h2 className="mt-2 max-w-3xl font-display text-2xl font-semibold tracking-tight text-ink md:text-3xl">
More complete audits without spending physician
hours clicking through the EMR
</h2>
<p className="mt-5 max-w-3xl text-base leading-relaxed text-ink-2 md:text-lg">
{customerCase.result}
</p>
</div>

<div className="mt-14 text-center">
<p className="eyebrow">Bring your workflow</p>
<h2 className="mx-auto mt-2 max-w-2xl font-display text-2xl font-semibold tracking-tight text-ink">
Qualify the UI-only work your APIs cannot reach
</h2>
<p className="mx-auto mt-4 max-w-2xl text-base leading-relaxed text-ink-2">
Show us one repeated workflow, its target
application, and the business result that proves
it worked.
</p>
<Link href="/#book" className="btn-ink mt-6 inline-block">
Qualify one workflow
</Link>
</div>
</div>
</section>
</main>

<Footer />
</div>
)
}
4 changes: 4 additions & 0 deletions pages/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import Link from 'next/link'
import { useRouter } from 'next/router'

import ContactBookingSection from '@components/ContactBookingSection'
import CustomerCaseStudy from '@components/CustomerCaseStudy'
import DashboardShowcase from '@components/DashboardShowcase'
import Developers from '@components/Developers'
import EmailForm from '@components/EmailForm'
Expand Down Expand Up @@ -209,6 +210,9 @@ export default function Home({ githubStats, buildWarnings, hostedOffer, installS
<Reveal>
<HowItWorksCondensed />
</Reveal>
<Reveal>
<CustomerCaseStudy />
</Reveal>
{/*
* The deep concept explanations — what a demonstration compiles
* into (CompiledProgramSection) and what "repair" means and where it
Expand Down
1 change: 1 addition & 0 deletions public/llms.txt
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
- [Privacy Module](https://github.com/OpenAdaptAI/openadapt-privacy): Open-source PII/PHI scrubbing

## Use Cases
- [Customer Case Study — RVU Audits](https://openadapt.ai/customers/rvu-audit-heart-care): How Dr. Victor Abrich used OpenAdapt to automate monthly EMR-based RVU audits, save several hours of manual work each month, and recover approximately $75,000 per year in missed billables
- [Healthcare Execution Infrastructure](https://openadapt.ai/solutions/healthcare): Governed last-mile execution for RCM vendors, healthcare BPOs, automation teams, and vertical-software companies that already have structured input and business logic
- [Lending Operations](https://openadapt.ai/solutions/lending): A demonstrated Frappe Lending workflow compiled into model-free replay and checked against independent REST and SQL effect oracles
- [Insurance Claims Execution](https://openadapt.ai/solutions/insurance): A demonstrated openIMIS claims-intake workflow compiled into model-free replay and checked against a direct SQL claim-row oracle
Expand Down
6 changes: 6 additions & 0 deletions public/sitemap.xml
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,12 @@
<changefreq>monthly</changefreq>
<priority>0.8</priority>
</url>
<url>
<loc>https://openadapt.ai/customers/rvu-audit-heart-care</loc>
<lastmod>2026-07-24</lastmod>
<changefreq>monthly</changefreq>
<priority>0.9</priority>
</url>
<url>
<loc>https://openadapt.ai/solutions/lending</loc>
<lastmod>2026-07-18</lastmod>
Expand Down
46 changes: 46 additions & 0 deletions tests/customerCaseStudy.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
const assert = require('node:assert/strict')
const fs = require('node:fs')
const path = require('node:path')
const test = require('node:test')

const root = path.join(__dirname, '..')
const read = (relativePath) =>
fs.readFileSync(path.join(root, relativePath), 'utf8')

test('the customer case study is a direct OpenAdapt result', () => {
const data = read('data/customerCaseStudies.js')
const component = read('components/CustomerCaseStudy.js')
const page = read('pages/customers/rvu-audit-heart-care.js')
const combined = `${data}\n${component}\n${page}`

assert.match(combined, /Dr\. Victor Abrich, MD/)
assert.match(combined, /Board-certified electrophysiologist/)
assert.match(combined, /MercyOne Waterloo Heart Care/)
assert.match(combined, /≈\$75,000/)
assert.match(combined, /recovered billables per year/)
assert.match(combined, /Several hours/)
assert.match(combined, /manual audit work saved each month/)
assert.match(combined, /EMR/)
assert.match(combined, /RVU/)
assert.doesNotMatch(
combined,
/TurboPA|RVUBot|predecessor|historical product|earlier product|evolved from/i
)
})

test('the customer result is visible from the homepage and product navigation', () => {
const home = read('pages/index.js')
const navigation = read('components/NavHeader.js')
const sitemap = read('public/sitemap.xml')
const llms = read('public/llms.txt')

assert.match(home, /import CustomerCaseStudy/)
assert.match(home, /<CustomerCaseStudy \/>/)
assert.match(navigation, /Customer results/)
assert.match(navigation, /\/customers\/rvu-audit-heart-care/)
assert.match(
sitemap,
/https:\/\/openadapt\.ai\/customers\/rvu-audit-heart-care/
)
assert.match(llms, /Customer Case Study — RVU Audits/)
})
Loading