Gopuff · Software Engineer
Updated · 2026-09-24

Gopuff Software Engineer
Interview Questions & Guide 2026

THE 60-SECOND BRIEF

As a Software Engineer at Gopuff, you play a vital role in powering the technology behind instantaneous commerce. Your work directly impacts how millions of customers discover, order, and receive everyday essentials in a matter of minutes. This position requires you to build resilient, scalable backend services, high-throughput data pipelines, and responsive frontend features that operate under strict latency requirements. You will tackle complex technical challenges unique to rapid delivery logistics, real-time inventory management, and hyper-local supply chain networks.

Allocate preparation against your weakest link rather than your favourite topic. A strong algorithm habit usually comes with weak out-loud explanation of tradeoffs, and years of shipping usually come with rusty from-scratch implementation under a clock.

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

Reconcile money with append-only double-entry postingsShard hot markets while preserving per-booking orderingMake offer acceptance idempotent under expiry races

36 min read

Browse Software Engineer questions

See the practice prompts

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

As a Software Engineer at Gopuff, you play a vital role in powering the technology behind instantaneous commerce. Your work directly impacts how millions of customers discover, order, and receive everyday essentials in a matter of minutes. This position requires you to build resilient, scalable backend services, high-throughput data pipelines, and responsive frontend features that operate under strict latency requirements. You will tackle complex technical challenges unique to rapid delivery logistics, real-time inventory management, and hyper-local supply chain networks.

The scale and speed of Gopuff mean your contributions go live rapidly and have an immediate, measurable effect on business operations and user satisfaction. You will collaborate closely with product managers, data scientists, and operations teams to translate business needs into robust technical architectures. Whether you are optimizing search and discovery algorithms, scaling microservices to handle traffic spikes, or integrating third-party partnerships, your code drives the core engine of the company.

Expect a fast-paced environment where autonomy and technical excellence are highly valued. While the pace is demanding, you will have the opportunity to make significant architectural decisions and shape the future of instant delivery infrastructure. Success in this role requires a strong foundational knowledge of distributed systems, a pragmatic approach to problem-solving, and a collaborative mindset.

01

Recruiter Screen

reported

The title covers product work, platform work, infrastructure, mobile and frontend, and those are different jobs with different loops behind them. A screening call is the cheapest place to find out which one the seat is, and asking reads as experienced rather than fussy. The questions that separate them: what the team is on call for, what the last three projects were, and whether any round happens inside an existing repository instead of a blank file. Then say which of that you have done and which you have not. Claiming the whole posting is the fastest way to be found out one round later.

What to demonstrate

  • Whether you can locate your experience inside one flavour of the role honestly instead of claiming the entire requirements list
  • Whether you name what you have not done, which an experienced screener reads as a level signal and can plan the loop around
  • Whether what you want next matches what the seat is: someone who wants greenfield work landing on a team that mostly operates an existing system is a hire that leaves within the year

How to prepare

  • Mark every line of the posting as done, adjacent or new, and write one sentence for each adjacent line naming the closest thing you actually built
  • Split your last two years into rough percentages across feature work, operating and debugging live systems, and design or review, so a question about scope gets numbers rather than adjectives
  • Bring three questions that discriminate between seats: what the team is paged for, how much of the work is changing existing code versus standing up something new, and what shipped in the last quarter
PracHub interview research ↗
02

Technical Phone Screen

reported

Half of this call is the part candidates treat as small talk: start date, notice period, work authorisation and its timing, location and time zone, on-call, and the number. Those are what kill offers late, after several engineers have each spent a day. Surfacing a hard constraint now costs you nothing and occasionally buys you something, since a loop compressed to fit a competing deadline can usually only be arranged if it is asked for early. The common failure is deflecting the compensation question twice, then discovering at offer stage that the band never reached your number.

