Make My Trip · Data Scientist
Updated · 2026-09-24

Make My Trip Data Scientist
Interview Questions & Guide 2026

THE 60-SECOND BRIEF

A Data Scientist at Make My Trip operates at the intersection of massive scale and high-velocity consumer decision-making. As a leader in the travel technology space, Make My Trip relies on data to personalize user journeys, optimize pricing models, and refine the search-to-booking funnel. You will be tasked with transforming raw behavioral data into actionable product features that directly impact millions of users across flights, hotels, and holiday packages.

If the team owns experimentation, expect depth past a two-sample test: minimum detectable effect and its roughly inverse-square-root dependence on sample size (holding power, significance level and variance fixed), variance reduction from pre-period covariates, interference between units, and when a sequential design is the right call.

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

Judge cancellation cohorts only at equal maturityCohort bookings on stay date, not booking dateCompute occupancy from sellable nights, never property averages

35 min read

Browse Data Scientist questions

See the practice prompts

16Practice promptsAcross five skill areas
3With worked solutionsIncluded in the practice prompts

A Data Scientist at Make My Trip operates at the intersection of massive scale and high-velocity consumer decision-making. As a leader in the travel technology space, Make My Trip relies on data to personalize user journeys, optimize pricing models, and refine the search-to-booking funnel. You will be tasked with transforming raw behavioral data into actionable product features that directly impact millions of users across flights, hotels, and holiday packages.

This role is inherently product-focused. You will not just be building models; you will be identifying business bottlenecks, designing experiments to validate hypotheses, and ensuring that every algorithm deployed improves the bottom line. The complexity here lies in the travel domain—where seasonality, inventory constraints, and user intent require sophisticated statistical rigor and creative engineering. You will collaborate closely with product managers and engineers to build systems that define the future of online travel.

01

Screening Round

reported

Rounds outside the standard loop often open with something deliberately under-specified: a loose business problem, an open question about a product area, a dataset described in one sentence. The common failure is surveying, listing six plausible approaches and committing to none of them. The thing that separates a strong answer is scoping out loud. State what you are treating as the goal, name the metric you would move, say what you are choosing not to do and why, then take one path through to an actual answer. An interviewer can follow you down a narrow path. Nobody can grade a menu.

What to demonstrate

  • Whether you turn an ambiguous prompt into a stated question with a measurable outcome before doing any work
  • The judgement visible in what you cut, and whether you say why you cut it rather than silently dropping it
  • Whether you land on a concrete recommendation with its caveat attached, rather than an unranked set of options

How to prepare

  • Take three vague prompts, such as 'is this feature working', 'why did retention drop', and 'should we expand into a new segment'. For each, write one sentence of goal, one primary metric with its window, and two things you are explicitly not doing.
  • Practise giving the recommendation first and the reasoning second, in five minutes. Loosely defined rounds are usually time-boxed, and an answer that arrives last often does not arrive.
  • Keep a running assumption list as you talk, on paper or in the shared doc, so the interviewer can challenge one assumption instead of your whole answer.
PracHub interview research ↗
02

Technical Assessments

reported

This round decides whether someone can hand you a schema and a question and trust the number that comes back. Correctness under a clock is the bar, not clever syntax. The habit that separates strong from weak answers is checking the grain: after every join, know how many rows you expect and whether the count moved. Most wrong answers in this format are not wrong logic, they are a fan-out from a key that turned out not to be unique, or a filter applied before an aggregate when it belonged after. Say what you expect before you run it.

What to demonstrate

  • Whether your row counts survive each join, and whether you notice on your own when they do not
  • Deliberate handling of rows that fail to match, including whether the question needs an inner join or a left join with the non-matches kept and counted
  • Whether NULLs are treated on purpose, given that a NULL compares equal to nothing and that COUNT of a column skips it
  • Reaching a defensible answer inside the window instead of a refined one after it

How to prepare

  • Take a two-table schema, write a join that fans out on purpose, then fix it by collapsing the many-side to one row per key before joining. Repeat until the fix is reflex rather than recall.
  • Write a funnel as one query and print the distinct user count at each stage, then confirm each stage is a subset of the one above it rather than assuming it
  • Do a few timed runs in a plain text box with no autocomplete and no formatter, since assessment editors often have neither
PracHub interview research ↗
03

Deep-Dive Discussions

