HCPCS code S0108 – Mercaptopurine oral 50 mg
HCPCS code S0108 covers mercaptopurine, oral, 50 mg, and one unit equals 50 mg of the drug. It's an S-code, so Medicaid and commercial plans pay it, and Medicare Part B never does. A Medicare patient's mercaptopurine runs through Part D, the pharmacy benefit, instead.
For billing staff, most S0108 denials trace back to three slips. The NDC is missing, the units don't match the milligrams dispensed, or the claim went to the wrong payer. Each one is easy to catch before submission, starting with the unit math.
- Chapter
- S0012-S9999 Temporary national codes (non-Medicare)
- Category
- S0012-S0197 Non-Medicare Drug codes
- Status
- Active
- Code also known as
- 6-MP, 6-mercaptopurine, Purinethol, oral antimetabolite
Let Pabau's smart automation suggest the right codes, reduce claim denials, and keep your practice compliant—effortlessly.
- AI-powered code suggestions
- Real-time compliance checks
- Faster claims, fewer denials
Automate repetitive tasks and focus on what matters most—your patients.
Reduce coding errors and ensure compliance with the latest regulations.
Clean claims, fewer denials, and faster reimbursements.
Powerful insights and reporting to help your practice thrive.
HIPAA compliant SOC 2 certified GDPR-compliant Trusted by 4,000+ clinics worldwide
Key takeaways
HCPCS code S0108 bills oral mercaptopurine, with one unit equal to 50 mg of the drug.
S-codes aren’t payable under Medicare Part B, so S0108 goes to Medicaid or commercial plans only.
Most Medicaid and commercial payers want the 11-digit NDC beside S0108, and a missing NDC is the top denial cause.
Off-label IBD claims need a covered K50.x or K51.x code plus a note explaining why mercaptopurine fits.
Pabau, the practice software we build, pre-fills claims from the patient record and flags empty required fields before submission.
HCPCS code S0108 bills oral mercaptopurine in 50 mg units
HCPCS code S0108 reports mercaptopurine, oral, 50 mg, the thiopurine known as 6-MP and sold as Purinethol. Each unit stands for 50 mg, so the claim counts milligrams, not days or bottles.
S0108 belongs to the S-series of HCPCS Level II codes. CMS maintains the HCPCS system for drugs, supplies and services that CPT doesn’t describe. Medicaid programs and private payers use S-codes, but Medicare Part B doesn’t pay them. You can check neighboring codes in our HCPCS code library.
S0108 at a glance for the claim form
Payers cover S0108 for leukemia and, case by case, for IBD
With the basics set, the next question is why the drug was prescribed. Two diagnoses drive nearly every S0108 claim. The FDA-approved use is acute lymphoblastic leukemia (ALL). In pediatric protocols, 6-MP is a backbone drug for maintenance therapy.
The second use is off-label. Gastroenterologists prescribe mercaptopurine as an immunomodulator for Crohn’s disease (K50.x) and ulcerative colitis (K51.x). Here, coverage depends on each payer’s medical policy. Many plans pay, but only with a clinical note that justifies the choice. Without a matching, covered diagnosis code, expect a flat denial.
Diagnosis codes that support an S0108 claim
Five cases where S0108 is the wrong code or the wrong payer
Knowing when not to use S0108 saves as much rework as knowing when to use it. A wrong-payer claim gets denied, and a pattern of them can draw an audit.
- Medicare Part B: Part B excludes S-codes outright. Instead, Medicare patients get oral mercaptopurine through Part D, the pharmacy benefit. Never put S0108 on a Part B claim.
- IV or injectable forms: S0108 covers the oral route only. The rare parenteral forms of mercaptopurine need a different code.
- Other strengths: The descriptor is fixed at 50 mg per unit. A different strength changes the unit count, not the code.
- Diagnoses outside policy: Payers usually won’t cover S0108 outside their published policy. That holds even when the drug is clinically sound.
- Compounded preparations: Custom-compounded mercaptopurine may fall outside S0108. Some payers want the unlisted code J8999 instead, so ask first.
S0108 units are the milligrams dispensed divided by 50
Here’s the whole calculation: total milligrams dispensed, divided by 50, equals billed units. Take a patient on 75 mg daily for 30 days. That’s 2,250 mg, which works out to 45 units.
Doses that aren’t clean multiples of 50 need the payer’s rounding rule, and those rules differ. Confirm the rule before you submit, not after the denial arrives.
Units are only half of the drug line. Most Medicaid and commercial payers also want the NDC for the exact product dispensed. Report it as 11 digits in the 5-4-2 format, on the CMS-1500 or in the 837P file. A switch to another manufacturer’s product brings a new NDC, too.
How an S0108 claim moves from prescription to payment
Once the units and NDC are settled, the claim itself follows a fixed path. Work through it in this order, since each step leans on the one before.
- Confirm the code. Use S0108 only for oral mercaptopurine in 50 mg units. Reserve J8999 for compounded forms or a payer that asks for it. Its descriptor is prescription drug, oral, chemotherapeutic, not otherwise specified (NOS).
- Calculate units. Divide the total milligrams dispensed by 50. Then apply the payer’s rounding rule to any odd dose.
- Attach the NDC. Enter the 11-digit NDC of the product dispensed, formatted 5-4-2 (for example, 59148-0008-10). Most Medicaid programs treat it as mandatory.
- Link the diagnosis. Pick the most specific ICD-10-CM code the chart supports, such as C91.01 for ALL in remission. Confirm the payer’s policy covers it.
- Check prior authorization. If the plan requires PA, confirm the approval is active and covers these units. Put the PA reference number on the claim.
- Route to the right payer. Choose between traditional Medicaid, a Medicaid managed care organization (MCO) or a commercial plan. Never send S0108 to Medicare Part B.
- Add modifiers only if asked. Some payers want a modifier on S-code drug claims. Their billing guide will say which one.
- Submit and follow up. Watch the claim status, and answer any request for records quickly.
The chart below maps five of those checkpoints to the denial code you’ll see if one slips.

