Expedia · Data Scientist
Updated · 2026-09-22

Expedia Data Scientist
Interview Questions & Guide 2026

THE 60-SECOND BRIEF

The role of a Data Scientist at Expedia Group is pivotal in shaping the future of travel through data-driven insights and strategies. As a Data Scientist, you will be tasked with analyzing vast amounts of travel-related data to uncover trends, optimize user experiences, and enhance operational efficiency. Your work will directly influence product development, marketing strategies, and customer engagement, making it an essential component of Expedia Group's mission to transform the way people experience travel.

In modelling rounds the live question is usually why this model class for this problem, and how you would know six weeks after launch that it is still working. Deriving gradients by hand is rarely what is being probed.

Expedia candidates report 3 rounds · ≈ 3-5 weeks. The stages below are what candidates describe, not a published process.

Model demand against availability, not observed bookingsCompute occupancy from sellable nights, never property averagesSeparate cancelled, no-show and completed booking states

33 min read

Practice 4+ Expedia questions

See the practice prompts

4Company bank questions ↗Snapshot · Nov 5, 2026 PT1Candidate experiences ↗Read their reports
17Practice promptsAcross five skill areas
3With worked solutionsIncluded in the practice prompts

The role of a Data Scientist at Expedia Group is pivotal in shaping the future of travel through data-driven insights and strategies. As a Data Scientist, you will be tasked with analyzing vast amounts of travel-related data to uncover trends, optimize user experiences, and enhance operational efficiency. Your work will directly influence product development, marketing strategies, and customer engagement, making it an essential component of Expedia Group's mission to transform the way people experience travel.

In this role, you will collaborate with cross-functional teams, including engineering, product management, and business analysts, to address complex problems and deliver actionable recommendations. The data science team at Expedia Group is involved in exciting projects, such as developing predictive models for customer behavior, optimizing pricing strategies, and enhancing personalization features across various platforms. This position offers the opportunity to work on high-impact projects that not only improve user satisfaction but also drive significant business growth.

Expect to engage with intricate datasets and employ advanced analytical techniques, including machine learning, statistical analysis, and data visualization. This role is both challenging and rewarding, providing a unique opportunity to make a tangible impact in a fast-paced and innovative environment.

01

Recruiter Screening

reported

A screening call is a matching exercise run by someone who will not evaluate your statistics. They are checking that the work described on your resume is work you personally did, and that its scope matches the level the role is written for. Logistics get settled in the same half hour so nobody spends an interviewer's afternoon on a mismatch. The answer that fails is the one narrated in the plural. If every sentence is 'we built' and 'the team decided', there is nothing specific to write down about you. Name the piece that was yours, the decision you made inside it, and what changed after.

What to demonstrate

  • Whether the ownership implied by your resume survives one round of follow-up about who actually did which part
  • Whether your described scope (data size, stakeholders, what shipped) matches the seniority the role is written at
  • Whether timeline, location and compensation expectations make the rest of the loop worth scheduling

How to prepare

  • Rewrite your top three resume bullets in the first person singular, each with the decision you made and what moved afterwards, then say them out loud once so the 'we' does not return under pressure
  • Attach one number to each project: the baseline, the change, and the window it was measured over. Where impact was never measured, say that plainly rather than inventing a figure
  • Settle your compensation range before the call and give it as a range with a reason behind it, such as current total comp or a competing timeline, instead of deflecting the question twice
PracHub interview research ↗
02

Technical Assessments

reported

A handful of shapes account for most of what gets asked in this format: a ranking or deduplication inside groups, a running or rolling total, a period-over-period comparison, and a cohort tracked forward over time. Recognising the shape quickly is most of the speed here; deriving it from scratch while a clock runs is where the time goes. Know that a window function keeps every row while a GROUP BY collapses them, and know which one the question needs. If the exercise is in Python instead of SQL, the same shapes arrive as groupby with transform, shift and merge, and the same grain mistakes are available.

What to demonstrate

  • Whether you reach the right construct without a detour, such as ROW_NUMBER over a partition to deduplicate instead of a self-join against a MAX subquery
  • Whether you know what your window frame actually is, since adding ORDER BY inside OVER changes the default frame and silently changes a running total
  • Whether the thing runs. A near-miss that throws an error scores below a plainer query that returns the right rows.

