cswork / libraryOpen practice workspace

Interview guides · CashKaro

CashKaro Software Engineer Interview Guide

CashKaro Software Engineer interview guide: reported rounds, questions and how candidates describe the process.

The 60-second brief

As a Software Engineer at CashKaro, you are at the heart of India’s leading cashback and coupons platform. This role is critical to the company’s mission of delivering seamless, high-performance digital experiences to millions of users. You will be responsible for building, scaling, and maintaining the robust systems that power our affiliate marketing ecosystem, ensuring that every transaction is tracked accurately and every user interaction is optimized for speed and reliability. The work here is fast-paced and highly impactful. Whether you are working on our MERN Stack infrastructure, developing high-performance APIs in Rust, or optimizing our DevOps pipelines on AWS, your contributions directly influence the company’s bottom line and user retention.

This guide is scoped to a Software Engineer candidate at CashKaro.

Focus areas

  • JavaScript (MERN Stack)
  • Full-Stack Web Development
  • AWS (Cloud Infrastructure)

The CashKaro interview process

CashKaro candidates report 3 rounds over 3-5 weeks. The stages below are what candidates describe, not a published process.

HR Screening

Initial screening to understand your background and alignment with the role.

What to demonstrate

  • Initial screening to understand your background and alignment with the role
  • Depth in JavaScript (MERN Stack)

How to prepare

  • Be able to walk your CV end to end in two minutes, and say why this company specifically.
  • Have your salary expectations, notice period and location constraints ready, and ask for the rest of the loop in writing.

Technical Assessments

Includes live coding, written tests, or project-based assignments.

What to demonstrate

  • Includes live coding, written tests, or project-based assignments
  • Depth in JavaScript (MERN Stack)

How to prepare

  • Answer aloud and timed: Describe your process for debugging a complex issue in a production environment.
  • Answer aloud and timed: What are the primary differences between various data structures, and when should you choose one over another?

Deep-Dive Technical Rounds

Involves interactions with multiple team members to discuss your expertise in depth.

What to demonstrate

  • Involves interactions with multiple team members to discuss your expertise in depth
  • Depth in JavaScript (MERN Stack)

How to prepare

  • Answer aloud and timed: Walk through the process of building a RESTful API using Node.js and Express.
  • Answer aloud and timed: How do you manage state and side effects in a React application?

Where candidates lose points

Clarify early

If a question seems ambiguous, ask for clarification before starting. This shows you value precision and want to solve the right problem.

Practice your "why

Be ready to explain why you chose a specific technology or architectural pattern in your past projects.

Be ready for live coding

Practice writing code on a whiteboard or a shared editor without an IDE to ensure you are comfortable with syntax.

Communicate your thought process

Even if you are stuck, talk through your reasoning. Interviewers often look for how you approach a problem more than the perfect final answer.

Questions & practice

Explain the core concepts of programming including data types and memory management.

Medium · Technical & Core Programming

Approach

  1. Say what the runtime actually does before reasoning about the code.
  2. Name what is shared across threads and what owns each piece of state.
  3. Identify the window where an invariant is briefly untrue.
  4. Distinguish a value from a reference to it, and say which one you handed out.

Follow-up

  • What happens if two callers reach this at the same time?
  • Where could this allocate more than you expect?

Solve the provided data structure or algorithmic challenge within the allotted time.

Medium · Problem Solving & Logic

Approach

  1. Restate the input: its shape, its size, and what is guaranteed about it.
  2. Name the brute-force solution and its complexity before improving on it.
  3. Choose the data structure from the access pattern, not from familiarity.
  4. State the target complexity and say which constraint rules the naive version out.

Follow-up

  • How does this change if the input no longer fits in memory?
  • What is the worst case, and how likely is it on real data?

Describe how you would approach building a specific feature, from requirement gathering to deployment.

Medium · Problem Solving & Logic

Approach

  1. Restate the input: its shape, its size, and what is guaranteed about it.
  2. Name the brute-force solution and its complexity before improving on it.
  3. Choose the data structure from the access pattern, not from familiarity.
  4. State the target complexity and say which constraint rules the naive version out.