What to demonstrate

  • Whether your hard constraints are compatible with the role before a loop gets booked: earliest start, notice period, what authorisation you hold and when it needs action, days on site, willingness to carry a pager
  • Whether you give a compensation range with something behind it, such as current total compensation or a competing timeline, rather than leaving the band untested
  • Whether your stated timeline is real, since a competing deadline raised now is something scheduling can sometimes work around and the same deadline raised at offer stage usually is not

How to prepare

  • Write each constraint down in one line before the call and state them as facts rather than negotiating them live under a question you were not expecting
  • Set your range from two or three current data points for that level and location, and name the structure you are quoting in, so the number is comparable to the one they are holding
  • If another process is running, say where it stands and by when, and ask directly whether this loop can be scheduled inside that window
PracHub interview research ↗
03

Multi-Round Virtual Onsite

reported

Where the day includes a partner from product, design or data, that conversation is weighted like the technical ones and prepared for least. They are deciding one thing: whether having you in the room makes their decisions cheaper. That means options with costs attached, not implementation detail and not "it depends". An estimate someone can plan against — a range, the assumption that would push it to the high end, and what you would drop to hit the low one — is worth more than a confident single number, which everyone present already knows is wrong.

What to demonstrate

  • Whether an estimate comes as a range with the assumption most likely to break it, and states what a specific scope cut would actually buy
  • Whether a technical constraint is handed over as a choice with consequences on their side, rather than as a verdict they have no standing to argue with
  • Whether you establish what decision is on the table before proposing anything
  • Whether risk is raised while it can still change the plan, with the trigger that would confirm it, instead of reported afterwards as a slip

How to prepare

  • Take a project that shipped late and write the two-sentence warning you could have given three weeks earlier, naming what you would have needed decided at that point
  • Rehearse one estimate out loud until it arrives in three parts: the range, the single assumption that would blow it, and the smallest thing you would cut to protect the date
  • Rewrite an objection you have actually made — the "we can't do that" version — as two options with their costs, so the choice ends up with the person who owns it
PracHub interview research ↗

PracHub editorial advice for the preparation topics above.

01

Treating the provider's device as the source of truth for state

The app is offline part of the time and buffers transitions, so events arrive late, out of order, and occasionally duplicated after a retry. A status column written last-write-wins will therefore accept 'started' after 'completed' and resurrect a cancelled booking, which re-enables charging on it. Client timestamps make it worse because the device clock is user-settable and drifts, so ordering by them is not ordering at all. The server must assign the ordering (a per-aggregate monotonic sequence) and every transition must be a guarded write against the expected current state, with the client event treated as a request to transition rather than as the transition.

02

Publishing an event and committing the state change as two separate operations

Whichever order they are attempted in, a crash between them breaks the system in a specific way: publish-then-commit emits an event for a transition that never happened, so downstream consumers charge or notify for a phantom booking; commit-then-publish silently drops the notification, so the provider never receives an offer that the database believes was sent. Neither is fixed by retrying harder, because the failure is the gap, not the operation. The transactional outbox closes it — the event row is written in the same local transaction as the state change and a relay publishes it afterwards — at the cost of at-least-once delivery, which pushes the idempotency requirement onto every consumer.

03

Check-then-act on shared state

Read, decide, write is not safe under concurrency unless the decision and the write are one atomic step: a unique constraint with conflict handling, a compare-and-set, or a row lock held for the whole transaction. Two requests can both pass the existence check before either inserts, which shows up as duplicate rows under load and never in a single-threaded test.

04

Writing code before the input contract is pinned down

Before the first line, state the types, the size bounds, whether duplicates, negatives or an empty input are possible, whether the input is sorted, whether you may mutate it, and what the function returns when nothing matches. Every one of those answers changes the code, and discovering one at minute twenty costs a rewrite you no longer have time for.

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

12 technical prompts3 include a worked solution

How would you refactor a nested conditional function to improve readab…

medium
data structures and algorithms