How to prepare

  • Write each of the four shapes once from memory against a small schema and keep the working version somewhere you will reread it: dedupe with ROW_NUMBER, a running total, a month-over-month change with LAG, and a retention table
  • Compute one running total twice on data with tied timestamps, once on the default frame and once with ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW, and look at where the two disagree
  • If Python is on the table, rebuild the dedupe and the running total with groupby and cumsum, then assert the two implementations return identical rows
PracHub interview research ↗
03

Panel Interviews

reported

A loop is not scored one interview at a time. The people you meet compare notes afterwards, usually in a meeting you are not in, and the outcome turns on what each of them can say about you when asked. That rewards something other than survival: every room needs one specific thing worth repeating, and none of them can contradict another. The common way to lose is to tell the same project four times with different numbers in it, or to be uniformly fine in a way that leaves nobody with anything to argue for.

What to demonstrate

  • Whether your account of a project survives being told twice, with the same scale, the same metric definition and the same numbers each time
  • Whether each interviewer leaves with one concrete claim they could make on your behalf later, rather than an absence of complaints
  • Whether a question you already answered in an earlier room gets the same answer at the same depth, without visible impatience

How to prepare

  • Write a one-page fact sheet for your two or three main projects that fixes the numbers you will quote: rows of data, the metric as a single sentence, the effect you measured and how long the work took. Say them aloud from the sheet until they come out identical every time
  • For each kind of room you expect, decide the one sentence you want that interviewer repeating in a debrief, then check during the mock that you said it outright instead of implying it
  • Rehearse answering the same project question twice in one sitting, the second time as though you had not just answered it, because the thing that needs fixing is the flatness that creeps into a repeated story
PracHub interview research ↗

1 candidate reports. Individual accounts describe a particular role and hiring cycle.

Data Scientist III

Expedia Data Scientist III Interview Experience — Five-Round Onsite Panel, Then a Lowball Offer Fell Through

HR Screen → Technical Screen → Take-home Project → OnsiteOutcome: withdrew

Switching jobs this year wasn't easy either — all told I went through something like 7 rounds of interviews, and in the end the money didn't work out and the offer fell through, which was a shame. This has some things in common with a post I made before. I noticed there aren't really any Expedia interview experience posts here related to Data Science, so a while back I interviewed for an Expedia…

Read full experience

PracHub editorial advice for the preparation topics above.

01

Reporting on the booking date when the question is about the stay date, or the reverse

The same booking contributes to demand in one period and to revenue, occupancy and supplier payout in another, so almost every headline number has two defensible values that can differ by tens of percent. A promotion that moves bookings this week for stays in March produces a revenue 'drop' on the stay axis and a spike on the booking axis, and both are real. Cancellations make it worse, because a cancellation dated today removes revenue from a stay date months out and will silently restate a period that was already reported closed. The only defence is to name the date axis in the title of every chart and every metric definition, and to keep a pace view (bookings-on-hand for a future stay date, by days out) as a separate artefact rather than trying to serve both from one table.

02

Using the search as the demand unit when the trip is the demand unit

One trip intent generates dozens of searches over days, across devices, mostly while logged out, and the number of searches per intent is a property of the interface rather than of demand. Any product change that encourages comparison or re-sorting inflates the denominator, so look-to-book falls while the product improves, and a change that reduces re-searching raises the metric while nothing about demand moved. The logged-out majority also means traveller_id is NULL for most early-funnel rows, so joining searches to bookings on traveller_id silently drops the part of the funnel you were trying to measure. Collapse on trip_intent_key first, then count, and report searches per intent separately as a diagnostic rather than letting it sit inside a conversion rate.

03

Dropping rows with missing values without naming the mechanism

Say whether the values are missing at random, missing by a known process, or missing in a way that depends on the outcome, and handle them accordingly. Deleting incomplete rows silently redefines the population whenever missingness correlates with what you are measuring.

04

Reaching for a model before the target metric exists

Before naming an algorithm, write down the label, the prediction time, and the action that changes when the score crosses a threshold. If you cannot say what decision the output drives, any modelling choice is guesswork dressed up as method.

Choose a category, try a prompt, then open its approach, worked solution or follow-up when you need it.

14 technical prompts3 include a worked solution

Given a dataset of flight prices, how would you model price prediction…

medium
machine learning and modelling

