Skip to content

Product Builder Interview Daily — 2026-09-26: Technical PM

Sep 26, 20261 min
TL;DRThe place Technical PM interviews most often expose a weak candidate is when they're asked how to roll out an API upgrade — they say 'write better docs' and can't name the real engineering cost of maintaining two schema versions, or how to buy migration time for customers without derailing the team's own roadmap. Today's practice question: a B2B API platform's core resource needs to change a single numeric field into a nested object to support multiple currencies, and the engineering lead wants to force the upgrade in the next release. The framework is the RFC process (Problem → Options → Decision → Cost) to put the technical decision on paper for review, paired with an Architecture Decision Record to preserve why a path was chosen and what was ruled out. The case study is Stripe's date-named API versioning system — monthly releases that are always backward compatible, and a named major release only twice a year that may include breaking changes (like 2026-08-26.dahlia) — which lets code written in 2012 still run today, not by avoiding breaking changes altogether, but by absorbing their cost internally instead of pushing it onto customers.

🌏 中文版

Today's Focus

The most common trap in Technical PM interviews is being asked "how would you roll out this API upgrade" or "what trade-offs does this system design involve" and only being able to say "I'd talk to engineering" — with nothing concrete behind it. Candidates can't name the process that would put the decision on record, and can't say who actually bears the cost of maintaining backward compatibility.

This topic matters in interviews because it tests whether you can understand the architectural consequences of a technical decision without writing the code yourself, and whether you can design a process that lets "why we decided this" still be traceable six months later — instead of living only in one engineer's memory. Amazon's PM-T technical-depth round says this explicitly: what interviewers want to see is whether a candidate can spot when a design is overly complex or limits future scalability, not whether they can draw the architecture diagram themselves.

Framework Cheat Sheet

The RFC Process (Request for Comments)

Before making a decision with architectural consequences, the team writes a document for stakeholders to review, instead of jumping straight into code:

StepContentHow to use it in an interview
ProblemWhere the current state breaks down, and why a decision is needed nowState clearly what happens if nothing changes, instead of jumping straight to the solution
OptionsAt least 2-3 viable paths, each with its own trade-offsAlways name the option you rejected and why — this is what shows you actually did the evaluation
DecisionWhich option was chosen and who signed offBe explicit about scope: what this decision covers, and what follow-up questions it deliberately leaves open
CostEngineering time, impact on existing users, how long it needs to be maintainedThis is the part interviewers listen for most — a technical decision with no cost estimate sounds like it skipped the homework

How to use it: When asked how you'd drive a contentious technical decision, don't just say "we'd discuss it in a meeting." Say you'd use an RFC to write out Problem → Options → Decision → Cost for engineering to review in writing, because a written document lets dissent surface early, instead of resurfacing halfway through implementation.

ADR (Architecture Decision Record)

The compact record left behind after an RFC is resolved — usually just three sections: Context (the constraints at the time), Decision (what was decided), and Consequences (what followed, good and bad).

How to use it: When asked how you'd make sure a new engineer understands a decision made six months ago, point out what makes an ADR different from ordinary meeting notes — it specifically records the options that were considered and rejected, so if someone later wants to re-propose the same idea, they can see why it wasn't chosen the first time instead of re-litigating it from scratch.

Today's Practice Question

The Question

"You're the Technical PM at a B2B API platform with over 300 enterprise integrations on your core API. Engineering has found that the cleanest way to support long-requested multi-currency support is to change the amount field on a core resource from a plain number into a nested {value, currency} object — a breaking change. The engineering lead wants to force the upgrade in the next release, arguing that maintaining two schema versions in parallel is too painful, and most customers will need to upgrade eventually anyway. As the PM, how do you decide how this breaking change ships?"