How would you refactor a nested conditional function to improve readability and performance?

Approach
  1. Choose the data structure from the access pattern, not from familiarity.
  2. State the target complexity and say which constraint rules the naive version out.
  3. Name the brute-force solution and its complexity before improving on it.
Follow-up
  • How does this change if the input no longer fits in memory?
  • Which test case would catch an off-by-one here?

Implement a caching mechanism with an eviction policy for frequently a…

medium
data structures and algorithms

Implement a caching mechanism with an eviction policy for frequently accessed catalog items.

Approach
  1. Name the brute-force solution and its complexity before improving on it.
  2. Choose the data structure from the access pattern, not from familiarity.
  3. Restate the input: its shape, its size, and what is guaranteed about it.
Follow-up
  • How does this change if the input no longer fits in memory?
  • Which test case would catch an off-by-one here?

Given a standard array manipulation or string processing problem, impl…

medium
data structures and algorithms

Given a standard array manipulation or string processing problem, implement an optimal solution and discuss its time and space complexity.

Approach
  1. Restate the input: its shape, its size, and what is guaranteed about it.
  2. State the target complexity and say which constraint rules the naive version out.
  3. Name the brute-force solution and its complexity before improving on it.
Follow-up
  • What is the worst case, and how likely is it on real data?
  • Which test case would catch an off-by-one here?

Walk through your debugging process when a concurrent process throws a…

medium
data structures and algorithms

Walk through your debugging process when a concurrent process throws a race condition error.

Approach
  1. Name the brute-force solution and its complexity before improving on it.
  2. Walk one small example through your approach before writing the whole thing.
  3. Restate the input: its shape, its size, and what is guaranteed about it.
Follow-up
  • What is the worst case, and how likely is it on real data?
  • How does this change if the input no longer fits in memory?

Maximum offers to one provider in any rolling window

mediumWorked solution
sliding windowtwo pointersevent streamrate limiting

Given up to 20 million dispatch_offer rows as (provider_id, offered_at), sorted ascending by offered_at and stamped by the server rather than the device, compute for each provider the maximum number of offers falling inside any rolling 15-minute window, and return the providers whose maximum exceeds 20. Treat the window as half-open: (t - 900s, t]. Memory must be proportional to the offers active in a 15-minute span, not to the length of the input. State your time and space complexity.

Approach
  1. Keep one FIFO deque of timestamps per provider. On each arrival at time t, pop from the front while front <= t - 900; the deque's size is then the window count at t, and the per-provider maximum is the running max of that size. Each timestamp is pushed once and popped once, so the work is amortised O(1) per event and O(n) overall.
  2. Exploit the given ordering: because the global stream is sorted by offered_at, each provider's subsequence inherits that order and no sort is needed. If the input were unsorted, sorting would dominate at O(n log n) and would also force the whole stream into memory, defeating the space bound.
  3. Bound memory by construction: a deque can only hold events from a 15-minute span, so total memory is the peak offer count in any 15 minutes rather than n. Evict a provider's entry entirely once its deque empties and no offer has arrived for a full window.
  4. Be explicit about the boundary. With (t - 900, t], two offers exactly 900 seconds apart are never in the window together. Use the same convention in this alert and in the enforcement path, or the alert fires on a count the limiter never observed.
  5. Say why rolling rather than tumbling. Fixed 15-minute calendar buckets split any burst straddling a boundary, so a 30-offer burst centred on the boundary reports as roughly 15 and 15 and never trips a threshold of 20 — which is precisely the pattern the check exists to find.
  6. If only the boolean 'did it ever exceed 20' is needed, a ring buffer of the last 20 timestamps per provider suffices: the threshold is breached exactly when t minus the oldest of the last 20 is less than 900. That is O(1) space per provider and loses the actual peak value.