Given a dataset of flight prices, how would you model price prediction for better customer recommendations?

Approach
  1. Set a baseline first, so any model has something honest to beat.
  2. Frame the prediction: the label, the moment of prediction, and the action it triggers.
  3. Pick an evaluation metric that matches the cost of each error type, not a default.
Follow-up
  • What would you monitor after launch to know the model is still valid?
  • How would you choose the decision threshold, and who owns that choice?

Sessionise search events into trip intents with stable keys

mediumWorked solution
sessionisationevent streamshashingpandas

searches has visitor_id, traveller_id (null while logged out), searched_at_utc, destination_market_id, check_in_date, length_of_stay_nights, party_adults, is_bot_flagged; roughly 5 million rows in arbitrary order. Produce a trip_intent_key grouping searches that represent one trip: same identity, destination_market_id, length_of_stay_nights, party_adults, and check_in_date rounded into a 3-day bucket. Additionally split a group wherever consecutive searches are more than 30 days apart. Return the frame plus trip_intent_key, intent_ordinal, and the searches-per-intent distribution. The key must be reproducible across processes and joinable to a bookings table.

Approach
  1. Drop is_bot_flagged rows before anything else; they are not demand and they distort both the numerator and the searches-per-intent diagnostic.
  2. Build the identity column as traveller_id where present else visitor_id, and say the caveat out loud: most early-funnel searching is logged out, so joining on traveller_id alone discards the majority of the funnel, while the coalesce splits one human's intent in two at the moment they log in.
  3. Bucket the check-in date arithmetically, not by resampling: (check_in_date - pd.Timestamp('1970-01-01')).dt.days // 3. Then sort by [identity, market, bucket, length_of_stay, party_adults, searched_at_utc] and compute the gap with groupby(...)['searched_at_utc'].diff(), flagging gaps over 30 days and taking a cumsum of the flag as a within-group segment number.
  4. Hash the canonical tuple with hashlib (blake2b with a fixed digest_size, hexdigest truncated), not Python's built-in hash(): the built-in is salted by PYTHONHASHSEED per process, so keys differ between runs and the join to the bookings table returns nothing while looking syntactically correct.
  5. Derive intent_ordinal with a groupby cumcount on the sorted frame, and return searches-per-intent as a separate distribution rather than folding it into any conversion rate, since searches per intent is a property of the interface, not of demand.
Worked solution 35 min
  1. Filter out is_bot_flagged; record the dropped row count as a reported number.
  2. identity = traveller_id.fillna(visitor_id) after casting to a common string dtype; bucket = day-index // 3.
  3. Sort on the full group key plus searched_at_utc; gap_flag = groupby(group_key)['searched_at_utc'].diff() > 30 days; segment = gap_flag.groupby(group_key).cumsum().
  4. Build the canonical string by joining the group key parts and the segment with a separator that cannot occur in any part, and map it through blake2b(digest_size=8).hexdigest() over the unique strings only, then merge back.
  5. intent_ordinal = groupby('trip_intent_key').cumcount() + 1; compute the searches-per-intent distribution with value_counts on the intent sizes.
EXPECTED RESULTEvery retained search maps to exactly one trip_intent_key. No intent spans more than 30 days between consecutive searches. Running the function twice in two separate Python processes produces byte-identical keys. The searches-per-intent distribution is heavily right-skewed: a median of about 3 with a p99 in the tens.
Follow-up
  • Two people on one household device search the same city for different dates. What does your key do, and how would you measure how often that happens?
  • How would you defend the 3-day bucket and the 30-day gap empirically rather than by assertion?
  • Look-to-book rose 8% after a release that reduced re-sorting. Has demand conversion improved?

Build a censoring-aware pickup curve from availability snapshots

hard
as-of joincensoringpandastime series

snap has supply_unit_id, stay_date, snapshot_date, units_sold_to_date, units_available, is_closed_to_arrival, min_length_of_stay, lead_time_days. Snapshots are irregular: a unit-date is not captured every day. Produce, per destination market, the mean cumulative share of final pickup on hand at each whole days-out value from 90 down to 0, computed only over unit-dates that were genuinely open at that horizon, plus a companion column giving the share of unit-dates excluded at each horizon. No per-unit Python loop. Say which direction the exclusion biases the curve.

