Shopify Custom App Development Case Study: RVL Skincare
The contract lives in Stripe outside the store, the doctor assembles a care routine, and the practice can charge the saved card for it on its own initiative.
This case study covers a custom platform built alongside a Shopify store for a concierge dermatology practice. The store holds a medical-grade skincare line. Everything else the practice runs on sits in a separate application: long-term care contracts, membership plans, signed consents, appointment scheduling, doctor-assembled routines and charges against saved cards. Roughly seven months from working MVP to the full platform.
patients under contract, with auto-renewal, a club membership tier and doctor-curated routines sold as bundles
RVL Skincare turns a dermatology practice into a continuing relationship rather than a series of appointments.
The patient signs a long-term care contract, attaches a card and gains the ability to book appointments. That booking right is the main value of the account; product purchases follow from it. The doctor assembles a care routine for the patient, which can be bought whole in one action or broken into individual items. Separately, the practice can charge the card already on file at its own initiative, without waiting for the patient to act.
Before this project that logic was assembled from Shopify apps that conflicted with each other and still did not cover what was needed. Above them sat two limits no app works around. Shopify’s Acceptable Use Policy lists uploading Protected Health Information subject to HIPAA among unsupported activity, and contracts, consents and medical instructions are exactly that. And saving cards for later charges is available on Shopify only to B2B customers on Shopify Payments, with manually entered card details impossible to vault at all. This practice runs on standard Shopify and serves retail patients rather than companies, so that path does not exist for it.
RVL Skincare, SKIN NY Dermatology PLLC
Dermatology, concierge patient care and medical-grade skincare
New York, USA and Ontario, Canada
Shopify
Dr. Rita V. Linkner runs a concierge dermatology practice with an in-house product line. Patients pay for continuing access rather than for single visits, which makes the contract, not the cart, the object the business turns around.
They hold an active contract, book appointments against it, and see documents, charges and assigned routines.
A lighter, cheaper tier for those who want access without the full scope of care.
The doctor and her administrators manage contracts, scheduling, routines and payments arriving by card, in person, or initiated by the practice.
The seller is the doctor, not the buyer
The practice needed to charge a stored card on its own initiative while the patient is off-session. Retail commerce assumes the opposite direction.
Saved cards outside the store's reach
Shopify vaults cards only for B2B customers on Shopify Payments, and details entered manually in the admin cannot be vaulted. This practice runs standard Shopify and serves retail patients.
A contract a subscription model cannot express
Shopify subscription contracts are created only through a completed checkout. Here the order runs the other way: policies, consents, card on file, and a payment the admin may take manually, including in person.
Contracts that must outlive any app
48 hours after a subscription app is uninstalled, every contract it owns is cancelled. An agreement between a doctor and a patient cannot sit on that footing.
Data that cannot enter the store
Patient records, consents and medical instructions fall under a category the platform’s own policy excludes.
Two countries in one payment layer
The practice operates in the United States and Canada. A Stripe account is bound to a country, and one account does not serve both.
Consent and mandate before anything else
The patient reads the policies, signs the consents and attaches a card before the contract is signed. An off-session charge requires an agreement covering the practice’s right to initiate payments, their expected frequency and how the amount is determined. The consent flow is what makes every later charge legitimate.
A portal gated by contract, with booking at its centre
Upcoming and past appointments, booking with a chosen practitioner, assigned routines, documents and cards in one place. Until the contract is signed and paid, the patient cannot select a contract or book. Patients hold two linked accounts: one in the store, one on the platform.
Routines bought in one action
An administrator assembles a product set for the patient in advance. The patient buys the whole routine or individual items from it, and the products land in the store’s regular cart.
Contracts with tiers and auto-renewal
Several levels where the amount is not tied to a fixed plan, adjustable by the administrator at any moment. Automatic charging on contract completion was added, so renewal no longer takes manual work.
A club tier as a lighter entry point
A cheaper form of membership for patients who want access without the full scope of care.
Three ways money arrives
The patient pays directly, the administrator processes an in-person payment from the panel and closes the contract as paid, or the practice charges the saved card off-session. Every path produces an invoice available in the portal.
Scheduling across practitioners and locations
The admin sets where and when appointments are available, along with the price range. Panel data exports to PDF.
An integration layer the team maintains itself
The Shopify connection is built on a package whose upstream is no longer developed, so support and extension are handled in-house.
Three money paths that never cross
Membership payments never pass through the store. The membership contract lives in Stripe, while Shopify handles product sales through the regular cart and checkout. A third payment path sits alongside them: when a doctor decides a patient is due for the next routine, the practice charges the patient’s saved card directly.
That third path depends on several things being established upfront. The patient’s signed consent serves as the mandate for off-session charges, while the card is stored as a reusable payment method rather than as part of a one-time transaction. The charge itself is initiated directly from the practice’s own panel.
Geography introduces another layer. The practice operates in both New York and Ontario, while each Stripe account is tied to the country where the business is registered. For businesses operating across countries, Stripe uses separate accounts for each country and provides an organization layer for consolidated reporting. Here, separating the payment paths is therefore a requirement of the payment infrastructure, not a workaround.
The practice sells at the moment of the decision
The doctor assembles a routine, and it is either bought in one action or paid for by a practice-initiated charge.
Contract renewal stopped being manual work
Charging happens automatically on contract completion.
A second entry tier appeared
Club membership opens access to patients for whom a full contract is more than they need.
One system instead of a stack of apps
The patient, their contract, appointments, routines and charges are visible in one place.
Payments separated by country
Distinct pipelines for the US and Canada, with reporting per account.
Scale
More than 600 patients under contract, per platform data.
Patient Contracts and Off-Session Payments
Only with an agreement in place. A charge made while the customer is not present is an off-session, merchant-initiated transaction, requiring terms the customer opted into covering the right to initiate payments, their frequency and how the amount is set. That is why the consent flow sits before the contract.
Only for B2B customers on Shopify Payments. Card details entered manually in the admin cannot be vaulted, and even a vaulted B2B card is not charged automatically when payment terms expire. For a retail patient on standard Shopify there is no such path.
Shopify’s Acceptable Use Policy lists uploading Protected Health Information subject to HIPAA among unsupported activity. For a medical practice that means storefront and catalog on Shopify, with patient records, contracts and prescriptions in a separate system.
A Shopify subscription contract is created only through a completed checkout. If payment can happen outside the store and terms change by hand, the model does not fit. Second reason: 48 hours after the app is uninstalled its contracts are cancelled.
The practice operates in the United States and Canada, and a Stripe account is bound to a country. Stripe names separate accounts per country as the standard pattern for multi-region operation, with an organization layer for consolidated reporting.
On this project, working MVP to full platform ran about seven months. The timeline depends on how many payment paths and roles you support, and on how strict the data handling requirements are.