Dezen Technology
All articles
Pharma & ComplianceMar 24, 20268 min read

ICH Q1A(R2) for software people

The pharmaceutical stability standard, framed for the engineers who have to encode it. Schema rules, derived flags and Q1D bracketing — explained.

ICH Q1A(R2) for software people

If you’re a software engineer building pharma software and someone hands you an ICH Q1A(R2) document, your eyes glaze over by page two. The document was written for regulatory affairs people, not for the engineers who have to encode its rules into a database schema.

Here’s the short version, framed the way software people actually need to know it. Just enough to make the right design decisions; not enough to pass a CMC audit by yourself.

What ICH Q1A(R2) actually is

ICH Q1A(R2) is the global standard for how pharmaceutical companies prove their products are stable enough to sell. It defines:

  • Conditions: temperature + humidity ranges every product gets tested at
  • Schedule: when samples are pulled and tested over time
  • Acceptance criteria: what counts as “passing” vs “failing”
  • Documentation: what records the FDA / EMA / PMDA / CDSCO will ask for

Adopted by the FDA in 2003, valid globally with minor regional variations. Treat it like an RFC — specific, mostly stable, with regional appendices.

The mental model for software people

ICH Q1A bullseye — long-term at the center, then accelerated, then intermediate, then stress, with minimum time points

Picture each drug product as a record with a foreign key to one stability study. The study has many study conditions (long-term, accelerated, intermediate), each with many time points (pulls), each with many results. Each result either passes or fails its acceptance criteria, with audit-trail metadata.

That’s the schema. Most of Q1A is configuration on top of that schema.

The four conditions worth memorizing

  1. Long-term: 25°C ± 2°C / 60% RH ± 5%. The real shelf-life claim. Pulls at 0, 3, 6, 9, 12, 18, 24, 36 months.
  2. Accelerated: 40°C ± 2°C / 75% RH ± 5%. Pulls at 0, 3, 6 months. Speeds up degradation to predict shelf-life early.
  3. Intermediate:30°C ± 2°C / 65% RH ± 5%. Optional — only triggered if accelerated shows significant change but long-term doesn’t.
  4. Photostability (Q1B): A separate study for light-sensitive products. Run before primary stability begins.

The schema rules that come from Q1A

Because the spec is rigid, you can hard-code surprisingly much. Decisions to bake into the database:

  • Conditions are an enum, not free text. Long-term, Accelerated, Intermediate, Photostability. Plus zone-specific variants for tropical regions (Q1F covers this).
  • Pull-points are deterministic from the protocol.Given protocol + start date, generate the full pull schedule programmatically. Don’t let users enter pull dates by hand.
  • Acceptance criteria belong to the product, not the test. Same test (e.g., dissolution) has different limits per product. Model accordingly.
  • “Significant change” is a derived flag. Define the conditions once (5% potency loss, etc.) and compute the flag from the result data, not from a user toggle.
  • OOS / OOT investigations have their own table.When a result fails, you don’t just mark the row red — you spawn an investigation record with its own lifecycle (open, in progress, justified, closed).

Bracketing & matrixing (Q1D)

Q1A is the rulebook; Q1D is the optimization. If you have multiple strengths, pack sizes or batches, Q1D lets you test a statistically valid subset instead of every combination at every time point. Your software needs to support:

  • Designating “bracketed” strengths/sizes (test extremes, infer middle)
  • Designating “matrixed” time points (test different time points for different batches)
  • Auditable rationale for the bracketing/matrixing decision

Without this, a customer with 12 SKUs runs 12× the analyst load they need to. The scheduling logic is non-trivial but the ROI to the customer is enormous.

Statistical shelf-life calculation

The shelf-life is not “the last passing time point.” ICH Q1E specifies regression analysis: fit a regression line to the stability data, calculate the 95% confidence interval, and shelf-life is the time at which the lower confidence bound intersects the specification limit.

Implement this with a real stats library, not a hand-rolled linear regression. Show the user the confidence intervals; the regulator will want them.

Pitfalls that cost engineering teams months

  • Modeling temperatures as floats. They’re ranges (± tolerance) — model accordingly.
  • Ignoring time-zone semantics on pull dates. Pulls happen on a lab’s local clock. Store both the local time and the UTC timestamp.
  • Hard-coding the audit trail behavior per table. Make it a database trigger or framework concern. Manual is forgotten manually.
  • Letting protocols be edited after start. A protocol is immutable once a sample is pulled against it. Edit = new version + amendment record.

How we approach this

Our Stability Management product encodes Q1A as schema. Conditions are enums. Schedules generate from the protocol. Significant-change flags are derived. OOS spawns its own workflow. The software does the regulatory thinking so analysts can focus on the chemistry.

Takeaways

  • Q1A is a finite spec. Read it once; model it carefully.
  • Four conditions, deterministic schedules, derived flags — most of it can be schema.
  • Bracketing/matrixing (Q1D) is the customer-facing ROI superpower.
  • Shelf-life is a statistical claim, not a “last passing time point” lookup.
  • Protocols are immutable once samples are pulled. Versions, not edits.
Keep reading

More from the engine room

AI in QA: where it helps, where it doesn’t

May 27, 2026

AI in QA: where it helps, where it doesn’t

AI augments QA throughput — test generation, triage, visual regression. It doesn’t replace QA judgment: strategy, exploratory testing, and defining correctness stay human.

Read More
Controlling LLM costs in production

May 25, 2026

Controlling LLM costs in production

Four levers cut spend 10x without cutting quality: route by difficulty, cache, trim context, batch and stream. Measure cost-per-feature first; set budget guardrails always.

Read More
RAG vs fine-tuning: which do you actually need?

May 23, 2026

RAG vs fine-tuning: which do you actually need?

Facts → RAG. Behavior → maybe fine-tune. Most business AI features want RAG even when teams ask for fine-tuning. The decision rule and the order to try things in.

Read More
Agentic features in SaaS: the maturity ladder

May 21, 2026

Agentic features in SaaS: the maturity ladder

From manual to autonomous — four levels of autonomy and the guardrails each needs. Match autonomy to the cost of being wrong, not to how impressive it sounds.

Read More
Offline-first mobile: the app that works on the subway

May 19, 2026

Offline-first mobile: the app that works on the subway

The UI never waits on the network. Local DB, sync engine, server — with conflict resolution per data type. The architecture that makes mobile apps feel instant.

Read More
Lift-and-shift vs refactor: how to actually decide

May 17, 2026

Lift-and-shift vs refactor: how to actually decide

Lift-and-shift is fast, cheap to do, expensive to keep. Refactor is months of work with structural upside. The matrix — and why half-finished refactors are the worst path.

Read More
Monolith migration: the strangler-fig playbook

May 15, 2026

Monolith migration: the strangler-fig playbook

The big-bang rewrite is the most consistently bad idea in software. Proxy in front, extract one route at a time, shrink the monolith to nothing. No migration day.

Read More
SOC 2 readiness in plain English

May 13, 2026

SOC 2 readiness in plain English

Five Trust Service Criteria, Security mandatory and the rest optional. Type 1 vs Type 2. The pragmatic 6-month timeline — not the year-long ordeal it’s made out to be.

Read More

Let’s Build the Future Together!

Contact our team today and turn your ideas into reality.

Let’s Discuss
Contact Details : sales@dezentech.com Sy. No:40, Flat No:402, SIRISAMPADHA ARCADE I, Plot no:18-21, behind Union Bank of India, Khajaguda, Hyderabad, Telangana 500104