Approach
  1. Define final pickup as units_sold_to_date at the smallest observed lead_time_days for that (unit, stay_date), and flag the caveat: it still contains bookings that later cancel, so this is a pace curve, not a stayed-nights curve, and it must not be relabelled as the latter. units_sold_to_date is cumulative net of cancellations, so it can fall between two snapshots; an earlier snapshot can then sit above the final-pickup denominator and give a share above 1.0 at a positive horizon with the grid pick running correctly. Do not clip that to 1.0 — count it and report the affected unit-date share, because clipping hides a real cancellation and a wrong fill direction behind the same flat ceiling.
  2. Put the irregular snapshots onto the regular 0..90 days-out grid with merge_asof on lead_time_days, both sides sorted ascending, direction='forward' and a by of (supply_unit_id, stay_date). Forward on an ascending lead-time key selects the nearest snapshot with lead_time at least the grid value, which is the most recent capture that was still that far out.
  3. Be explicit about the fill direction, because this is where the leak lives. On a lead-time-ascending index, a plain forward fill propagates small lead times into large ones, pushing near-final pickup back into the 60-day horizon and flattening every curve toward 100%. The correct fill on that index is backward.
  4. Mark a unit-date censored at a horizon when units_available is 0 or is_closed_to_arrival is true or min_length_of_stay exceeds 1, and compute the mean share over the uncensored rows only. Count and report the excluded share per horizon in the same frame so the reader sees the sample changing under the curve.
  5. State the bias direction: censoring is correlated with demand, so the excluded unit-dates are disproportionately the fast-selling weekend and holiday dates. Dropping them biases the surviving curve toward slow-selling inventory, and including them biases it the other way because a sold-out date sits at 100% of final pickup early. Neither version is the demand curve, and that is the point worth saying out loud.
Follow-up
  • How would you use this curve as an input to a stay-week forecast, and at which days-out horizon does it stop carrying information?
  • Two markets have visibly different curves. What does that imply for how far out each one's price should be set, and for the confidence interval on their forecasts?
  • Sketch the survival-analysis version of this problem and say what it buys you over the exclusion approach.

For someone who can already write the query and train the model but stalls when asked what to measure or whether a change is worth making. Metric definition and case structure come first; the technical work is kept as maintenance rather than the centre of the week.

Small steps. Visible outcomes.0 / 7 completed
ONE WEEK · YOUR PACE

Prepare, practise & reflect

One practical outcome each day. Spend longer where you need it.

0 / 7 done
01Metric anatomy
  • For three products you use daily, write one primary metric, two input metrics that plausibly move it, and one guardrail that would catch a cheap way of moving the primary at the cost of the product.
  • For one of them, specify the metric precisely enough that two analysts would return the same number: numerator, denominator, unit of observation, time window, and how returning and deleted accounts are treated.
  • Pick a ratio metric and write what happens to it when the denominator shrinks for reasons unrelated to the numerator, with a concrete example of that happening.

Deliverable: A one-page metric tree for one product, with the primary metric written as an unambiguous spec.

Practice prompt ↗Practice prompt ↗Practice prompt ↗Worked solution ↗
02Diagnosing a drop without guessing
  • Take the prompt "weekly active users fell 8 percent week over week" and write the segmentation plan before proposing any cause: platform, region, tenure cohort, acquisition channel, and whether the movement sits in the numerator or in a changed denominator.
  • List the instrumentation failures that manufacture fake drops (a client release that stopped firing an event, a bot filter change, a shifted date boundary or timezone) and write the query that rules out each one.
  • Rehearse stating the boring explanations first, seasonality and day-of-week composition, before reaching for a product cause.

Deliverable: A drop-diagnosis checklist short enough to recite from memory in under a minute.

Practice prompt ↗Practice prompt ↗Practice prompt ↗
03Should we build it
  • Take a feature idea and write it as a bet: what you believe is true, what would have to be true for it to pay off, the metric that would confirm it, and the effect size that would justify the engineering cost.
  • Size the opportunity top-down and bottom-up, then reconcile the two numbers in writing instead of quoting whichever is friendlier.
  • Write the counter-metric that would make you kill the feature even if it wins on the primary metric.

Deliverable: A one-page product memo ending in a decision rather than a list of considerations.