Follow-up

  • How does this change if the input no longer fits in memory?
  • What is the worst case, and how likely is it on real data?

How do you break down a complex requirement into actionable technical tasks?

Medium · Problem Solving & Logic

Approach

  1. Restate the input: its shape, its size, and what is guaranteed about it.
  2. Name the brute-force solution and its complexity before improving on it.
  3. Choose the data structure from the access pattern, not from familiarity.
  4. State the target complexity and say which constraint rules the naive version out.

Follow-up

  • How does this change if the input no longer fits in memory?
  • What is the worst case, and how likely is it on real data?

Explain your strategy for database schema design in MongoDB to ensure optimal query performance.

Medium · MERN Stack & Web Development

Approach

  1. Name the grain you start from and join outward from it.
  2. Check whether any join is one-to-many before aggregating, or the sums inflate.
  3. Say which index the query would use, and what makes it unusable.
  4. Handle the rows that do not match: that is usually the actual question.

Follow-up

  • How does the query change if that join becomes one-to-many?
  • What happens to this when the table is ten times larger?

Denormalise tenant onto revisions and backfill it live

Hard · denormalisation · online migration · backfill

resource_revision (revision_id, resource_id, version, actor_user_id, change_kind, patch, request_id, created_at) has 400M rows and no tenant column; tenant_id lives only on resource. Two reads need it: a tenant-scoped audit feed ordered by created_at DESC, and an offboarding purge. Both join back to resource today. Justify adding tenant_id to resource_revision against those two reads, name the anomaly the copy introduces and the constraint that prevents it, then give the ordered migration for a live table taking 1.2k writes/second — the lock each step takes, how the backfill is batched, and where each step stops being reversible. PostgreSQL 16.

Approach

  1. Justify from the access path rather than from taste. Without the column, the audit feed either scans resource_revision by created_at and discards other tenants' rows, or resolves the tenant's resource_ids first and probes with them — both proportional to the tenant's whole history rather than to one page. With (tenant_id, created_at DESC, revision_id DESC) it is a seek that stops at 50 rows, and the purge becomes a ranged delete instead of a join.
  2. Name the cost exactly: a second copy of a fact can disagree with the first. Make the disagreement unwritable rather than documented — add UNIQUE (resource_id, tenant_id) on resource so it can serve as a foreign-key target, then FOREIGN KEY (resource_id, tenant_id) REFERENCES resource (resource_id, tenant_id) on the revision table. A revision can then only ever carry its parent's tenant.
  3. Step one, expand: ALTER TABLE resource_revision ADD COLUMN tenant_id BIGINT NULL, with no default, so it is a catalogue change and no rewrite. It still needs ACCESS EXCLUSIVE for an instant, and that instant queues behind the longest open transaction on the table while every later query queues behind it — set lock_timeout to 2s and retry rather than wait.
  4. Step two, dual-write: deploy the writer that populates tenant_id on every new revision while reads still use the join. Reversible by redeploying the previous build, because nothing reads the column yet.

Follow-up

  • The backfill is half finished and a rollback is required. What state is the table in, and what does the previous build do with a half-populated column?
  • How do you verify the backfill actually finished, given rows are still being inserted while it runs?

How do you implement efficient loops and conditional logic in your daily development?

Medium · Technical & Core Programming

Approach

  1. Clarify what is being asked and what a complete answer contains.
  2. State your assumptions explicitly before working the problem.
  3. Say what you would check first and why it is the highest-information step.
  4. Work from the requirement backwards to the design.

Follow-up

  • What assumption would you test first?
  • How would you know your answer was wrong?

What are the primary differences between various data structures, and when should you choose one over another?

Medium · Technical & Core Programming

Approach

  1. Clarify what is being asked and what a complete answer contains.
  2. State your assumptions explicitly before working the problem.
  3. Say what you would check first and why it is the highest-information step.
  4. Work from the requirement backwards to the design.

Follow-up

  • What assumption would you test first?
  • How would you know your answer was wrong?

Walk through the process of building a RESTful API using Node.js and Express.