reported

An added round often puts you in front of someone outside the core hiring team: a partner engineer, a product owner, a domain expert, sometimes a more senior manager. The question they are really asking is not whether you can do the work but whether they would trust a number that came from you. That changes what a good answer looks like. Lead with what the decision cost and what it changed, keep the method available but not central, and be plain about the limits of your evidence. Overstating a result is the fastest way to lose this round.

What to demonstrate

  • Whether you can explain a technical choice to someone who will never read your code, without either flattening it into nothing or hiding inside jargon
  • Honesty about evidence strength: what the analysis establishes, what it only suggests, and what it cannot say at all
  • How you take disagreement, specifically whether you update on a good objection, hold your position with reasons, or fold on contact

How to prepare

  • Write the two-sentence version of your most technical project for a non-specialist, then check that neither sentence needs a method name to make sense.
  • For one result you are proud of, write the strongest objection someone could raise and a response that concedes the part of it that is correct.
  • Prepare one decision that turned out to be wrong: how you found out, what it cost, and what you changed afterwards. A senior cross-functional interviewer asks for this more often than a technical one does.
PracHub interview research ↗

PracHub editorial advice for the preparation topics above.

01

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.

02

Attributing a blended rate change to behaviour when the mix moved underneath it

Occupancy, average daily rate, take rate and conversion are all ratios computed over a heterogeneous pool, and their blended values move whenever the composition of markets, property classes, lead times, party sizes or contract types changes, with nothing changing inside any segment. This is Simpson's paradox with a seasonal engine driving it: a shift toward short-lead leisure demand lowers blended ADR and raises blended conversion at the same time, and both movements are mix. Year-over-year comparison does not rescue you by itself, because the calendar does not repeat: day-of-week alignment drifts and moving holidays shift by weeks, so the same ISO week is not the same demand week. Decompose every rate change into a within-segment component and a mix component before writing a sentence about cause, and align year-over-year comparisons on the local market calendar using market_holiday_flag rather than on the date.

03

Analysing at a different unit than the one randomised

Say out loud what was randomised (user, device, account, cluster) and make the analysis unit match, or account for the clustering with cluster-robust standard errors, the delta method, or aggregation up to the randomised unit. Randomising users and then running a test over sessions understates variance and inflates the false-positive rate.

04

Extrapolating a first-week lift inflated by novelty effects

Plot the treatment effect by days since first exposure instead of quoting one pooled average. A lift that decays toward zero across the test window is behaviour that will not persist, and annualising it produces a forecast that misses by an order of magnitude.

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

13 technical prompts3 include a worked solution

Implement occupancy, ADR and revenue per sellable night

medium
metric implementationas-of joinpandasaggregation

Two DataFrames: nights (booking_id, stay_date, supply_unit_id, night_status in booked/cancelled/no_show/stayed, unit_revenue_usd, taxes_and_fees_usd) and snap (supply_unit_id, stay_date, snapshot_date, units_available, units_sold_to_date, units_blocked). Implement, per stay_date: occupancy, average daily rate and net revenue per sellable night. Sellable nights are units_sold_to_date + units_available taken from the latest snapshot_date on or before that stay_date, per unit, excluding units_blocked. ADR excludes taxes. Return one frame indexed by stay_date and assert revenue-per-sellable-night equals ADR times occupancy.

Approach
  1. State the denominator convention out loud before coding: sellable nights exclude units_blocked, physical capacity includes them, and the two diverge sharply for individually-managed supply. Put the chosen convention in a column name or a returned attribute so a reader cannot mistake which one they are looking at.
  2. Do the as-of pick per (supply_unit_id, stay_date), not globally: filter snap to snapshot_date <= stay_date, sort by snapshot_date, then groupby(['supply_unit_id','stay_date']).tail(1). Taking the single latest snapshot_date across the whole table silently uses one date's view for every stay date and quietly changes the metric.
  3. Take the numerator only from nights with night_status == 'stayed'. units_sold_to_date at the final snapshot exceeds the stayed count by whatever cancels or no-shows afterwards, so reading the numerator off the snapshot overstates occupancy by exactly the late-cancellation rate.
  4. Aggregate as a ratio of sums: sum the numerator and the denominator to stay_date grain and divide once. Averaging per-property occupancies or per-property ADRs is a mean of ratios and breaks the identity, weighting a four-unit property the same as a four-hundred-unit one.
  5. Assert the identity with np.isclose on relative tolerance: revenue/sellable equals (revenue/stayed) times (stayed/sellable) is exact arithmetic when all three are computed over the same unit-date set, so a failure means the sets differ, usually a unit present in nights but missing from the snapshot.
