Case Study · Stull CPA · Tax & Wealth Advisory
Stull CPA runs tax season on Salesforce. Intake to invoice, one system.
A US tax and wealth advisory firm ran two businesses on one client base, and the work lived everywhere: organizers as PDF attachments, documents by email, handoffs by memory, billing in a system nobody reconciled until month end. As their embedded Salesforce team we built the practice a single operating system - typed cases that route themselves, tax organizers clients fill online, e-signature and document filing that never touch a staff inbox, and a Stripe bill that goes out from the same screen the work was done on. Over 2,200 hours delivered and still building.
Industry
Tax, accounting & wealth advisory
Platform
Salesforce + Stripe + Titan + Box
Timeline
Ongoing, 2,200+ hours to date
Outcome
Intake to invoice in one system
The challenge
Stull CPA: a tax and wealth practice that outgrew its inbox
Stull CPA serves its clients twice over: tax preparation on one side, wealth management on the other. Before the rebuild, the operational glue was email and memory. Organizers went out as PDF attachments, completed documents came back to inboxes, work moved between staff verbally, consent-sensitive assignments depended on people remembering who had signed what, and billing lived in a separate system reconciled at month end. Tax season meant volume the process could not absorb.
Work lived in email
Organizers, client documents, and signatures all moved through inboxes, and every attachment needed a human to file it somewhere a colleague might find it.
Consent routing by memory
IRS Section 7216 consent determines who may touch a return. Assignment depended on staff remembering each client’s consent status, with no enforcement behind it.
Billing disconnected from the work
Invoices were raised in a separate system with its own version of the client list, reconciled at month end, with recurring fees invoiced by hand.
Two businesses, one client base
Tax and wealth ran different work on the same accounts: cashiering, distributions, and financial-account moves needed different fields, routing, and visibility than tax returns.
An empty system is a dead system
None of it works if the book of business is not in it: years of accounts, contacts, tasks, and engagement history had to move over clean.
The architecture
Intake to invoice, without leaving the case
Every engagement becomes a typed case. The case routes itself by type and consent status, collects its documents through organizers and Titan e-sign into Box, and bills itself through Stripe when the work is done.
Sources
Built by Cloudsheer
Outcomes
What we built
A case-driven workflow engine
Typed cases for tax returns, onboarding, payroll setup, cashiering, and missing documents, routed by record-triggered flows to the right queues, with IRS 7216 consent deciding which staff group may receive the work.
Digital tax organizers
1040 and S-Corp organizers as custom LWC forms on public links. Client answers write to Salesforce, a generated PDF files to the client’s Box folder, and Titan handles the signatures.
Stripe billing from the case
A Send Invoice button that computes the amount from the engagement’s own rate fields, offers invoice versus immediate charge, finalizes in Stripe, and emails the client. Subscription schedules cover recurring engagements; a webhook listener syncs customers and payment methods both ways.
Box document automation
Client folders created by callout when accounts are created, with batch retry and failure logging, and Box events flowing back onto the Salesforce record.
A client portal and feedback loop
An Experience Cloud portal for secure uploads, automated welcome emails, and post-engagement surveys reported on a leadership dashboard that emails itself out daily.
Payroll and CAS automation
Payroll setup and run workflows, monthly CAS reconciliation cases, and bookkeeping communications, following the same case pattern as the tax side.
The book of business, migrated
Over a thousand hours of record migration and cleanup: accounts, contacts, tasks, opportunity contact roles, deduplication, owner reassignment, and default rates backfilled across the book.
How we did it
One operating system for a two-sided practice
Stull CPA is really two firms sharing one client base: a tax practice with brutal seasonal peaks and a wealth advisory business with compliance obligations of its own. The system we built treats every piece of work as a typed Salesforce case - tax return, onboarding, payroll setup, cashiering, missing documents - and routes it automatically to the right queue. The routing is consent-aware: clients who have signed IRS Section 7216 consent route to one staff group, and everyone else routes to a restricted operations team. That distinction used to live in people's memories; now the automation enforces it on every single case.
The client-facing half is where tax season changed shape. We built the firm's 1040 and S-Corp organizers as custom Lightning Web Component forms served from public links: the client fills the organizer in a browser, the answers write straight onto their Salesforce records, a generated PDF files itself into the client's Box folder, and the engagement letter and returns route for signature through Titan. Documents that used to arrive as email attachments and get dragged into folders by hand now file themselves, and the Box automation logs and retries its own failures.
Billing moved to where the work happens. We built the Stripe integration in Apex: a Send Invoice button on the case reads the engagement's own rate fields - planning fees, hourly rates by role, flat annual fees - computes the amount, lets staff choose between an invoice and an immediate charge, creates and finalizes it in Stripe, and emails it to the client, logged back on the case. Recurring engagements run on Stripe subscription schedules, and a webhook listener keeps customers and payment methods in sync in both directions. The named Apex classes behind this ship with test coverage between 85% and 100%.
None of it would matter if the system had started empty. Over a thousand hours of the engagement went into migrating and cleaning the firm's book: accounts, contacts, task history, opportunity contact roles, deduplication, owner reassignment, and rate fields backfilled across every client. It is the unglamorous half of a platform build, and it is the half that decides whether a team trusts the new system on day one. The engagement is ongoing: the core routing flow is past its eightieth version, which is what a system that keeps pace with a real practice looks like.
How we delivered
Ongoing, 2,200+ hours to date, start to finish
Discovery & foundation
Record types, case taxonomy, and queues that mirror how the practice actually hands work around.
Migrate the book
The long haul: accounts, contacts, history, and rates moved and cleaned, so the system starts full.
The workflow engine
Routing flows by type, subtype, and 7216 consent; task automation; the queues and dashboards behind them.
Organizers & e-sign
LWC organizers on public links, PDF generation, Titan signatures, and Box filing with retry logging.
Billing & beyond
The Stripe suite, payroll and CAS automation, the portal, surveys, and continuous iteration in production.
The results
What changed for the business
| Metric | Before | After |
|---|---|---|
| Tax organizers | PDF attachments by email | Filled online, filed to Box, signed via Titan |
| Work assignment | Handoffs by memory | Typed cases auto-routed, consent-aware |
| Invoicing | Separate system, month-end reconcile | Send Invoice on the case, two clicks |
| Recurring fees | Raised by hand | Stripe subscription schedules |
| Client documents | Inbox archaeology | Box folders created and retried automatically |
| Leadership visibility | Ask around | Dashboards emailed daily |
Running a practice on inboxes and memory?
Book a free 30-minute scoping call. We will map how work actually moves through your firm, show you what a case-driven practice system looks like on Salesforce, and hand you a plan - migration included in the estimate, not discovered after it.
Client identifying details have been anonymized at the client's request. Metrics reflect the outcomes of a real engagement.