Medium · MERN Stack & Web Development

Approach

  1. Say who the caller is and what they do when the call fails halfway.
  2. Define the identity of a request so a retry cannot double-apply it.
  3. Separate accepted, pending, failed and confirmed; they are different facts.
  4. Design the error taxonomy before the success shape; callers branch on it.

Follow-up

  • What happens if the caller retries after a timeout?
  • How does a client discover it is on an old version of this contract?

How do you manage state and side effects in a React application?

Medium · MERN Stack & Web Development

Approach

  1. Clarify what is being asked and what a complete answer contains.
  2. State your assumptions explicitly before working the problem.
  3. Say what you would check first and why it is the highest-information step.
  4. Work from the requirement backwards to the design.

Follow-up

  • What assumption would you test first?
  • How would you know your answer was wrong?

What security best practices do you follow when handling user authentication and data persistence?

Medium · MERN Stack & Web Development

Approach

  1. Clarify what is being asked and what a complete answer contains.
  2. State your assumptions explicitly before working the problem.
  3. Say what you would check first and why it is the highest-information step.
  4. Work from the requirement backwards to the design.

Follow-up

  • What assumption would you test first?
  • How would you know your answer was wrong?

Describe your process for debugging a complex issue in a production environment.

Medium · Technical & Core Programming

Approach

  1. Establish what changed and when, before forming any theory.
  2. Pick a bisection that eliminates candidates whichever way it turns out.
  3. Check the instrumentation before believing the symptom.
  4. Separate the trigger from the cause; the deploy is rarely the bug.

Follow-up

  • What would you look at first, and what would it rule out?
  • How would you tell a cause from a coincidence here?

Suggested practice checklist

Built from the rounds and topics CashKaro candidates report.

Day 1 — Map the CashKaro loop

  • Write out the reported sequence: HR Screening, Technical Assessments, Deep-Dive Technical Rounds.
  • For each round, write one sentence on what it is judging, from the description above, and mark the one you are least ready for.

Deliverable: A one-page map of the 3 reported rounds, with the weakest marked.

Day 2 — Work JavaScript (MERN Stack)

  • Spend the session on JavaScript (MERN Stack), which CashKaro candidates report being tested on.
  • Write one worked example in JavaScript (MERN Stack) and time yourself on it.

Deliverable: One timed worked example in JavaScript (MERN Stack).

Day 3 — Work Full-Stack Web Development

  • Spend the session on Full-Stack Web Development, which CashKaro candidates report being tested on.
  • Write one worked example in Full-Stack Web Development and time yourself on it.

Deliverable: One timed worked example in Full-Stack Web Development.

Day 4 — Work AWS (Cloud Infrastructure)

  • Spend the session on AWS (Cloud Infrastructure), which CashKaro candidates report being tested on.
  • Write one worked example in AWS (Cloud Infrastructure) and time yourself on it.

Deliverable: One timed worked example in AWS (Cloud Infrastructure).

Day 5 — Answer out loud: Technical & Core Programming

  • Answer aloud, timed: Explain the core concepts of programming including data types and memory management.
  • Answer aloud, timed: How do you implement efficient loops and conditional logic in your daily development?

Deliverable: Spoken answers to 2 reported Technical & Core Programming question(s), under time.

Day 6 — Answer out loud: MERN Stack & Web Development

  • Answer aloud, timed: Walk through the process of building a RESTful API using Node.js and Express.
  • Answer aloud, timed: How do you manage state and side effects in a React application?

Deliverable: Spoken answers to 2 reported MERN Stack & Web Development question(s), under time.

Day 7 — Answer out loud: Problem Solving & Logic

  • Answer aloud, timed: Solve the provided data structure or algorithmic challenge within the allotted time.
  • Answer aloud, timed: Describe how you would approach building a specific feature, from requirement gathering to deployment.

Deliverable: Spoken answers to 2 reported Problem Solving & Logic question(s), under time.

Behavioural preparation

Behavioural rounds judge the decision you made and what it cost.

Turn a code review disagreement into a decision

Easy · code review · optimistic concurrency · communication