Follow-up
  • Occupancy comes out above 1.0 on three stay dates. Give the two most likely causes and how you would tell them apart.
  • Rewrite the denominator on the physical-capacity convention. Which direction does occupancy move, and for which supplier type does the gap get large?
  • Now split by property_class. Why can every class's occupancy rise while the blended figure falls?

Expand bookings into stay nights without losing cents

easy
pandasreshapingrevenue allocationvectorisation

You are given a pandas DataFrame bookings with columns booking_id, check_in_date, check_out_date, nights, unit_revenue_usd (the booking total, two decimal places), about 200,000 rows. Write a function returning stay_nights at one row per booking per stay date, with columns booking_id, stay_date, night_index (1-based) and unit_revenue_usd allocated across the nights so the per-booking sum equals the original to the cent. No per-row Python loop and no apply over rows. State your rule for the departure date.

Approach
  1. Confirm the grain rule first: a stay night is the arrival date through the night before check_out_date, so nights = (check_out_date - check_in_date).days and the departure date is never a row. Assert this against the stored nights column and report mismatches rather than trusting either side.
  2. Build the expansion arithmetically instead of materialising date lists: counts = nights.to_numpy(); starts = np.repeat(np.cumsum(counts) - counts, counts); offsets = np.arange(counts.sum()) - starts. That gives a 0-based night offset per output row in one pass, and night_index = offsets + 1.
  3. Compute stay_date as np.repeat(check_in_date.to_numpy(), counts) + offsets.astype('timedelta64[D]'). This is O(total nights) with no grouping and no Python-level iteration.
  4. Allocate revenue in integer cents, not floats: cents = np.rint(unit_revenue_usd * 100); base = cents // counts; remainder = cents - base * counts; give the first remainder nights of each booking one extra cent. Dividing floats by nights leaves sub-cent drift that re-sums to 99.99 or 100.01 on a large fraction of bookings.
  5. Verify by grouping the output back to booking_id and comparing integer cents to the input, then state which downstream numbers depend on this reconciliation (net revenue per sellable night, take rate, contribution margin per stayed night all read the night grain).
Follow-up
  • The booking is later amended from three nights to five. What has to happen to the already-written night rows, and which of them may not be rewritten?
  • Nights of one booking fall in two calendar months and two tax jurisdictions. Does your equal-split allocation still defend the monthly revenue number, and when would you weight nights by the nightly listed price instead?

Write invariant checks for a rate availability snapshot

easyWorked solution
data qualitypandasnull semantics

The DataFrame snap holds one row per supply_unit_id per forward stay_date per snapshot_date, with units_available, units_sold_to_date, units_blocked, listed_price_usd (nullable), is_closed_to_arrival, min_length_of_stay and lead_time_days. Write check(snap) returning a tidy failure frame with columns check_name, supply_unit_id, stay_date, snapshot_date, detail, plus a per-check summary count. Cover at least: primary-key uniqueness, lead_time_days equal to (stay_date - snapshot_date) in days, listed_price_usd null exactly when units_available is 0, and non-negative counts. It must return the right empty frame on empty input.

Approach
  1. Write each check as a boolean mask over the whole frame, not a row-wise function, and append a small frame carrying check_name plus the three key columns and a detail string built from the offending values. Concatenate at the end with a typed empty frame in the list so an all-clean or empty input still returns the declared columns and dtypes. Declare the check names once as a module-level tuple, CHECK_NAMES, and drive both the run loop and the summary off that tuple rather than off whatever happened to fail.
  2. Test nullity with .isna(); listed_price_usd is a float column so a NULL is NaN, and NaN == NaN is False, which means any == None or == np.nan comparison returns an all-False mask and the check passes vacuously on every row.
  3. Check the price rule in both directions: a non-null price where units_available is 0 means someone imputed the last known price onto a sold-out unit-date, which is the single most damaging corruption here because it turns censored observations into apparently-observed ones for any elasticity work.
  4. Separate hard invariants from business expectations and label them with a severity column. Uniqueness of (supply_unit_id, stay_date, snapshot_date), the lead-time identity and non-negativity are invariants. Monotonicity of units_sold_to_date across snapshot_date is not: cancellations legitimately reduce cumulative pickup, so it belongs at warn severity with a threshold on the size of the drop.
  5. Build the summary by grouping the failure frame on check_name and then reindexing against CHECK_NAMES with fill_value=0. A bare groupby emits no row for a check that found nothing, so a clean input returns a summary listing only the broken checks and an empty input returns no summary at all — which on a dashboard is indistinguishable from the suite never having run, the one state a summary exists to rule out. Return counts per stay_date alongside it so a caller can see whether failures are uniform or concentrated on a single partition, which is what distinguishes a code bug from one bad ingest day.
