Gopuff · Data Scientist
Updated · 2026-09-22

Gopuff Data Scientist
Interview Questions & Guide 2026

THE 60-SECOND BRIEF

As a Data Scientist at Gopuff, you sit at the intersection of rapid hyper-local logistics, real-time consumer demand, and predictive machine learning. This role is pivotal for driving the core operational and product mechanics of an instant e-commerce platform that warehouses and delivers thousands of everyday items in minutes. Whether you are optimizing dispatch algorithms, refining ETA prediction models, or designing causal inference frameworks for driver pricing and incentives, your work directly shapes the day-to-day experience of millions of consumers and delivery partners.

The boundary with engineering varies enough to be worth asking about directly. Some seats end at the analysis and the writeup; others carry feature pipelines, scheduling and alerting, which decides whether production data plumbing belongs in your prep at all.

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

Query request, match and payout grains without fan-outEstimate cross-side elasticities from cohort and holdout dataDiagnose whether a market is supply- or demand-constrained

33 min read

Practice 18 Data Scientist prompts
18Practice promptsAcross five skill areas
3With worked solutionsIncluded in the practice prompts

As a Data Scientist at Gopuff, you sit at the intersection of rapid hyper-local logistics, real-time consumer demand, and predictive machine learning. This role is pivotal for driving the core operational and product mechanics of an instant e-commerce platform that warehouses and delivers thousands of everyday items in minutes. Whether you are optimizing dispatch algorithms, refining ETA prediction models, or designing causal inference frameworks for driver pricing and incentives, your work directly shapes the day-to-day experience of millions of consumers and delivery partners.

The problems you tackle are characterized by immense scale, physical-world constraints, and high velocity. You will collaborate closely with product managers, software engineers, and operations leaders to translate ambiguous business challenges into robust, production-ready data science solutions. From forecasting granular inventory demands across micro-fulfillment centers to modeling complex supply-chain dynamics, your insights and models dictate how efficiently Gopuff operates in a fast-paced market.

Success in this position requires a rare blend of deep technical rigor, practical business intuition, and relentless ownership. You must be comfortable building systems from scratch, rigorously validating them through experimentation, and explaining complex model performance to cross-functional stakeholders. If you thrive in fast-moving environments where your code and algorithms have an immediate, tangible impact on physical deliveries, this role offers an unmatched platform for professional growth.

01

Initial Screening

reported

Data Scientist covers at least four different jobs: experimentation, product analytics, causal work on observational data, and applied modelling that ships into a system. A screening call is the cheapest place to find out which of them is being hired for, and doing that diagnosis openly reads as senior rather than fussy. Ask what the last few pieces of work on the team actually were, and roughly how a week splits between querying, modelling and stakeholder time. Then say which parts of that you have done and which you have not. Claiming the whole range is the fastest way to be caught one round later.

What to demonstrate

  • Whether you can distinguish the flavours of the role and locate your own experience inside one of them honestly
  • Whether you name what you have not done instead of stretching to cover every line of the posting
  • Whether your hard constraints (notice period, location, work authorisation, level) surface now rather than at offer stage

How to prepare

  • Map the last two years of your time into rough percentages across query writing, experiment design, modelling and stakeholder work, so a question about scope has a real answer
  • Mark every responsibility in the posting as done, adjacent or new, and prepare one sentence for each adjacent item naming the closest thing you have actually built
  • Decide which logistics are non-negotiable before the call so you can state them in one sentence rather than negotiating live
PracHub interview research
02

Technical Assessment

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

Behavioral Interview

reported

Most of the weight in this round sits on the disagreement questions. Data work routinely produces an answer someone senior did not want, and the interviewer is trying to learn what you do in that hour. Both failure modes are common: folding as soon as a director pushes back, and treating the pushback as ignorance to be corrected with a better chart. A strong answer usually contains a specific thing the other person knew that you did not, and describes how you found out whether it changed the conclusion.

What to demonstrate

  • Whether you can state the other side's argument accurately before you explain why you disagreed
  • What you treated as evidence during the disagreement, such as a rerun under their assumption or a holdout check, rather than persuasion technique
  • Whether you distinguish being overruled from being wrong, and can give an example of each