A colleague's change updates a row with UPDATE resource SET version = version + 1 WHERE resource_id = $1 AND version = $2 and treats an affected-row count of zero as a successful no-op. You read that as a silently lost update; they think returning 200 is friendlier to clients than returning a conflict. Describe how you have handled a review disagreement of this shape: what goes in the comment, when you leave the thread, and who decides. Then write the comment you would leave here, in under 80 words.

Approach

  1. Sort the disagreement before writing anything. A silently discarded write is a correctness claim about data; the choice between 409 and 412 is taste. Only the first justifies blocking a merge, and saying which one you are doing is most of the value of the comment.
  2. Make the claim reproducible in the comment itself with an interleaving rather than a principle: A reads version 7, B reads version 7, B commits version 8, A's predicate matches zero rows, A is told it succeeded and A's edit is gone.
  3. Offer the alternative with its cost attached: return 409 carrying the current version and the revision that won, so the client can re-read and re-apply. Note that automatic retry is not the fix, because a retry re-reads the winner's state and reapplies an intent formed against data that no longer exists.
  4. Apply an escalation rule you can state: two round trips on the thread, then a call, and the service's owner decides rather than the reviewer. A reviewer who cannot be overruled is a bottleneck with extra steps.

Follow-up

  • Where would you put the test that fails if someone reintroduces the swallowed zero rowcount?
  • The author says clients cannot handle a 409. How do you check whether that is true?

Tell callers you do not own that their integration breaks

Medium · deprecation · compatibility · stakeholders

A field in a write endpoint's response must change shape. You own the endpoint; you do not own the four internal callers or the outbound webhook consumers who read it. Describe a deprecation you were responsible for: what you shipped first, how you established who was actually reading the field, the window you gave and what set its length, what you did about the consumer who never moved, and how you decided removal was safe. Name the signal you used, not the announcement you sent.

Approach

  1. Establish the reader set empirically rather than from a wiki of owners: per-field usage counters keyed by principal, or access logs attributed to a consumer. State the blind spot of whichever you pick, since a consumer that reads the field only on a monthly job will not appear in a week of logs.
  2. Ship additive first. Populate the new field alongside the old one so no reader is forced to move, which is also what keeps a rolling deploy safe, because old and new instances answer the same requests at the same time and a rollback must still find the old shape present.
  3. Set the window from the slowest legitimate consumer's release cadence, not from your calendar, and decide separately what to do for a consumer with no release process at all, such as an external webhook endpoint you can only email.
  4. Convert silence into evidence before you rely on it: a short, low-traffic removal window that makes a still-dependent consumer fail visibly and loudly while you are watching, rather than at three in the morning after you have moved on.

Follow-up

  • How would you detect a consumer that reads the field only during a monthly export?
  • One caller refuses to move and has a commercial relationship behind it. What changes in your plan and what does not?

Reverse your own decision and price the reversal

Medium · reversibility · measurement · migrations

Describe a technical decision you made and later reversed. Pick one that cost something: a service you split and merged back, a cache you added and removed, an index you created that pushed the planner onto a worse plan, a projection you rebuilt from scratch. State what you believed when you decided, the measurement that changed your mind, how long the wrong version ran in production, and what the reversal cost in migrations, dual writes, and a deprecation window for callers you did not own.

Approach

  1. State the original rationale without irony, in the version you would still defend given what was known then. If it is not defensible, the story is about carelessness rather than judgement, and a different example serves you better.
  2. Give the measurement that moved with a before and after: the p99 that did not improve, the cache hit rate that sat at 40%, the plan that flipped to a sequential scan once the table passed a size you can name.
  3. Cost the reversal in steps, not adjectives: expand-and-contract deploys, the dual-write window, the callers who had to be notified, the rows already written in the wrong shape that had to be backfilled or abandoned.
  4. Distinguish reversal from rewrite by naming what you kept. Most good reversals preserve the schema or the interface and undo one decision inside it, which is also why they were affordable.

Follow-up

  • What in that decision was irreversible, and did you know it was irreversible when you made it?
  • How did you tell the people who had already built on top of the original decision?