Pabau Engage inbox

Pabau Engage is here: every patient conversation in one inbox.

Learn more
Book a demo Book a demo
☰
HCPCS Code

HCPCS code S0108 – Mercaptopurine oral 50 mg


Code Definition

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
Save time. Improve accuracy. Get paid faster.
Automate coding with Pabau

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
Why practices choose Pabau
Save hours every week

Automate repetitive tasks and focus on what matters most—your patients.

Improve accuracy

Reduce coding errors and ensure compliance with the latest regulations.

Get paid faster

Clean claims, fewer denials, and faster reimbursements.

Grow with confidence

Powerful insights and reporting to help your practice thrive.

HIPAA compliant SOC 2 certified GDPR-compliant Trusted by 4,000+ clinics worldwide

Key takeaways

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

Field Detail
HCPCS code S0108
Full descriptor Mercaptopurine, oral, 50 mg
Brand name Purinethol (generic: mercaptopurine / 6-MP)
Drug class Oral antineoplastic / antimetabolite (thiopurine)
Route of administration Oral
Unit of service 1 unit = 50 mg
Code series HCPCS Level II S-code (Medicaid and commercial only)
Medicare Part B coverage Not covered (S-codes excluded from Medicare Part B)
NDC required Yes, on most Medicaid and commercial claims

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

ICD-10-CM code Description Coverage notes
C91.00 Acute lymphoblastic leukemia not having achieved remission FDA-approved indication; broadly covered
C91.01 Acute lymphoblastic leukemia in remission Maintenance therapy; broadly covered
K50.00-K50.919 Crohn’s disease (various sites and manifestations) Off-label; verify per payer medical policy
K51.00-K51.919 Ulcerative colitis (various types) Off-label; verify per payer medical policy

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.

Prescribed daily dose Units per day Units for a 30-day supply Notes
50 mg 1 30 Standard, no rounding needed
75 mg 1.5 45 Check the payer’s rounding rule (round up or nearest)
100 mg 2 60 Standard, two 50 mg tablets per day
25 mg 0.5 15 Pediatric dosing; confirm the payer accepts fractional units

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.

  1. 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).
  2. Calculate units. Divide the total milligrams dispensed by 50. Then apply the payer’s rounding rule to any odd dose.
  3. 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.
  4. 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.
  5. 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.
  6. 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.
  7. Add modifiers only if asked. Some payers want a modifier on S-code drug claims. Their billing guide will say which one.
  8. 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.

Five checks an HCPCS code S0108 claim must pass: diagnosis on payer policy (CO-50/N115), active prior authorization (CO-15/N30), units equal total mg divided by 50 (CO-4), 11-digit NDC in 5-4-2 format (CO-16/N362), routed to Medicaid or commercial, never Medicare Part B (CO-97/M15)
Each checkpoint lines up with the remark code a payer usually returns when it fails. Codes come from this guide’s denial table and vary by payer.

Modifiers a payer may ask for on S0108

Modifier Meaning When to use
KX Requirements specified in policy are met Required by some Medicaid MCOs to attest that coverage criteria are met
GY Item or service statutorily excluded Used only when an S-code goes to Medicare to get the denial a secondary payer needs
GX Notice of liability issued Used with GY in limited Medicare ABN scenarios; rarely required for 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.

Payer type Coverage status Rate source
Medicare Part B Not covered No published rate; use Medicare Part D for beneficiaries
State Medicaid (FFS) Covered in most states State Medicaid fee schedule portal; rates vary by state
Medicaid Managed Care Generally covered; PA often required MCO provider contract; check plan fee schedule
Commercial Insurer Generally covered Plan fee schedule or negotiated rate; PA may apply
TRICARE/VA Verify per plan TRICARE formulary; VA typically uses internal formulary

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.

Denial reason Common remark code Corrective action
Missing or invalid NDC CO-16 / N362 Add the correct 11-digit NDC in the appropriate claim field and resubmit
Submitted to Medicare Part B CO-97 / M15 S-codes are not payable by Medicare Part B; redirect to Part D pharmacy or correct payer
Missing prior authorization CO-15 / N30 Obtain PA retroactively if allowed, or submit appeal with clinical documentation
Incorrect unit calculation CO-4 Recalculate units (total mg dispensed divided by 50); verify payer rounding rule and resubmit
ICD-10 diagnosis not covered CO-50 / N115 Verify the payer’s medical policy for the billed diagnosis; submit appeal with clinical rationale if off-label
Modifier error CO-4 / CO-11 Review payer modifier requirements; correct and resubmit or appeal
Expired prior authorization CO-15 Renew PA before the dispensing date; track PA expiration proactively

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.

Code Descriptor Key difference
S0108 Mercaptopurine, oral, 50 mg Use for oral mercaptopurine in 50 mg units; Medicaid and commercial payers only
J8999 Prescription drug, oral, chemotherapeutic, not otherwise specified (NOS) Unlisted oral drug code; use only when no specific code exists (e.g. compounded mercaptopurine) or when payer requires it
J8610 Methotrexate, oral, 2.5 mg Different drug entirely; another oral antimetabolite used in oncology and IBD, so never substitute it
J7500 Azathioprine, oral, 50 mg Related to mercaptopurine, but a distinct drug with its own code. Confirm the dispensed drug before coding.

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.

Pabau checkout screen with a completed invoice billed to the patient's insurer
Pabau’s checkout ties each invoice to the patient’s insurer, so the payer on the claim matches the plan you checked.

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.

Pabau claims management dashboard

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

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.

×