(Source: original, scenario informed by Stripe's public API versioning documentation and engineering blog posts)

Breaking It Down

  1. Clarify the problem: First ask engineering — could an additive approach (add a new field, keep the old one) work instead? If it truly can't, ask what share of existing customers would be affected, and whether those customers have the engineering resources to migrate on their own.
  2. Define the users: Split customers into at least two groups — large enterprise customers with dedicated engineering teams maintaining the integration, and smaller developer teams who wired up the integration once and rarely revisit it. The plan can't assume everyone can migrate in the same window.
  3. Structure the analysis: Run it through an RFC — Problem (the current schema can't express currency), Options (A. overwrite as a breaking change, B. add a parallel field, C. version the API so old and new customers each stay pinned to their own version), and Decision plus Cost for each (long-term maintenance cost for engineering, migration cost for customers). Write the final choice and the rejected options into an ADR so it's legible to whoever joins the team six months from now.
  4. Propose the plan: Choose API versioning over an outright overwrite — existing customers default to staying on the version they integrated against, new customers default to the new version, and you ship a migration guide plus tooling alongside it. This puts the cost of maintaining multiple versions on the platform side, instead of forcing a breaking change onto customers who didn't ask for one right now.
  5. Define success: The primary metric is the share of customers who proactively migrate to the new version, and whether support tickets spike during the migration window. The guardrail metric is whether error rates or latency on the old version degrade because of the cost of maintaining multiple versions — because if a versioning strategy tanks reliability, the damage to customers ends up worse than a one-time breaking change would have been.

A Sample Answer (What You'd Actually Say in the Room)

Framing the problem: "I'd first confirm there's really no additive path — if adding an amount_details field while keeping the old amount field around gets us the same result, we don't need a breaking change at all. Assuming engineering confirms it genuinely can't work, I'd next look at how many of the 300 customers maintain their integration with their own engineering team versus how many are small teams that wired it up once and rarely come back to it, because that determines whether we can force everyone to switch on the same date."

Structured analysis and plan: "I'd write an RFC laying out three options — overwrite outright, run old and new fields in parallel, or version the API — each with its long-term maintenance cost for engineering and its migration cost for customers. I'd choose API versioning: existing customers default to staying on the version they integrated against, new customers get the new schema, backed by a migration guide and tooling. The difference from an outright overwrite is that we're absorbing the cost of maintaining multiple versions on our own side instead of pushing a breaking change onto customers — that's the core judgment call I noticed in how Stripe's versioning system is designed, when I was prepping for this question. Once decided, I'd write it up as an ADR, recording why we ruled out the overwrite option, so an engineer joining six months from now doesn't have to relitigate it."

Defining success: "I'd track the share of customers who proactively migrate to the new version, and whether support tickets spike during the migration window, so we actually know customers can migrate smoothly rather than just assuming our docs were clear enough. But I'd also watch the guardrail metric — whether the old version's error rate or latency degrades because we're maintaining two schemas at once — because if the versioning strategy tanks reliability, the damage to customers ends up worse than a one-time breaking change would have been."

Self-Check List

Use this table to check whether your answer covers the key points:

Check itemCovered?
Confirmed whether an additive approach could avoid the breaking change, instead of accepting engineering's framing at face value
Distinguished between customers with dedicated engineering resources and those without, instead of assuming everyone can migrate at once
Used an RFC to lay out options and their costs, instead of jumping straight to one plan
Mentioned using an ADR to preserve the decision for future reference and onboarding
Success metrics cover both migration progress and a reliability guardrail
Bonus: mentioned putting the maintenance cost on the platform side rather than passing it to customers

Today's Case

Stripe: date-named versions that let code written in 2012 still run today

Stripe's API versioning system is the counterexample to "avoid breaking changes altogether." Starting with the 2024-09-30 (acacia) release, Stripe ships a new API version every month, guaranteed fully backward compatible — customers don't need to change any code to upgrade safely. What can actually contain breaking changes is a named major release issued only twice a year (2025's Basil, and the current 2026-08-26.dahlia). Each customer account stays pinned to the version it integrated against, and unless they actively opt in, requests and webhooks keep being processed exactly as that version defines — Stripe has written publicly that it deliberately does not auto-upgrade customers, because a poorly communicated automatic upgrade could break a customer's payment integration outright. When the EU's Strong Customer Authentication rules landed and the old charge object couldn't express "this transaction requires asynchronous multi-step verification," Stripe didn't patch the old object — it designed a new PaymentIntents primitive to model the new business reality directly, then shipped migration tooling and guides alongside it. That's the cost of maintaining compatibility, carried concretely by Stripe's own engineering org.

Interview payoff: This case is the real-world counterpart to the "should a B2B API platform force a breaking change" scenario above. It's a direct answer to "give an example of API design you think was done well," and it's a good check on whether your own answer missed anything — especially "who bears the cost of a breaking change" and "model the new business reality with a new primitive instead of forcing it into the old object," which is exactly the part of the RFC's Cost column candidates tend to gloss over.

Further Reading

References