Worked solution 20 min
  1. Declare CHECK_NAMES as a fixed tuple of the four check names, then define a helper that takes a mask and a check_name and returns the key columns of the failing rows plus a detail string; collect results in a list.
  2. Check 1: snap.duplicated(subset=['supply_unit_id','stay_date','snapshot_date'], keep=False) flags every member of a duplicate key group, not just the later ones.
  3. Check 2: (snap['stay_date'] - snap['snapshot_date']).dt.days != snap['lead_time_days'].
  4. Check 3: two masks, (units_available == 0) & listed_price_usd.notna(), and (units_available > 0) & listed_price_usd.isna().
  5. Check 4: any of units_available, units_sold_to_date, units_blocked below zero; and min_length_of_stay below 1.
  6. Concatenate with an explicit empty typed frame, then build the summary as failures.groupby('check_name').size().reindex(CHECK_NAMES, fill_value=0), so a check that found nothing reports 0 instead of vanishing and a clean or empty input still returns one row per declared check.
EXPECTED RESULTA tidy frame in which a single row corrupted in two ways appears exactly twice, once per check_name. Empty input returns a zero-row frame carrying all five columns with stable dtypes, and the summary returns one row per check_name with count 0 rather than an empty summary.
Follow-up
  • Which of your checks would you make a hard pipeline failure and which a warning, and what is the cost of getting that wrong in each direction?
  • units_sold_to_date drops by 4 between two consecutive snapshots for one unit-date. Give two innocent explanations and one that should page someone.
  • How would you run these on a table too large to hold in memory, keeping the same failure frame?

For someone who has spent the last year in notebooks, dashboards or modelling work and has not written raw SQL under time pressure. The first four days rebuild query fluency against a fixture you control and can verify by hand; the last three attach that fluency to the rest of the loop.

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
01Build a fixture you can check answers against
  • Create a local Postgres or SQLite database with four tables (users, sessions, events, orders) holding roughly 200 rows you generated yourself, so you know the contents well enough to predict every result.
  • Deliberately seed the cases that break queries: a user with no sessions, a session with no events, two orders sharing a timestamp, a NULL in one join key, and one duplicated user row.
  • Before writing any SQL, hand-compute five answers on paper (how many users placed at least one order, median orders per ordering user, and three others) and save them as the ground truth for the week.

Deliverable: A one-command seed script plus a text file of five hand-computed answers to grade every later query against.

Practice prompt ↗Practice prompt ↗Practice prompt ↗Worked solution ↗
02Joins, filters and NULL semantics
  • Answer "which users have no orders" three ways (LEFT JOIN with IS NULL, NOT EXISTS, NOT IN) and confirm that the NOT IN version returns zero rows once the subquery contains a NULL, because the comparison is never TRUE.
  • Reproduce the LEFT JOIN that silently collapses to an inner join by putting a right-table predicate in WHERE, then fix it by moving the predicate into the ON clause, and record both row counts.
  • Create a fan-out bug on purpose by joining orders to order_items and summing the order total, then correct it with a pre-aggregated subquery and explain in one line which table changed the grain.

Deliverable: One annotated .sql file holding the three join traps, each with the wrong result and the corrected result side by side.

Practice prompt ↗Practice prompt ↗Practice prompt ↗
03Window functions and frames
  • Write three window queries against the fixture: a running order total per user, the rank of each order within its user by value, and the day gap to that user's previous order, then check each against the day-one ground truth.
  • Run ROW_NUMBER, RANK and DENSE_RANK over a column containing ties, print all three side by side, and write one sentence on when each is the correct choice.
  • Switch one query from the default frame (RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW, which is what you get when ORDER BY is present and no frame is written) to ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW, and explain why the output differs only when the ORDER BY column has duplicates.