Modifiers a payer may ask for on S0108
Modifier rules for S0108 change from payer to payer. Read the plan’s billing guide before you add one. A wrong modifier, or a missing required one, is an easy denial to avoid.
Prior authorization for S0108 depends on the plan and the diagnosis
Expect a PA request from most Medicaid MCOs and many commercial plans. Even so, the rules vary by state and by plan. Some plans cover S0108 for IBD without PA. Others use step therapy, which means documenting that a first-line drug, such as azathioprine, failed first.
New to PA packets? Our guide to the prior authorization process walks through the workflow. For S0108, the packet usually holds these items:
- A confirmed diagnosis with its supporting ICD-10-CM code
- The prescriber’s written order with dose, frequency and duration
- Clinical notes documenting medical necessity
- For off-label IBD use, proof of prior treatment failure if step therapy applies
- Patient demographics and the insurance member ID
Track the approval’s end date as closely as its number. Most payers treat an expired PA exactly like no PA at all.
The chart has to back up every S0108 line you bill
Payers pay on the claim, but they audit on the chart. Each of these elements should sit in the patient record, ready to pull if an auditor asks.
- Confirmed diagnosis: The documented indication and its ICD-10-CM code. Examples are C91.01 for ALL in remission or K50.00 for Crohn’s disease of the small intestine without complications.
- Prescriber order: Mercaptopurine, the dose in mg, the frequency and the length of therapy.
- NDC: The 11-digit NDC of the product dispensed, in the record and on the claim.
- Dispensing record: The quantity supplied and the date of service, from the pharmacy or practice log.
- PA approval: The approval number, covered period and approved quantity, linked to the claim.
- Medical necessity note: For off-label use, a note explaining why mercaptopurine suits this patient. Cite clinical guidelines where they apply.
Run this checklist before an S0108 claim goes out
With the chart in order, a quick front-end check catches most errors before a payer sees them. Build these six checks into your clean claim routine, and run them on every S0108 line:
- The NDC is present, 11 digits long, and matches the product dispensed.
- Units equal total milligrams divided by 50, with the payer’s rounding rule applied.
- The ICD-10-CM code is on the payer’s covered list for S0108.
- Any required PA is active on the date of service and covers the billed units.
- The claim is headed to Medicaid or a commercial plan, never Medicare Part B.
- Modifiers match the payer’s written guidance, or the line carries none.
Rates for S0108 come from each payer’s fee schedule, not CMS
S0108 has no national Medicare rate. Because Part B excludes S-codes, the Physician Fee Schedule doesn’t list them. Neither do the CMS Average Sales Price (ASP) drug pricing files. Instead, each payer sets its own rate, and the spread is wide.
For current figures, check your state Medicaid fee schedule portal. Commercial payers will send their drug fee schedule on request. Rates shift with contracts, average wholesale price (AWP) formulas and formulary tier. Refresh them every benefit year rather than trusting last year’s numbers.
Keep a written record of each payer’s coverage decision for S0108, too. Update it whenever a contract or Medicaid fee schedule changes. That habit keeps your billing compliance file current.
S0108 denials follow a pattern you can plan for
The same handful of errors cause most S0108 denials. Luckily, each one has a known fix. A steady denial management process turns them around quickly.
Three mistakes come up again and again on S0108 claims:
- Counting days instead of milligrams. A 30-day fill is 30 units only at 50 mg daily. At 100 mg daily, the same fill is 60 units.
- Reusing an old NDC. When the pharmacy switches manufacturers, the NDC changes with it. Copying last month’s claim carries the wrong one forward.
- Sending a Medicare patient’s claim to Part B. Part D covers the drug for Medicare patients. A Part B claim for S0108 can only come back denied.
Look-alike codes that get swapped for S0108
Several HCPCS codes sit close to S0108. They get mixed up most when a biller works from the drug name instead of a code lookup. Use the comparison below to confirm the code before you submit.
Mix-ups cluster in IBD billing, where one patient may take mercaptopurine, methotrexate and azathioprine over time. Check the dispensed drug and strength against the prescriber order every time. Other oral cancer drugs carry their own S-codes as well, such as S0172 for chlorambucil.
To confirm a descriptor, use AAPC’s HCPCS code reference or PGM Billing’s HCPCS lookup.
How claims management software keeps S0108 claims clean
Most billing teams check S0108 claims by hand, line by line, against a payer guide. That works until a busy week lets one missing field slip through.
Pabau’s claims management software takes some of that load. It pre-fills the claim from the patient record, so the codes attached to the visit land on the form. Built-in HCPCS and ICD-10 lookup libraries let you confirm a descriptor without leaving the claim.
Before a claim can go out, Pabau checks that required fields, such as member IDs, aren’t blank. US claims then reach Medicaid and commercial payers through Pabau’s Claim.MD integration. As a result, fewer claims bounce for a missing field. Your team keeps its time for the denials that need judgment.

