Pregnancy Exposure Registry
A prospective cohort design that enrolls pregnant patients exposed to a defined medication (or vaccine) before the pregnancy outcome is known and actively follows them to ascertain major congenital malformations and other pregnancy outcomes, comparing risk against an internal or external unexposed reference.
In plain language
A pregnancy exposure registry is a structured study that signs up pregnant people who are already taking a specific drug and follows them forward in time until they give birth, so researchers can count how often serious birth defects occur in their babies. The key rule is that a patient must be enrolled before anyone knows whether the pregnancy will end normally or not, which prevents the study from accidentally over-counting bad outcomes. The registry answers the question: does taking this drug during the first three months of pregnancy raise the chance of a major birth defect compared with unexposed pregnancies? One honest limitation is that patients who later lose the pregnancy or deliver elsewhere often drop out, which can make the drug look safer than it really is.
A pregnancy exposure registry is a prospective, observational cohort assembled specifically to detect teratogenic and other adverse pregnancy effects of an exposure (drug, biologic, or vaccine) taken during pregnancy. Its defining feature is enrollment before the pregnancy outcome is known ("prospective" in the FDA/registry sense): a pregnant patient with a documented exposure is registered while still pregnant, exposure and gestational timing are recorded at intake, and the outcome — most importantly major congenital malformation (MCM) — is ascertained later through active, protocol-driven follow-up. Classic operating examples are the Antiretroviral Pregnancy Registry, the (now-closed) International Lamotrigine Pregnancy Registry, the North American AED Pregnancy Registry, and MotherToBaby/OTIS cohorts.
Core conceptual distinction
. A pregnancy registry is a cohort study with a deliberately engineered time zero and outcome-blind enrollment, not a passive collection of reports. Three features separate it from look-alikes. (1) Prospective vs retrospective ascertainment: prospectively enrolled cases (registered before any prenatal diagnosis of a defect and before the outcome) are the analytic backbone; retrospectively reported cases (registered after an abnormal outcome is already known) are reported separately and excluded from the primary risk estimate because they are subject to recall- and reporting-driven over-representation of defects. (2) Registry vs spontaneous adverse-event reporting (FAERS/EudraVigilance): a registry has a defined denominator (enrolled exposed pregnancies and their expected outcomes) and so can estimate a risk, whereas spontaneous reports have no denominator and can only generate signals. (3) Internal vs external comparator: the estimand is the proportion (or prevalence) of MCM among first-trimester-exposed live births versus an unexposed reference — either an internally enrolled disease-matched unexposed group or an external population (MACDP, EUROCAT, or a claims-based unexposed pregnancy cohort). The contrast is a malformation prevalence ratio/difference, not a hazard; there is no clean active-comparator analogue because the comparator is almost always a disease-matched unexposed pregnancy.
Pros, cons, and trade-offs
. - vs retrospective claims/EHR-based pregnancy cohorts: A registry collects gestational timing (LMP, trimester of exposure), indication, dose, and adjudicated malformation detail that claims rarely capture, and it enrolls before the outcome is known, which blunts recall and ascertainment bias. Cost: it is slow, expensive, volunteer-driven, and chronically underpowered; a claims-based pregnancy cohort (mother-infant linked, with a far larger denominator) is usually faster, cheaper, and better powered for common outcomes once a validated outcome algorithm exists. Prefer a registry when the exposure is new, rare, or pregnancy-specific and no validated claims algorithm or linkage exists; prefer a claims cohort when a large linked database and validated outcome definitions are available. - vs MotherToBaby/OTIS prospective comparative cohorts: Single-product manufacturer registries enroll faster for one drug but typically rely on external malformation prevalence as the comparator; OTIS-style cohorts enroll an internal disease-matched and a healthy comparator concurrently, giving a stronger internal contrast at the cost of slower, multi-site recruitment. - vs spontaneous reporting / passive surveillance: A registry yields an estimable risk and an organogenesis-window exposure classification; spontaneous reports are faster and broader but denominator-free and cannot support a rate. Prefer a registry when you need a quantified malformation risk for labeling; passive surveillance only for early signal generation.
When to use
. A drug or vaccine likely to be used in pregnancy (or in people who can become pregnant) where pregnancy was excluded from the pivotal trials and a teratogenic signal must be characterized; a post-marketing requirement or commitment (FDA, EMA RMP/PASS) for pregnancy safety; an exposure too new or too pregnancy-specific for an existing validated claims algorithm; settings needing reliable first-trimester (organogenesis) exposure timing and adjudicated MCM classification that secondary data cannot supply.
When NOT to use — and when it is actively misleading or dangerous
. - You need a precise estimate of a common outcome quickly. Registries accrue slowly and are usually underpowered: detecting a doubling of the ~3% baseline MCM prevalence at 80% power requires on the order of 200+ first-trimester exposures per the registry literature; rarer outcomes need far more. A null from an underpowered registry must never be read as "no risk." - Differential loss to follow-up is uncontrolled. This is the registry's signature failure: patients whose pregnancy ends badly (spontaneous abortion, fetal death, a prenatally diagnosed defect) drop out or are never re-contacted at a higher rate than those with normal outcomes, so passively the registry under-counts defects (informative censoring); conversely, retrospective enrollment over-counts them. A registry without high, outcome-independent retention is actively misleading. - Volunteer/self-referral selection dominates. Voluntary registries enroll the worried-well or, for some products, the higher-risk; if the comparator population does not share that selection, the prevalence ratio is biased in an unknown direction. Spontaneous abortions and elective terminations occurring before enrollment are systematically missed (left truncation), so live-birth-only denominators distort outcomes tied to early loss. - The comparator is incomparable. Using an external general-population malformation prevalence (MACDP/EUROCAT) for a cohort defined by a serious maternal disease confounds the disease with the drug; the underlying condition (e.g., epilepsy, HIV, autoimmune disease) and concomitant medications can themselves raise MCM risk.
Data-source operational depth
. - Primary registry collection (the design itself): Intake captures exposure dates, last menstrual period (LMP) or estimated gestational age, indication, dose, and concomitant drugs while the patient is still pregnant. Failure modes: LMP/gestational-age error misclassifies trimester and corrupts the organogenesis window; loss to follow-up between enrollment and the outcome visit is the dominant threat (target >85-90% ascertainment, and report lost-to-follow-up rates by arm); retrospective reports must be analyzed separately. Workarounds: scheduled prenatal + post-delivery contacts, incentive-neutral retention, blinded outcome adjudication, and a pre-specified plan to compare prospective vs retrospective cases. - Claims (FFS / MA / commercial) as the alternative or linkage source: A claims-based pregnancy cohort needs mother-infant linkage, an algorithm to estimate LMP/gestational age from delivery codes and prenatal claims, and continuous medical+pharmacy enrollment across the pre-pregnancy washout and full pregnancy so exposure (NDC + `fill_date` + `days_supply`) and outcomes are observable. Failure modes: Medicare Advantage and capitated person-time drop fee-for-service claims, so "unexposed" may be unobserved exposure — restrict to enrollees with full medical + pharmacy benefit and exclude MA-only person-time; spontaneous abortions and terminations are incompletely coded, differentially by setting; a fill is not ingestion. Workaround: link claims to a registry for adjudicated MCM and validated gestational timing, or validate the outcome algorithm against charts (PPV/sensitivity). - EHR: Adds prenatal ultrasound, problem lists, and birth records to sharpen LMP and indication, but visit-driven capture means a patient who delivers outside the system is differentially lost — a registry-style informative-censoring problem in another guise; mother-infant linkage in EHR is often incomplete. - Linked registry + claims + birth-defects surveillance (EUROCAT/MACDP): The strongest substrate — registry timing and adjudication, claims denominator and completeness, surveillance-grade MCM classification — but linkage selects only the linkable subset and introduces date-discrepancy reconciliation (LMP vs fill vs service dates) that must precede trimester assignment.
Worked example
Question: first-trimester malformation risk for a newly approved oral disease-modifying drug taken by people of reproductive potential, under an FDA post-marketing requirement. Design: prospective pregnancy registry. (1) Enrollment: a pregnant patient with a documented first-trimester fill (`fill_date` within [LMP, LMP + 90 days] using the `pregnancy-exposure-window-rwe` definition) is registered before any prenatal anomaly scan result and before the outcome — this is the prospective requirement. Record LMP, estimated gestational age, indication, dose, and concomitant medications at intake. (2) Comparator: an internal disease-matched unexposed cohort enrolled concurrently, plus an external EUROCAT/MACDP MCM prevalence as a secondary reference (~3% baseline). (3) Follow-up: scheduled contacts at enrollment, ~each trimester, and post-delivery; target >90% outcome ascertainment; log lost-to-follow-up by arm. (4) Outcome: major congenital malformation among live births, adjudicated blinded to exposure using EUROCAT coding; report spontaneous abortion, stillbirth, preterm birth, and SGA secondarily; analyze prospectively- and retrospectively-enrolled cases separately. (5) Estimate: MCM prevalence ratio (exposed vs internal unexposed) with exact binomial CIs given small counts; pre-specify that detecting a doubling of the 3% background at 80% power needs ~200 first-trimester exposed live births, and report power achieved. (6) Sensitivity: vary the exposure window (organogenesis-only vs any-first-trimester), exclude retrospectively reported cases, and bound the effect of differential loss to follow-up via a tipping-point/quantitative bias analysis.
Worked example
Scenario
A drug maker is required to run a pregnancy registry for a new oral pill used by people who can become pregnant. A researcher wants to understand what the registry data table looks like, what biases to watch for, and what question the registry can and cannot answer.
Dataset
Core registry intake and outcome table (one row per enrolled pregnancy). Columns show the patient, when she enrolled, her last menstrual period date used to assign trimester, whether outcome was known at enrollment, her arm in the study, what happened at delivery, whether a major congenital malformation was confirmed, and whether the outcome was ever ascertained.
| person_id | enroll_date | lmp_date | outcome_known_at_enroll | arm | pregnancy_end | mcm_confirmed | outcome_ascertained |
|---|---|---|---|---|---|---|---|
| P001 | 2023-02-10 | 2023-01-15 | No | EXPOSED | LIVE_BIRTH | No | Yes |
| P002 | 2023-03-05 | 2023-02-01 | No | EXPOSED | LIVE_BIRTH | Yes | Yes |
| P003 | 2023-04-12 | 2023-03-20 | No | EXPOSED | UNKNOWN | Unknown | No |
| P004 | 2023-02-28 | 2023-02-01 | No | UNEXPOSED | LIVE_BIRTH | No | Yes |
| P005 | 2023-05-01 | 2023-04-10 | Yes | EXPOSED | LIVE_BIRTH | Yes | Yes |
Steps
P001 and P002 are the clean exposed cases: both enrolled before any birth outcome was known, and both delivered live babies with a confirmed outcome. P002 had a birth defect confirmed.
P003 enrolled correctly (outcome unknown at enrollment) but was never reached after delivery, so her outcome is unknown. She is lost to follow-up. If babies with defects are more likely to be lost this way, the registry will under-count defects.
P004 is the internal unexposed comparator: a pregnant patient with the same underlying disease but no drug exposure, enrolled at the same stage and followed identically.
P005 enrolled after a defect was already found on a prenatal scan (outcome_known_at_enroll = Yes). She must be analyzed separately and excluded from the primary risk estimate, because her enrollment was triggered by a bad outcome, which would inflate the defect count.
The primary analysis uses only P001, P002, and P004 (prospectively enrolled, outcome ascertained). Among the two exposed live births, 1 of 2 had a defect (50%). Among the one unexposed live birth, 0 of 1 had a defect (0%). The malformation prevalence ratio cannot be computed stably with counts this small, which illustrates why registries require roughly 200 or more exposed live births before a result is interpretable.
Result
The registry answers: among babies born to mothers who took this drug during the first trimester, what fraction had a serious birth defect, compared with unexposed pregnancies? With only 2 exposed live births (P001, P002) and 1 unexposed (P004), the ratio is mathematically unstable (1/2 vs 0/1). The key limitation shown here is loss to follow-up (P003): if the missing patient also had a defect, the true exposed rate is 2/3 (67%) rather than 1/2 (50%), shifting the estimate substantially. A real registry would target at least 85 to 90 percent ascertainment and report the loss-to-follow-up rate by arm.
Runnable example
python implementation
Pregnancy-registry cohort construction and first-trimester exposure classification from registry intake + outcome data. Required inputs (already cleaned, one row per enrolled pregnancy unless noted): intake : person_id, lmp_date (datetime), enroll_date...
import pandas as pd
import numpy as np
FIRST_TRIMESTER_DAYS = 90 # exposure window from LMP defining first-trimester / organogenesis exposure
def build_pregnancy_registry_cohort(intake: pd.DataFrame,
fills: pd.DataFrame,
outcomes: pd.DataFrame) -> pd.DataFrame:
# PROSPECTIVE restriction: outcome must NOT have been known at enrollment.
# Retrospectively reported pregnancies are held out of the primary risk estimate.
prosp = intake[~intake["outcome_known_at_enroll"]].copy()
# First-trimester exposure: any study-drug fill within [LMP, LMP + 90d] for EXPOSED pregnancies.
f = fills.merge(prosp[["person_id", "lmp_date", "arm"]], on="person_id", how="inner")
f["days_from_lmp"] = (f["fill_date"] - f["lmp_date"]).dt.days
first_tri = f[(f["days_from_lmp"] >= 0) & (f["days_from_lmp"] <= FIRST_TRIMESTER_DAYS)]
first_tri_ids = set(first_tri["person_id"].unique())
prosp["first_trimester_exposed"] = prosp["person_id"].isin(first_tri_ids)
# EXPOSED arm must actually have a first-trimester fill; UNEXPOSED must have none.
prosp = prosp[~((prosp["arm"] == "EXPOSED") & (~prosp["first_trimester_exposed"])) &
~((prosp["arm"] == "UNEXPOSED") & (prosp["first_trimester_exposed"]))]
cohort = prosp.merge(
outcomes[["person_id", "outcome_ascertained", "mcm", "pregnancy_end"]],
on="person_id", how="left")
# Informative loss to follow-up is the headline threat: keep unascertained rows visible, do not drop silently.
cohort["lost_to_follow_up"] = ~cohort["outcome_ascertained"].fillna(False)
return cohort[["person_id", "arm", "lmp_date", "enroll_date",
"first_trimester_exposed", "outcome_ascertained",
"lost_to_follow_up", "pregnancy_end", "mcm"]]
def mcm_prevalence_ratio(cohort: pd.DataFrame) -> dict:
# MCM prevalence among live births with ascertained outcome, exposed vs unexposed (the registry estimand).
lb = cohort[(cohort["pregnancy_end"] == "LIVE_BIRTH") & cohort["outcome_ascertained"]]
g = lb.groupby("arm")["mcm"].agg(["sum", "count"])
p_exp = g.loc["EXPOSED", "sum"] / g.loc["EXPOSED", "count"]
p_unexp = g.loc["UNEXPOSED", "sum"] / g.loc["UNEXPOSED", "count"]
return {"p_exposed": p_exp, "p_unexposed": p_unexp,
"prevalence_ratio": p_exp / p_unexp,
"n_exposed_lb": int(g.loc["EXPOSED", "count"]),
"ltfu_rate_by_arm": cohort.groupby("arm")["lost_to_follow_up"].mean().to_dict()}r implementation
Pregnancy-registry cohort construction with data.table. Inputs mirror the Python version: intake : person_id, lmp_date (Date), enroll_date (Date), outcome_known_at_enroll (logical), arm ('EXPOSED'/'UNEXPOSED') fills : person_id, fill_date (Date),...
library(data.table)
FIRST_TRIMESTER_DAYS <- 90L # exposure window from LMP (organogenesis)
build_pregnancy_registry_cohort <- function(intake, fills, outcomes) {
setDT(intake); setDT(fills); setDT(outcomes)
# PROSPECTIVE restriction: drop pregnancies whose outcome was already known at enrollment.
prosp <- intake[outcome_known_at_enroll == FALSE]
f <- merge(fills, prosp[, .(person_id, lmp_date, arm)], by = "person_id")
f[, days_from_lmp := as.integer(fill_date - lmp_date)]
first_tri_ids <- unique(f[days_from_lmp >= 0 & days_from_lmp <= FIRST_TRIMESTER_DAYS, person_id])
prosp[, first_trimester_exposed := person_id %chin% first_tri_ids]
prosp <- prosp[!(arm == "EXPOSED" & first_trimester_exposed == FALSE) &
!(arm == "UNEXPOSED" & first_trimester_exposed == TRUE)]
cohort <- merge(prosp,
outcomes[, .(person_id, outcome_ascertained, mcm, pregnancy_end)],
by = "person_id", all.x = TRUE)
cohort[, lost_to_follow_up := is.na(outcome_ascertained) | outcome_ascertained == FALSE]
cohort[, .(person_id, arm, lmp_date, enroll_date, first_trimester_exposed,
outcome_ascertained, lost_to_follow_up, pregnancy_end, mcm)]
}
mcm_prevalence_ratio <- function(cohort) {
lb <- cohort[pregnancy_end == "LIVE_BIRTH" & outcome_ascertained == TRUE]
g <- lb[, .(events = sum(mcm), n = .N), by = arm]
e <- g[arm == "EXPOSED"]; u <- g[arm == "UNEXPOSED"]
ci_e <- binom.test(e$events, e$n)$conf.int # exact binomial given small counts
list(p_exposed = e$events / e$n, p_unexposed = u$events / u$n,
prevalence_ratio = (e$events / e$n) / (u$events / u$n),
p_exposed_ci = as.numeric(ci_e), n_exposed_lb = e$n,
ltfu_rate_by_arm = cohort[, mean(lost_to_follow_up), by = arm])
}