Worked solution 20 min
  1. Take one provider with offsets in seconds from t0: 0, 100, 400, 850, 899, 900, 901, 1500, and a window of 900 seconds with the (t - 900, t] convention.
  2. Walk the arrivals, evicting the front while front <= t - 900, and record the deque size after each eviction pass.
  3. At t = 900 the eviction bound is 0, so the event at 0 is evicted (0 <= 0) and the count stays 5 rather than rising to 6.
  4. At t = 901 the bound is 1, nothing more is evicted, and the deque holds {100, 400, 850, 899, 900, 901}.
  5. At t = 1500 the bound is 600, so 100 and 400 are evicted and the deque holds {850, 899, 900, 901, 1500}.
  6. Recompute the same data with fixed tumbling buckets [0,900) and [900,1800) and compare.
EXPECTED RESULTThe maximum window count is 6, attained at t = 901 over the set {100, 400, 850, 899, 900, 901}. The sequence of counts is 1, 2, 3, 4, 5, 5, 6, 5. Tumbling buckets on the same data report 5 and 3, so a threshold of 6 would never fire.
Follow-up
  • Extend this to a 24-hour window over 200 million events — what breaks and what replaces the deque?
  • Events now arrive within seconds of real time and you must alert live; what does the restart story look like for this job?
  • A provider's device clock is three minutes fast and the client stamps the event — exactly where does that corrupt this computation?

For someone who has spent the last few years shipping features and reading other people's code, and who has not solved a timed problem from a blank file in a long time. Five days rebuild the primitives and the patterns that sit on them, working from invariants rather than remembered solutions, and the last two attach that back 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
01Rebuild the primitives by implementing them
  • Implement a dynamic array with doubling growth and an operation counter, then change the growth rule to add a fixed sixteen slots instead, and time both for n of ten thousand, a hundred thousand and a million. The fixed-increment version resizes n/16 times at O(n) each, so its total work is quadratic; doubling is what makes append amortised constant.
  • Implement a hash map with separate chaining and a load-factor resize, then insert ten thousand keys engineered to land in one bucket and record what happens to lookup time, so that average-case O(1) becomes a claim with a stated precondition rather than a reflex.
  • For dynamic-array append and hash-map insert, write down which cost is amortised rather than worst-case, which single operation pays the whole bill, and what a system with a hard per-operation deadline would have to do instead.

Deliverable: Two working implementations plus a timing table showing the input at which each structure's advertised complexity stops holding.

Practice prompt ↗Practice prompt ↗Practice prompt ↗Worked solution ↗
02Arrays under an invariant: two pointers, sliding window, binary search
  • Solve longest-subarray-with-sum-at-most-K using a sliding window, then run it on an input containing negative numbers and watch it return the wrong answer: extending the window only moves the sum monotonically when every element is non-negative, and that precondition is the whole reason the technique works.
  • Write the binary search that finds the first index satisfying a predicate rather than an exact value, put the loop invariant above the loop in a comment, and verify termination on the two inputs that break careless versions: the empty range, and a range where every element satisfies the predicate.
  • Compute the midpoint as lo + (hi - lo) / 2 and write one line on why the obvious (lo + hi) / 2 is a genuine defect in a fixed-width integer type and a non-issue in a language with arbitrary-precision integers.

Deliverable: Three solved problems, each with its invariant written above the loop, plus one recorded input on which the sliding window is provably wrong.

Practice prompt ↗Practice prompt ↗
03Sorting, heaps, and the greedy argument that has to be proved
  • Solve one top-k problem three ways, by full sort, by a size-k heap, and by quickselect, then write the values of n and k at which each becomes the right choice, along with quickselect's quadratic worst case and why a randomised pivot makes that unlikely rather than impossible.
  • Implement bottom-up heapify and count sift-down steps to confirm it does linear work rather than n log n, because most nodes sit near the bottom of the tree and therefore move only a short distance.
  • Take interval scheduling by earliest finishing time and write the exchange argument out in full: given any optimal schedule, swapping in the earliest-finishing interval keeps it feasible and no smaller. Then construct the weighted variant where that same greedy fails and name what has to replace it.