Deliverable: Three verified window queries plus a short note explaining the RANGE versus ROWS difference in your own words.

Practice prompt ↗Practice prompt ↗
04The four analytical query patterns
  • Write a monthly retention grid: first order month per user, then months-since-first as the column, and verify that month zero equals the cohort size exactly.
  • Sessionize the events table under a 30-minute inactivity rule using LAG plus a cumulative sum over a new-session flag.
  • Build a four-step funnel that counts distinct users rather than events at each step, and state the rule you applied to a user who reaches step three without ever logging step two.

Deliverable: One file with the retention, sessionization and funnel patterns, each carrying a one-line note on the assumption it bakes in.

Practice prompt ↗Practice prompt ↗Worked solution ↗
05Write SQL the way you will have to write it live
  • Set a 12-minute timer and solve three medium prompts in a plain editor with no execution and no autocomplete, then run them and tally syntax errors separately from logic errors.
  • Narrate one solution aloud while writing it, stating the grain of each intermediate result (one row per user, one row per user-day) before you type its body.
  • Rewrite your slowest solution as a CTE chain where every CTE name states its grain, and time yourself re-solving it from blank.

Deliverable: A recording of one narrated solution plus an error tally that separates syntax from logic.

Practice prompt ↗Practice prompt ↗
06One day for everything that is not SQL
  • Write the preconditions of the two-sample t-test from memory, then check them: independent observations, and a difference in means whose sampling distribution is approximately normal, which at large sample sizes follows from the central limit theorem rather than from normality of the raw values.
  • Write the difference between an odds ratio from logistic regression and a relative risk, and state the condition under which the two are close (low outcome prevalence).
  • Prepare a 90-second answer to "how would you know this model is any good" that names the metric, the baseline you would beat, and the cost of the errors you care about.

Deliverable: One page of notes covering test preconditions, the odds-ratio caveat and the model-quality answer.

Practice prompt ↗Practice prompt ↗
07Full loop rehearsal
  • Run a 45-minute mock with someone willing to interrupt: 20 minutes of SQL, 15 minutes defining a metric, 10 minutes on a past project.
  • Re-solve from blank the two queries you were slowest on this week and compare the times against day five.
  • Write a five-line answer to "walk me through a project" that puts a number in the first sentence and names the decision the work changed.

Deliverable: Mock feedback notes plus a timed project narrative you can deliver without reading it.

Practice prompt ↗Practice prompt ↗Worked solution ↗

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

Sometimes the honest read is that the initiative did not work, and the person who commissioned the analysis was hoping otherwise. Interviewers want to know whether you softened it. Prepare the case where you delivered an unwelcome result, how you presented the uncertainty without hiding behind it, and what the team did next.

Tell me about a time you had to explain a complex model to a non-techn…

medium
behavioural and stakeholder questions

Tell me about a time you had to explain a complex model to a non-technical stakeholder.

Approach
  1. Close with what you would do differently, concretely.
  2. State the situation in two sentences and spend the rest on your reasoning.
  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 did you decide not to do, and why?

Rank three urgent requests with one analyst-week

easy
prioritisationstakeholder managementscoping

You have one week. The pricing team wants a price elasticity for a constrained market to set next quarter's strategy. The supplier team wants a list of suppliers at risk of delisting, for outreach starting Monday. Finance needs a closed stay-month restated after a batch of late cancellations changed platform_net_revenue_usd on fct_stay_night, ahead of a reporting deadline on Thursday. All three escalated to your manager. Produce your order, the reason for each position, and the message you send to whoever is deferred.

Approach
  1. Sort by deadline irreversibility rather than by who escalated hardest. The finance restatement has an external reporting date, so a miss cannot be recovered later; the other two can start a week late at a cost.
  2. Check each request for a cheap partial that unblocks the requester without the full job: the supplier team needs a ranked outreach list to start Monday, not a churn model, so a ranked cut on rating_avg, listing_status and recent availability withdrawal may be a few hours rather than days.
  3. Push back on the elasticity on substance, not capacity. On constrained inventory, price is set from a demand forecast and sold-out unit-dates record capacity rather than demand, so a fast estimate would be biased toward zero and could come out positive; say what you would deliver instead and what a clean estimate would cost.
  4. Write the deferral message with a date, a reason the requester can verify, and a concrete alternative, because a deferral without a date gets re-escalated within 48 hours.
  5. Take the ordering to your manager as a decision already made with a named tradeoff, not as a question, and include what you will drop if a fourth request arrives.