Send cleaner S0108 drug claims the first time
Pabau pre-fills claims from the patient record, puts HCPCS and ICD-10 code lookup inside the claim, and checks required fields. It then submits to Medicaid and commercial payers, so fewer S0108 claims come back.
Conclusion
S0108 rewards the billing team that does its checking up front. The code itself is simple. Its claims, though, fail on small details. A stale NDC, units counted by days or a claim sent to Part B will each bounce it.
So make the unit math and the payer route part of intake, not cleanup. Once those two are right, the rest is paperwork your chart already holds.
Pabau handles the paperwork side. It pre-fills claims from the record and holds back any claim with an empty required field. Book a demo to see how it handles your S0108 drug claims.
Continue your research
Billing another oral cancer drug? HCPCS code S0172 covers chlorambucil, another oral S-code billed outside Medicare Part B.
Working with oral chemo J-codes? HCPCS code J8510 walks through oral busulfan billing in 2 mg units.
Submitting drug claims electronically? 837P electronic claim filing explains the 837P transaction structure and where NDC data sits in it.
Want to reduce denial rework? Denial codes in medical billing explains the CARC and RARC codes behind drug claim denials and how to fix each.
Need a billing compliance framework? Medical billing compliance covers HIPAA transaction standards, payer audit risk and documentation for drug claims.
Frequently asked questions
Is S0108 still an active HCPCS code in 2026?
Yes. S0108 is a valid 2026 HCPCS Level II code and has been in effect since April 1, 2002. As a temporary national S-code, it can change in any update. Check each quarterly HCPCS release before you rely on it.
Who uses S-codes like S0108?
Private insurers and Medicaid programs use them. S-codes let commercial payers report drugs, services and supplies that have no national code. Medicare doesn’t recognize them for payment.
Is S0108 billed on a medical claim or a pharmacy claim?
S0108 goes on a medical claim, the CMS-1500 or 837P, when the practice supplies the drug. When a retail or specialty pharmacy fills the prescription, it usually bills the pharmacy benefit by NDC instead.
Can you bill S0108 for free samples?
No. Don’t bill S0108 for manufacturer samples or patient-assistance drug, since the practice paid nothing for it. Record the sample in the chart instead, with the lot number and dose given.
What should you do if a payer rejects S0108 as an invalid code?
First, confirm whether the plan accepts S-codes at all, since some commercial plans don’t. If it doesn’t, ask which code it wants for oral mercaptopurine, such as J8999, and resubmit.