Deliverable: A three-way top-k comparison with measured crossover points, one written exchange argument, and one counterexample to a greedy rule that looks almost identical.

Practice prompt ↗Practice prompt ↗
04Recursion, memoisation, and the step to a table
  • Take one problem with overlapping subproblems, such as edit distance or coin change, instrument the plain recursion with a call counter to show the blow-up, then add memoisation and re-count.
  • Convert the memoised version to a bottom-up table and state the two properties you relied on: each subproblem's result depends only on its arguments, and the dependencies form a DAG you can enumerate in order.
  • Rewrite one deep recursion with an explicit stack, then find the input length at which the original hits the interpreter's frame limit, which defaults to about a thousand frames in CPython, so you know when the rewrite is required rather than decorative.

Deliverable: One problem in three forms, naive, memoised and tabulated, with call counts for each and the input length at which recursion depth becomes the binding constraint.

Practice prompt ↗Practice prompt ↗Worked solution ↗
05Graphs, where most of the work is choosing the traversal
  • Implement BFS and DFS over one adjacency list, then answer for each which finds a shortest path in an unweighted graph and which you would use to detect a cycle in a directed graph, including why the in-progress versus finished distinction matters for the second.
  • Implement topological sort by in-degree, feed it a graph containing a cycle, and confirm the failure signature is that fewer than V nodes come out rather than an exception, then note that the order it produces is one of several valid ones.
  • Run a shortest-path search on a graph with a single negative edge weight and show the wrong answer, then write the precondition Dijkstra actually needs, non-negative weights, because it finalises a node's distance the first time that node is popped, and name the algorithm you would switch to and its own limit.

Deliverable: A small graph library with BFS, DFS and topological sort, plus two inputs that produce documented wrong answers under the wrong algorithm choice.

Practice prompt ↗Practice prompt ↗
06One day for everything that is not an algorithm
  • Sketch one system only to the depth a coding-heavy loop tends to reach: the endpoints, what the service stores, and the single query pattern that decides the schema. Stop at twenty-five minutes.
  • Prepare the project answer for an interviewer who codes, which means rehearsing the two levels they push to: the specific thing you built, and why you chose that approach over the alternative they will name. Open with a number and be ready to say what it excludes.
  • Prepare the answer to what you would do differently, choosing a real technical mistake with a specific fix rather than a complaint about process or staffing.

Deliverable: One design sketch at endpoint-and-schema depth, plus a project answer rehearsed to two levels of follow-up.

Practice prompt ↗Practice prompt ↗
07Solve out loud, under time
  • Do three timed problems at twenty-five minutes each in a plain editor with no autocomplete and no execution until the end, then tally separately the failures that were syntax and the ones that were approach, because those two numbers call for different fixes.
  • Narrate one solution from the first sentence, stating the approach and its complexity before writing any code, and rehearse the sentence you will use when you realise mid-solution that the approach is wrong.
  • Re-solve from blank the two problems you were slowest on this week and compare the times against the day they first appeared.

Deliverable: A recording of one fully narrated solution and a tally that separates syntax failures from approach failures.

Practice prompt ↗Practice prompt ↗Worked solution ↗

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

Conflict answers where you were right and everyone came round are the weakest ones. Stronger: the evidence you went and collected, what would have changed your mind, and what you did in the weeks after the call went against you. Implementing a design you argued against, properly, is a specific and checkable behaviour.

Tell me about a time you had to deal with severe ambiguity in a projec…

medium
behavioural and engineering judgement

Tell me about a time you had to deal with severe ambiguity in a project requirements phase.

Approach
  1. Give the blast radius: what could have broken, and what you measured.
  2. Name the disagreement and how you resolved it with evidence.
  3. State the situation in two sentences and spend the rest on the reasoning.