Practice prompt ↗Practice prompt ↗Practice prompt ↗
04The places aggregate numbers lie
  • Construct a Simpson's paradox numerically: two segments where the treatment wins within each segment yet loses overall, and identify the shift in segment weights that causes it.
  • Take a heavy right-tailed quantity such as revenue per user and write why the mean is the wrong summary, which percentile you would report instead, and what a moving mean with a stable median tells you.
  • Write your definition of a session for the product from day one, then name two real behaviours it misclassifies.

Deliverable: One page holding a worked Simpson's paradox table and a session definition with its two known failure cases.

Practice prompt ↗Practice prompt ↗Worked solution ↗
05Technical maintenance, aimed at metrics
  • Solve four timed SQL prompts that all end in a ratio metric, so the question of grain stays live in every answer.
  • Compute a 95 percent confidence interval for a proportion on a small sample, and state why the normal approximation is unreliable when either np or n(1 minus p) falls below roughly 10, along with which interval you would use instead.
  • Take one metric from your day-one tree, write the query that computes it correctly, then write the query that computes it wrong in the most plausible way and explain how you would notice.

Deliverable: Four solved prompts plus a matched correct and plausible-wrong query for one metric.

Practice prompt ↗Practice prompt ↗
06Turning engineering work into data science stories
  • Write three project stories as situation, decision, trade-off, outcome, each carrying one number and one thing you got wrong.
  • For the story you will lead with, prepare an answer to "what would you do differently" that names a decision you made, not a constraint you were handed.
  • Practise the sentence that reframes a systems project as a question project: the question the work answered, ahead of the pipeline it shipped.

Deliverable: Three written stories with the lead story delivered aloud and timed under four minutes.

Practice prompt ↗Practice prompt ↗
07Mock case and gap list
  • Run a 40-minute mock case with someone playing a product manager who pushes back on your metric choice, and record it.
  • Listen back and mark every moment you proposed a solution before the success metric existed.
  • Rewrite those moments as the question you should have asked, and rehearse the first 90 seconds of the case until scoping comes before solving.

Deliverable: A recorded case plus a rewritten opening 90 seconds.

Practice prompt ↗Practice prompt ↗Worked solution ↗

Expand any day for tasks and deliverables. Your progress is saved on this device.

Most of the questions in this section reduce to one thing: can you be handed a vague request and come back with something useful? Prepare an example where the ask was underspecified, you chose an interpretation, and you said out loud which interpretation you chose. Describing how you narrowed the question matters more than the technique you eventually used.

Describe a time when you applied statistical methods to solve a busine…

medium
behavioural and stakeholder questions

Describe a time when you applied statistical methods to solve a business problem.

Approach
  1. State the situation in two sentences and spend the rest on your reasoning.
  2. Close with what you would do differently, concretely.
  3. Name the disagreement or constraint, and how you resolved it with evidence.
Follow-up
  • How did you know the outcome was caused by your change?
  • What would you do differently if you ran that project again?

State your own impact when the evidence is confounded

hard
impact measurementconfoundingself-assessment

You built the pickup-based stay-week forecast that replaced a trend model, and it was adopted across markets last quarter. Forecast error on stay-week stayed nights improved 9% over the quarter. In the same quarter two markets were added to the portfolio, the seasonality baseline was re-fitted by another team, and one large market's moving holiday realigned against the prior year. You are writing the impact section of your own review. Write the claim you would actually make, the evidence behind it, and what you explicitly do not claim.

Approach
  1. Name the counterfactual before the number: 9% against what the old model would have produced on the same weeks, not against last quarter's realised error, since the portfolio and the calendar both changed underneath.
  2. Build the honest comparison by back-testing the old model on the current quarter's stay weeks and scoring both models on the same weeks, same markets, same horizon. This removes the two added markets and the re-fitted baseline from the comparison entirely, because both models see the same inputs.
  3. Handle the moving holiday by excluding or separately reporting the affected stay weeks, since a realignment changes the difficulty of the forecast rather than the quality of either model, and it would otherwise sit inside your credit.
  4. Split the claim into what the method did and what you did. Adoption across markets involved other people; the defensible personal claim is the method and the migration you drove, with the organisational result reported alongside and attributed plainly.
  5. Write the non-claim explicitly and early. Stating that you cannot attribute the portfolio-level improvement to the model alone is what makes the part you do claim credible, and it pre-empts the reviewer finding the confound themselves.