How to prepare

  • Write out one disagreement where you turned out to be wrong, and say what in the data misled you. Candidates prepare the story where they were right, and the follow-up asks for the other one.
  • For your main disagreement story, be ready to say what result would have made you drop your position. If no such result exists, you were not arguing from the data.
  • Practise stating the opposing position out loud in one sentence the stakeholder would accept, then continue the story.
PracHub interview research

PracHub editorial advice for the preparation topics above.

01

Randomising individual consumers when supply is shared

A feature that makes treatment consumers book faster consumes the same idle providers the control consumers would have used, so the control group is degraded by the treatment and the measured lift overstates the market-level effect. The bias is largest precisely when supply is tight, which is when the feature is supposed to help, so the experiment is most misleading exactly where the decision matters. The fix is randomising the market or the time block (switchback) and clustering the variance at the randomisation unit, accepting far fewer effective units.

02

Denominator drift in per-active-user metrics

Orders per active consumer falls when acquisition succeeds, because new cohorts transact less than tenured ones, so the metric penalises the thing the company is trying to do. A team that optimises it will quietly prefer weaker acquisition. Decompose into cohort size times cohort frequency, or hold the cohort fixed and read frequency by tenure bucket, before drawing any conclusion about engagement.

03

Interpreting a change before checking data quality and logging

Spend the first pass on row volume by day, null rates, duplicate keys, and whether the step change lands on a release or tracking-migration date. A discontinuity that coincides with a deploy is an instrumentation hypothesis before it is a behavioural one.

04

Treating a non-significant result as proof of no effect

Say whether the confidence interval excludes the effect sizes you would have cared about. If it does not, the honest reading is that the test was underpowered, so report the minimum detectable effect the design could have found and what sample size would resolve it.

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

15 technical prompts3 include a worked solution

Explain how you account for seasonality and time-of-day trends when bu…

medium
machine learning and modelling

Explain how you account for seasonality and time-of-day trends when building regression models for inventory forecasting.

Approach
  1. Pick an evaluation metric that matches the cost of each error type, not a default.
  2. Check what information would not exist at prediction time, and exclude it.
  3. Set a baseline first, so any model has something honest to beat.
Follow-up
  • Where could label leakage enter this setup?
  • How would you choose the decision threshold, and who owns that choice?

Simulate dispatch cascades and the censoring of wait time

mediumWorked solution
simulationcensoringmonte carlo error

A request is offered to one provider at a time. Each offer resolves 12 seconds after it is sent, and each provider accepts independently with probability 0.55. After six declines the request is marked no_supply. Independently, the consumer abandons at time A drawn from an Exponential distribution with mean 90 seconds; abandonment before a pending offer resolves ends the request unmatched. Simulate 200,000 requests and report: the share matched, the mean time-to-match over matched requests, and the mean over requests that would have matched with abandonment switched off. Give a Monte Carlo standard error for the share.

Approach
  1. Vectorise the cascade: draw K with np.random.default_rng().geometric(0.55), mark K > 6 as no_supply, and draw A = rng.exponential(90) independently; the match condition is K <= 6 and A > 12*K. Looping request by request is the difference between two seconds and two minutes of runtime.
  2. Compute both means on the same draws so the comparison is paired and the difference is not itself a Monte Carlo artefact.
  3. Recognise the structure driving the answer: abandonment censors long cascades harder than short ones, so conditioning on matched requests is not a neutral filter, it is a filter correlated with the quantity being measured.
  4. Quote the share to three decimals only: the standard error of a proportion is sqrt(p(1-p)/n), roughly 0.0009 at n = 200,000, so further digits are noise.
  5. Check against the closed form P(match) = sum over k of 0.45^(k-1) * 0.55 * exp(-12k/90) for k = 1..6; a simulation with no analytical check is an untested function.
Worked solution 30 min
  1. k = rng.geometric(0.55, size=200_000); a = rng.exponential(90.0, size=200_000); t = 12.0 * k.
  2. supplied = k <= 6; matched = supplied & (a > t).
  3. share = matched.mean(); se = sqrt(share * (1 - share) / 200_000).
  4. observed_mean = t[matched].mean(); latent_mean = t[supplied].mean().
  5. Compare share against the closed form 0.7911 and print the gap in standard errors.