Follow-up
  • The pricing team says a rough elasticity is better than nothing. What do you give them?
  • Two days in, finance's restatement turns out to be twice the size you scoped. What gives?
  • How would you stop all three landing in the same week next quarter?

Scope a one-line request that conversion is down

easy
scopingmetric definitionstakeholder communication

A director messages: 'Conversion is down, can you look into it?' There is no date range, no market, no definition. In this product, conversion can mean searches to bookings from fct_search, distinct trip_intent_key values to bookings, bookings to completed stays on fct_stay_night, or any of these on the booking axis or the stay axis. Before you run a single query, send back a scoping note. Prepare the clarifying questions in priority order and the note itself, including the metric written as numerator, denominator, window and date axis.

Approach
  1. Ask the decision question before the metric question: what will change depending on the answer. A conversion drop that triggers a pricing response and one that triggers a supply response need different numbers, and the answer reorders everything below.
  2. Resolve the denominator explicitly, because it is the largest source of disagreement here. Searches inflate with any interface change that encourages re-sorting, so the defensible demand unit is DISTINCT trip_intent_key, with is_bot_flagged = FALSE and results_returned_count > 0 excluded from the denominator so that supply coverage is measured separately.
  3. Resolve the date axis next and say it out loud: a booking-axis conversion drop and a stay-axis revenue drop can both be real in the same week and disagree by tens of percent, so naming the axis is not pedantry, it is the difference between two analyses.
  4. Pin the window and the maturity rule: whether cancellations are in or out, and if completed stays are the numerator, that the recent cohorts cannot be read yet and you will report at a fixed cohort age instead.
  5. Return a note with one stated definition, the first cut you will run (market, device_type, lead-time bucket), a time-box, and one explicit assumption the director can correct in a single reply rather than a meeting.
Follow-up
  • The director replies 'just the normal one'. What do you do next?
  • Your first cut shows the drop is entirely in mobile_web in two markets. Does the scope change?
  • How do you keep this from recurring for the next ten ad-hoc requests?
  • 01

    Tell me about a time you had to explain a complex model to a non-technical stakeholder.

  • 02

    You have one week. The pricing team wants a price elasticity for a constrained market to set next quarter's strategy. The supplier team wants a list of suppliers at risk of delisting, for outreach starting Monday. Finance needs a closed stay-month restated after a batch of late cancellations changed platform_net_revenue_usd on fct_stay_night, ahead of a reporting deadline on Thursday. All three escalated to your manager. Produce your order, the reason for each position, and the message you send to whoever is deferred.

  • 03

    A director messages: 'Conversion is down, can you look into it?' There is no date range, no market, no definition. In this product, conversion can mean searches to bookings from fct_search, distinct trip_intent_key values to bookings, bookings to completed stays on fct_stay_night, or any of these on the booking axis or the stay axis. Before you run a single query, send back a scoping note. Prepare the clarifying questions in priority order and the note itself, including the metric written as numerator, denominator, window and date axis.

PracHub interview preparation framework ↗
Is this an official Make My Trip interview guide?

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

PracHub interview research ↗
How difficult are the coding rounds?

The coding rounds are generally medium to difficult. They focus on common data structures and algorithms, as well as practical SQL challenges. You should be comfortable with tree traversal, stack/queue operations, and complex SQL joins.

PracHub interview research ↗
What is the best way to prepare for the case study round?

Focus on structure. Start by clarifying the goal, defining your success metrics, and then breaking down the problem into smaller, manageable components. Always consider the business impact.

PracHub interview research ↗
Does the company value theoretical knowledge or practical experience more?

Make My Trip values both. You will be tested on the theory behind your models, but you must also be able to explain how you would apply those models in a real-world, high-traffic production environment.

PracHub interview research ↗
How long does the entire process usually take?

The process can move relatively quickly, but it is thorough. Expect a few weeks from the initial screen to the final round, depending on scheduling availability.

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.