Follow-up
  • The head-to-head back-test shows only a 3% improvement. What do you write?
  • How would you have instrumented the rollout so this was measurable without a back-test?
  • A peer's review claims the same 9%. How do you handle that?

Give an executive one number and its honest interval

medium
communicating uncertaintyforecastingexecutive audience

A director must commit contact-centre staffing for a peak stay-week 60 days out. Your pickup forecast from fct_rate_availability_snapshot gives 42,000 stayed nights for that week, with an 80% interval of 36,500 to 47,000. Back-testing shows the interval only narrows materially inside 30 days out. The director has said twice that they want one number and do not want to hear about confidence intervals. You have a five-minute slot and one slide. Prepare what goes on it and what you say.

Approach
  1. Work out the decision before the number: staffing is asymmetric, because under-staffing a peak week costs servicing failures and cancellations while over-staffing costs idle hours. Find out which side is more expensive, because the whole answer is which end of the interval to plan against.
  2. Convert the interval into two staffing levels rather than two stay-night counts. An executive cannot act on 36,500 to 47,000; they can act on 'staff for 44,000 now, with a named trigger to add or release capacity'.
  3. Give the one number they asked for, and attach the trigger to it rather than a caveat: plan at the level implied by the more expensive error, then re-read pickup at 30 days out, which back-testing says is where the interval actually moves.
  4. Say what the uncertainty is made of in one line each, using the domain's own vocabulary: pickup still to come, lead-time mix for that market, and whether the week straddles a moving holiday that shifts against last year.
  5. Close with the decision the interval does not affect, so the director knows the width is not an excuse: if every point in the interval implies the same staffing tier, say so and stop talking about the interval.
Follow-up
  • The week lands 6,000 nights below your point forecast. How do you handle the next forecast conversation with this director?
  • They ask you to just give them the midpoint and skip the trigger. What do you do?
  • How would you decide whether an 80% interval is the right one to show rather than a 50% or a 95%?
  • 01

    Describe a time when you applied statistical methods to solve a business problem.

  • 02

    You built the pickup-based stay-week forecast that replaced a trend model, and it was adopted across markets last quarter. Forecast error on stay-week stayed nights improved 9% over the quarter. In the same quarter two markets were added to the portfolio, the seasonality baseline was re-fitted by another team, and one large market's moving holiday realigned against the prior year. You are writing the impact section of your own review. Write the claim you would actually make, the evidence behind it, and what you explicitly do not claim.

  • 03

    A director must commit contact-centre staffing for a peak stay-week 60 days out. Your pickup forecast from fct_rate_availability_snapshot gives 42,000 stayed nights for that week, with an 80% interval of 36,500 to 47,000. Back-testing shows the interval only narrows materially inside 30 days out. The director has said twice that they want one number and do not want to hear about confidence intervals. You have a five-minute slot and one slide. Prepare what goes on it and what you say.

PracHub interview preparation framework ↗
Is this an official Expedia interview guide?

No. It is PracHub's own research and practice material for the Data Scientist role at Expedia. Rounds and questions reflect what candidates have reported, not a process Expedia has published, and they change over time. Confirm the current format and scope with your recruiter.

PracHub interview research ↗
How difficult is the interview process?

The interview process for the Data Scientist position at Expedia Group can be challenging, with a mix of technical assessments and behavioral questions. Candidates should expect to dedicate significant time for preparation, particularly in technical areas.

PracHub interview research ↗
What differentiates successful candidates?

Successful candidates typically demonstrate a strong technical foundation, effective communication skills, and a proven ability to solve complex problems. Candidates who can showcase relevant project experience and align with the company’s culture tend to stand out.

PracHub interview research ↗
What is the company culture like at Expedia Group?

Expedia Group fosters a collaborative and innovative culture that values data-driven decision-making. Employees are encouraged to share ideas and work across teams to drive impactful results.

PracHub interview research ↗
What is the typical timeline from the initial screen to an offer?

The timeline can vary, but candidates often report a process that takes several weeks. It is not uncommon for candidates to experience delays in communication, so proactive follow-ups are advisable.

PracHub interview research ↗
Sources & methodology 3 sources ↗

No official company page is cited. Rounds and questions come from candidate reports and PracHub editorial material; each source shows the date it was read.