EXPECTED RESULTMatched share about 0.791 (closed form 0.7911, Monte Carlo SE about 0.0009); mean time-to-match over matched requests about 19.5 seconds; latent mean over all requests with K <= 6 about 21.2 seconds; the observed mean therefore understates the true wait by roughly 1.7 seconds, about 8%.
Follow-up
  • A change ships that makes consumers abandon sooner. What happens to your reported mean time-to-match, and how would you report latency so that this cannot look like a win?
  • How would you estimate the same quantity from production data, where you never observe the latent match time of an abandoned request?

Audit supply-session integrity without shrinking the frame

easy
data qualityinvariantsinterval overlap

You are given sessions: session_id, provider_id, market_id, online_at_utc, offline_at_utc (NaT while open), online_seconds, engaged_seconds, en_route_seconds, idle_seconds, offers_received, offers_accepted, orders_completed, end_reason. Write audit(sessions) returning one row per rule with the rule name, violation count, violation share and up to five example session_ids. Cover at least: engaged + en_route + idle not equal to online_seconds; for closed sessions, online_seconds disagreeing with offline_at minus online_at by more than 2 seconds; offers_accepted greater than offers_received or orders_completed greater than offers_accepted; two overlapping sessions for the same provider; offline_at_utc NaT while end_reason is not 'session_still_open'.

Approach
  1. Express every rule as a boolean Series over the whole frame rather than as a filtered sub-frame, so all rules share one denominator and can be combined or counted together afterwards.
  2. Apply the duration rule only to closed sessions and keep the 2-second tolerance as a named constant in the output, since clock rounding is a real effect and hiding the tolerance makes the report unreproducible.
  3. Detect overlaps in one sort: order by (provider_id, online_at_utc), fill NaT offline times with a far-future sentinel, take a per-provider shifted cumulative max of offline_at_utc, and flag rows whose online_at_utc is strictly less than it. That is O(n log n) and needs no self-join.
  4. Emit rules with zero violations as explicit rows, so a rule that passed is distinguishable from a rule that never ran.
  5. Keep impossible values and merely suspicious ones in separate rows with the threshold stated: a 30-hour online session breaks no invariant but belongs in the same report.
Follow-up
  • One rule fires on 0.4% of rows, all in a single market. How would you decide between an ingestion bug and genuine provider behaviour?
  • Which of these rules would you make a blocking pipeline test, and which only a monitored alert, and what distinguishes the two?

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 ↗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 ↗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.

A number you shipped turned out to be wrong, and someone had already acted on it. That is one of the most useful stories a data person can carry. What is being scored is how fast you noticed, who you told first, and what you changed in the process so the same class of error could not repeat quietly.

Tell me about a time you had to translate an ambiguous business proble…

medium
behavioural and stakeholder questions

Tell me about a time you had to translate an ambiguous business problem into a well-defined technical roadmap.

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

Describe an analysis you got wrong after a decision shipped

medium
post-mortemrollup biasprocess controls

Describe a number you published that turned out wrong, where someone had already made a decision on it. State the mechanism of the error rather than the feeling; how long it was live; who acted on it and what that cost; how it surfaced and whether you were the one who found it; and the control you put in afterwards. An error caught in review before anyone acted does not qualify for this question. Deliverable: three minutes, ending with the one process change that is still in place today.

Approach
  1. Choose an error with a real mechanism you can draw in one sentence, not a communication miss; the question is probing whether you understand how your own work fails, and a 'they misunderstood my chart' story answers a different question.
  2. State the blast radius honestly and numerically: days live, decisions taken, dollars or headcount moved. Vagueness here reads as an error you never actually measured.
  3. Say how it surfaced, including the unflattering version if someone else found it. Claiming self-detection on an error that a stakeholder caught is the fastest way to lose the room.
  4. Separate the mechanism from the conditions that let it survive: a wrong formula is one bug, but no reconciliation check and no second reader are the reasons it lived for weeks.
  5. End on a structural control, not an intention. 'I will be more careful' is not a control; a test that fails the job when two computations of the same metric disagree is.