Follow-up
  • How did you know your change caused the improvement?
  • What would you do differently if you ran that again?

Tell me about a complex project you delivered from conception to produ…

medium
behavioural and engineering judgement

Tell me about a complex project you delivered from conception to production, and what you learned from the experience.

Approach
  1. State the situation in two sentences and spend the rest on the reasoning.
  2. Name the disagreement and how you resolved it with evidence.
  3. Pick a story where you made the decision, not one where you watched it.
Follow-up
  • How did you know your change caused the improvement?
  • What would you do differently if you ran that again?

Shipping to a fixed date with debt you chose deliberately

medium
technical debtdeadline pressurerisk

Describe a launch where you knowingly shipped something wrong: position heartbeats written straight into the transactional database, a status transition without a version predicate, a payout job that was not idempotent per provider and period. State the date pressure and who set it, the exact shortcut, and the failure you were accepting. Then say what kept the debt visible - an alert with a threshold, a load ceiling that fails closed, a kill switch, a ticket with a named owner. Finish with whether it was ever repaid, and if not, why not.

Approach
  1. Make the shortcut specific enough to criticise. 'We took on tech debt' cannot be graded; 'we shipped without the incremental-authorisation path, so any fare that grew past the hold became an uncollectable receivable' is a decision with an edge someone can push on.
  2. Bound the exposure with arithmetic you held at the time, not in hindsight: what share of bookings could reach the case, the cost per occurrence, and the volume at which it stops being tolerable.
  3. Describe the containment, because containment is the whole difference between deliberate debt and negligence. An alert on the condition, a flag that disables the path, a hard cap that fails closed, or a written expiry date all qualify; a line in a retro does not.
  4. Report repayment truthfully, including the common real answer that it still runs today. Then say what would have to be true for that to be acceptable - usually that the exposure estimate is still valid at current volume, which is a thing you can check rather than assert.
  5. Name what you refused to cut and why the line sat there. Deadline answers are graded on where you stopped, not on how much you were willing to ship.
Follow-up
  • What did the alert actually fire on, and did anyone act the first time it fired?
  • What was the second thing you were asked to cut, and what made you refuse it?
  • If the date had moved by a week, which of those two decisions changes?
  • 01

    Tell me about a time you had to deal with severe ambiguity in a project requirements phase.

  • 02

    Tell me about a complex project you delivered from conception to production, and what you learned from the experience.

  • 03

    Describe a launch where you knowingly shipped something wrong: position heartbeats written straight into the transactional database, a status transition without a version predicate, a payout job that was not idempotent per provider and period. State the date pressure and who set it, the exact shortcut, and the failure you were accepting. Then say what kept the debt visible - an alert with a threshold, a load ceiling that fails closed, a kill switch, a ticket with a named owner. Finish with whether it was ever repaid, and if not, why not.

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

No. It is PracHub's own research and practice material for the Software Engineer 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 difficult are the coding interviews at Gopuff?

The coding rounds typically feature questions ranging from easy to medium difficulty on standard algorithms and data structures. Interviewers focus just as much on your communication, testing habits, and code clarity as they do on reaching the optimal solution.

PracHub interview research ↗
What programming languages are permitted during technical screens?

You can code in any language supported by standard collaborative coding platforms, including JavaScript/TypeScript, Python, Java, Go, and C++. Choose the language you are most fluent in to minimize syntax errors.

PracHub interview research ↗
How long does the typical interview process take from start to finish?

The entire process usually spans 2 to 4 weeks from your initial recruiter conversation through the technical screen and virtual onsite, though timelines can vary based on scheduling availability and team urgency.

PracHub interview research ↗
What is the culture like for engineering teams at Gopuff?

Engineering teams operate in a fast-paced, startup-adjacent environment that values autonomy, pragmatism, and rapid iteration. Teams are relatively flat, giving individual contributors significant ownership over their technical domain.

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.