Follow-up
  • How soon after you knew did the decision-maker know, and who told them?
  • Has the control you added caught anything since, and how would you know if it had silently stopped working?
  • What class of error would that control still miss?

Explain a switchback confidence interval to a non-technical executive

easy
communicating uncertaintyswitchbackdecision framing

A switchback test of a dispatch-radius change ran 1,152 market-hour blocks across six markets. SLA fill rate moved +1.8 percentage points, 95% interval [-0.4, +4.0], variance clustered at the block. Those markets serve about 250,000 eligible requests a week at 88% fill and 93% completion. An executive with no statistics background wants a ship-or-wait answer inside a five-minute update. Deliverable: the two-minute spoken explanation, your recommendation, and the single condition that would change it. You may not use the words significant, p-value, or confidence interval.

Approach
  1. Open with the decision and the recommendation, then justify; an executive who hears the caveat first stops listening before the ask arrives.
  2. Translate both interval bounds into the unit the executive already manages: eligible requests times percentage points times completion rate gives weekly completed orders, so the range becomes 'between about 1,000 fewer and about 9,300 more completed orders a week, best single guess about 4,200 more'.
  3. Say plainly what the range does and does not rule out: it does not rule out a small loss, and it is wide because the test has 1,152 effective units, not 250,000 consumers. Block-level randomisation is the reason the sample is small, and it is the reason the number is trustworthy at market level.
  4. Price the two errors against each other: a reversible dispatch parameter with a bounded downside is cheap to ship and cheap to revert, so the decision rule is not 'is the effect proven' but 'is the worst case affordable and detectable'.
  5. End with the one condition that flips you: name the monitoring metric (provider utilisation and idle time, since a wider radius can raise fill by burning provider hours) and the threshold at which you revert.
Follow-up
  • How many more weeks of blocks would it take to halve the width of that range, and is that worth the delay?
  • The executive asks 'so is it real or not' - what do you say without reaching for statistical vocabulary?
  • What would you monitor post-ship that the experiment itself could not measure?
  • 01

    Tell me about a time you had to translate an ambiguous business problem into a well-defined technical roadmap.

  • 02

    Describe a number you published that turned out wrong, where someone had already made a decision on it. State the mechanism of the error rather than the feeling; how long it was live; who acted on it and what that cost; how it surfaced and whether you were the one who found it; and the control you put in afterwards. An error caught in review before anyone acted does not qualify for this question. Deliverable: three minutes, ending with the one process change that is still in place today.

  • 03

    A switchback test of a dispatch-radius change ran 1,152 market-hour blocks across six markets. SLA fill rate moved +1.8 percentage points, 95% interval [-0.4, +4.0], variance clustered at the block. Those markets serve about 250,000 eligible requests a week at 88% fill and 93% completion. An executive with no statistics background wants a ship-or-wait answer inside a five-minute update. Deliverable: the two-minute spoken explanation, your recommendation, and the single condition that would change it. You may not use the words significant, p-value, or confidence interval.

PracHub interview preparation framework
Is this an official Gopuff interview guide?

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

PracHub interview research
How technical are the coding rounds at Gopuff?

The technical rounds focus heavily on practical Python and SQL capabilities tailored to data manipulation, feature engineering, and data science workflows. You should be comfortable writing clean, efficient code without relying heavily on syntax auto-completion, particularly when dealing with aggregations and window operations.

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

The process typically moves at a steady startup pace, taking roughly three to four weeks from the initial recruiter screen through the final interview panels and leadership sync, depending on scheduling availability.

PracHub interview research
Are remote candidates considered for this role?

Yes, Gopuff offers both remote and on-site positions depending on the specific team and role requirements, with certain delivery technology roles tied to specific hub offices like Philadelphia. Check the specific job listing details to confirm location flexibility.

PracHub interview research
How can I stand out during the product sense and case study rounds?

Stand out by grounding your answers in the operational realities of hyper-local delivery. Always consider second-order effects, such as how optimizing driver dispatch in one neighborhood might inadvertently impact delivery times in an adjacent zone.

PracHub interview research
Sources & methodology 3 sources ↗

Official role evidence, timestamped platform data and clearly labeled preparation advice.