Clearstory · Software Engineer
Updated · 2026-10-02

Clearstory Software Engineer
Interview Guide

THE 60-SECOND BRIEF

Clearstory sells SaaS to commercial construction teams for managing change orders, the documented changes to agreed work that otherwise move through paper and manual hand-offs. Candidates describe the engineering work as building and maintaining product features, including features that connect Clearstory with other construction software (an Integrations team is mentioned), working with product managers on customer needs, taking part in code reviews, and using AI tools in daily development. The company is described as a Series B business with SOC 2 compliance in the picture.

This guide is for candidates interviewing for a Software Engineer role at Clearstory, junior or senior. It covers the three reported rounds, the stack candidates list (React, TypeScript, SQL, Git, CI/CD, and a backend language such as Node.js or Golang), the reported technical and behavioral questions, and a seven-day plan. It does not state pay, and it does not assign specific questions to specific rounds, because candidates do not report that mapping.

Candidates report three rounds over roughly 3-5 weeks: a Recruiter Screen, a Technical Assessment that may be a take-home or a live coding and system design session, and Cross-Functional Interviews with partners and leadership.

Full-stack developmentIntegrations engineeringTypeScript

29 min read

Browse Software Engineer questions

See the practice prompts

13Practice promptsAcross five skill areas

The reported question set splits into two halves. The technical half is about integration and full-stack judgment: designing an integration with third-party construction software, choosing between a RESTful API and pub/sub messaging, keeping relational data consistent, and debugging a production problem. The behavioral half is about code review, feedback, learning quickly, balancing speed against quality and SOC 2, and taking ownership beyond your assigned work. Candidates also list scenarios such as handling sync problems when an external API is down and monitoring the health of an integration service.

Because the product connects construction teams and external systems, integration questions reward answers that go past the happy path. Practise saying what happens on timeout, duplicate delivery, partial failure, schema change and a long outage of the other side, and how you would see each of those in logs, metrics and alerts. For the full-stack side, candidates report React and TypeScript topics (state, asynchronous operations, reusable components) and SQL schema design and query optimization, so be ready to talk through a feature from the UI component to the endpoint to the table.

Candidates also report that the stated values (Be Curious, Customer Obsession, Keep It Simple) matter alongside technical skill, and that clear explanation to non-technical stakeholders is part of the role. Learn what a change order is in construction so you can use the customer's vocabulary, prefer the simplest design that works and say what you would add later, and prepare a concrete account of how you use AI coding assistants and how you verify what they produce.

01

Recruiter Screen

reported

Candidates report an initial conversation with a recruiter or hiring manager to check fit for the role. Treat it as the first chance to show you understand what you are applying to: a company building SaaS for construction change orders, with a React, TypeScript and SQL stack. Prepare a short account of your background that lands on the work this role does, and a clear reason for choosing this company and this domain.

What to demonstrate

  • Whether your background lines up with the React, TypeScript and SQL requirements candidates describe
  • How clearly you explain your experience and your reasons for applying
  • Whether you can talk about the product and its customers in plain language

How to prepare

  • Write a short career summary that ends on full-stack or integration work you have shipped, and rehearse it aloud
  • Learn the basics of a construction change order so you can say why digitizing it matters, in your own words
  • Be ready to name your strongest backend language (Node.js, Golang or another) and a React and TypeScript project you can describe in detail
  • Ask the recruiter whether the technical assessment is a take-home or live, and what the cross-functional stage involves
Clearstory Software Engineer candidate reports ↗
02

Technical Assessment

reported

Candidates report that this stage includes a take-home assignment or a live coding and system design session. The reported evaluation areas point to three things to prepare: React and TypeScript for the frontend (state, asynchronous operations, reusable components), SQL schema design and query optimization, and integration design with pub/sub messaging, ETL-style data transformation and error handling when an external API is down. Prepare for both formats: for a take-home, ship something small, tested and explained; for a live session, think aloud and start with the simplest design.

What to demonstrate

  • Working, readable code in TypeScript or your backend language
  • Integration design: retries, idempotency, failure handling and monitoring of a service that talks to external APIs
  • SQL schema design, data consistency and query performance
  • How you break a large ambiguous problem into smaller tasks and keep the solution simple

How to prepare

  • Build a small React component in TypeScript that fetches data, handles loading and error states, cancels stale requests and is reusable
  • Practise the integration design question and the REST versus pub/sub trade-offs aloud, covering duplicates, ordering, backoff and a dead-letter path
  • Work the reviewed practice drills on collapsing redelivered event batches, a rolling failure rate per destination and keyset paging
  • Write down how you would test a feature before it reaches production, from unit tests to the CI pipeline
Clearstory Software Engineer candidate reports ↗
03

Cross-Functional Interviews

reported

Candidates report meetings with cross-functional partners and leadership, described as a check on cultural alignment and long-term potential. The reported values are Be Curious, Customer Obsession and Keep It Simple, and candidates also report that explaining technical decisions to non-technical people is part of the job. The behavioral questions candidates report (code review, critical feedback, learning quickly, speed versus quality and SOC 2, taking ownership) fit this format, so prepare stories with real decisions and results.

What to demonstrate

  • Collaboration with product managers and other non-engineering partners
  • Alignment with the reported values: curiosity, customer focus and simplicity
  • Ownership, learning speed and how you take feedback
  • How you balance delivery speed with reliability and security expectations

How to prepare

  • Prepare one story per reported behavioral question and note which value each one shows best
  • Practise explaining a technical trade-off, such as REST versus pub/sub, to someone who does not write code
  • Prepare an honest account of how you use AI coding tools and what you check before accepting their output
  • Write two or three questions about the team's technical challenges and how code review works alongside AI-assisted development
Clearstory Software Engineer candidate reports ↗

PracHub editorial advice for the preparation topics above.

01

Describing an integration or pub/sub design only for the case where the third-party API responds quickly and correctly

Walk through the failure path: timeout, duplicate delivery, out-of-order events, a long outage of the other side. Name idempotency keys, retry with backoff, a dead-letter queue, a reconciliation job, and the logs, metrics and alerts that show the integration is healthy.

02

Answering the data consistency question with only "use transactions"

Name the tools: constraints and foreign keys, unique indexes, transaction boundaries and isolation level, optimistic versions or row locks for concurrent updates, and idempotent writes. Then give one example, such as two users approving the same change order.

03

Over-engineering a design when a simple, maintainable approach would meet the need

Start with the plainest design, say what it handles and what it does not, and name the specific load or failure that would make you add a queue, cache or extra service.

04

Telling behavioral stories in plural pronouns with no decision of your own, or with no result

For each story, state your own action, the alternatives you rejected and a result you can point to. Rehearse one story per reported behavioral question, with the value it shows.

05

Giving a vague or uncritical answer about AI coding tools, or avoiding the topic

Prepare a specific workflow: what you ask an assistant to do, what you never paste in, and how you check the output (read it, run tests, review it like a colleague's pull request).

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

8 technical prompts0 include a worked solution

Archive a resource graph without breaking live references or recursing

medium
graph traversaltopological ordertenant isolation

Resources reference other resources within a tenant; for the largest tenant the reference table holds up to 2,000,000 nodes and 8,000,000 edges. Archiving a resource must archive everything reachable from it that nothing outside the set still references, refuse when a live external referrer exists, and terminate when references form cycles, which they legitimately do. Produce the archive order and the refusal list, targeting O(V+E). Say what stops the traversal crossing a tenant boundary, and why recursion is the wrong control structure at this size.

Approach
  1. Load the subgraph with the tenant predicate on both endpoints of the edge, not only on the side you started from. Scoping the left table alone is the classic cross-tenant leak: one mis-entered edge then pulls another tenant's resources into the traversal and, worse, into the archive.
  2. Traverse iteratively with an explicit stack. A 2,000,000-node graph can hold a chain deep enough to exhaust a native stack in the low tens of thousands of frames, and that failure is a process crash rather than an error you can return.
  3. Treat cycles as data rather than corruption: compute strongly connected components with Tarjan in O(V+E) using its own explicit stack, then condense. The condensation is a DAG, so a topological order over it gives the archive order, and every member of a component archives in one transaction because no order within a cycle is valid.
  4. Decide refusals with reverse edges. A candidate is archivable only if every in-edge originates inside the candidate set, so build the transpose or count in-degrees restricted to the visited set, and emit each blocked resource with the id of the external referrer, which is the only part of the answer an operator can act on.
Follow-up
  • The graph is read in one query and the archive writes a minute later. What can change in between, and how do you make the write safe?
  • The candidate set is 400,000 resources. Is that one transaction, and if not, what does a half-finished archive look like to a reader?

Collapse a redelivered event batch into per-aggregate high-water marks

easy
hashingat-least-onceaggregation

You drain a batch of up to 5,000,000 events, each (aggregate_id BIGINT, aggregate_version INT, event_type, payload). The log guarantees order within one aggregate only; the batch merges 64 partitions, and a relay failover has redelivered a range, so an older version for an aggregate can appear after a newer one. Given a map of last_applied_version per aggregate, produce the events worth applying, at most one per (aggregate_id, version), plus the count discarded. Target O(n) time. State the memory for 2,000,000 distinct aggregates and what you do when it does not fit.

Approach
  1. One pass, one hash map from aggregate_id to the highest version kept, and a discard counter. An event whose version is at or below last_applied_version for its aggregate is dropped without further work, which is the whole reason the event carries its version rather than a delta. O(n) expected time, O(d) space in distinct aggregates.
  2. Keep the maximum, never the last occurrence. The redelivered range means the final appearance of an aggregate in the batch can be an older version than one seen earlier in the same batch, so last-wins applies stale state over newer state and the projection regresses with no error anywhere.
  3. Cost the memory instead of calling it large: an 8-byte key plus a 4-byte version is 12 bytes of payload, and an open-addressed table held at a 0.7 load factor costs roughly 17 bytes per entry before per-slot metadata, so 2,000,000 aggregates is tens of megabytes in a native layout and several times that in a runtime that boxes both key and value.
  4. If the distinct set exceeds memory, partition on hash(aggregate_id) mod P and reduce each partition independently. Every event for one aggregate hashes to the same partition, so the per-partition result is exact and the merge is concatenation rather than a second reduction.
Follow-up
  • The payload is a patch rather than a snapshot, so applying only the highest version loses the intermediate changes. What changes in your reduction?
  • How do you detect that version 7 arrived while version 6 was never delivered, and what should the consumer do about the gap?

Track a rolling failure rate per destination for circuit decisions

easy
sliding windowring buffercircuit breaker

The egress service delivers about 1,500 webhooks per second across roughly 40,000 destinations, each call bounded by a 10 second timeout. Maintain, per destination, the failure rate over the trailing 60 seconds so a caller can ask before dispatch whether the circuit should open. Attempts arrive as (destination_id, finished_at_ms, outcome). Requirement: amortised O(1) per attempt, with total memory bounded by the destination count rather than by traffic. Give the structure, its exact memory, and the rule that stops a destination with three attempts from opening a circuit.

Approach
  1. Name the exact-deque version and then reject it as the default. Holding timestamps and advancing a tail pointer past anything older than now minus 60 seconds is a correct two-pointer window at amortised O(1) per attempt, but its memory tracks in-window traffic, so one destination in a retry storm holds hundreds of thousands of entries while thousands of quiet destinations hold none.
  2. Use a ring of 60 one-second buckets per destination, each bucket a pair of counters for attempts and failures. On an attempt, advance the ring by the elapsed whole seconds, zeroing at most min(elapsed, 60) buckets, then increment the head. That is amortised O(1) with a fixed footprint per destination.
  3. State the footprint: 60 buckets times two 4-byte counters is 480 bytes of payload per destination, so 40,000 destinations is roughly 20 to 25 MB with per-entry overhead, bounded by the catalogue rather than by the rate. The cost is granularity, since the oldest bucket ages out in whole seconds, which is far tighter than the decision needs.
  4. Require a minimum sample before the circuit may open. A destination with three attempts and three failures reads as 100 percent and is not evidence; a floor of roughly 20 attempts in the window makes the ratio meaningful, and below that floor use a run of consecutive failures as the trigger instead.
Follow-up
  • The fleet is 30 instances and each sees roughly a thirtieth of a destination's traffic. Where does the rate actually live, and what does a per-instance answer get wrong?
  • A destination answers in 9.5 seconds and succeeds. It is not failing but it is consuming your per-destination concurrency. What signal should open the circuit here?

The plan follows the three reported rounds and the stack candidates list: it starts with the domain, moves through TypeScript and React, SQL, and integration design, then covers debugging and code review, behavioral stories and a final full run.

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
01Map the loop and learn the domain
  • Write the three reported rounds on one page: Recruiter Screen, Technical Assessment (take-home or live coding and system design) and Cross-Functional Interviews, and mark the one you are least ready for.
  • Read general construction sources on change orders and write a plain-language explanation of how one moves from request to approval.
  • Write your short career summary and your reasons for this company and domain.

Deliverable: A one-page loop map, a plain-language change order explanation, and a rehearsed career summary.

02TypeScript and React drills
  • Build a small TypeScript React component that loads a list, shows loading and error states, cancels a stale request and is reusable.
  • Add typed props and a small test, and write down how you would manage state if two components needed the same data.
  • Explain aloud how you would add a feature needing both a UI change and a new backend endpoint.

Deliverable: A working typed component with a test, and a spoken outline of a full-stack feature.

03SQL schema and consistency
  • Design tables for change orders, approvals and line items with keys, constraints and indexes, and write the transaction for approving one.
  • Answer aloud how you keep data consistent under concurrent updates.
  • Work the keyset paging practice drill and compare it with offset paging.

Deliverable: A schema with constraints, an approval transaction, a spoken consistency answer and a completed paging drill.

Practice prompt ↗Practice prompt ↗
04Integration design
  • Outline a design for integrating with third-party construction software: data flow, retries, idempotency, error handling and monitoring.
  • Write a one-page comparison of REST and pub/sub covering coupling, delivery guarantees, ordering and failure behavior.
  • Work the practice drills on redelivered event batches and the rolling failure rate per destination.

Deliverable: An integration design outline, a REST versus pub/sub comparison and two completed drills.

Practice prompt ↗Practice prompt ↗Practice prompt ↗Practice prompt ↗
05Production debugging and code review
  • Write one production debugging story as a sequence: symptom, what changed, hypotheses, evidence, fix and prevention.
  • Write your code review checklist with blocking, suggestion and nit levels, and apply it to a pull request of your own.
  • Work the practice drill on archiving a resource graph without recursion.

Deliverable: A debugging story, a code review checklist applied to a real change, and a completed graph drill.

Practice prompt ↗Practice prompt ↗Practice prompt ↗
06Behavioral stories
  • Write stories for critical feedback on code, learning a tool quickly, and ownership beyond your assignment, each with your decision and a result.
  • Write the speed versus quality and SOC 2 answer with your non-negotiables and one scope-cutting example.
  • Write a short account of how you use AI coding tools and verify their output.

Deliverable: Four written stories, each tagged with a value (curiosity, customer focus or simplicity), and an AI workflow summary.

Practice prompt ↗Practice prompt ↗Practice prompt ↗Practice prompt ↗
07Full dry run
  • Run a mock of the technical stage: an integration design aloud, then a short TypeScript task.
  • Run a mock of the cross-functional stage: two behavioral answers and one technical trade-off explained to a non-engineer.
  • Write the questions you will ask the team.

Deliverable: A completed mock run, a list of weak spots to fix, and your questions for the team.

Practice prompt ↗Practice prompt ↗

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

Candidates report that the final stage covers cross-functional partners and leadership, and that the stated values are Be Curious, Customer Obsession and Keep It Simple. For a Software Engineer role, prepare stories where you made the decision, with a result: code review habits, handling feedback, learning something quickly, holding quality under speed pressure, and ownership beyond your assignment.

Walk me through your process for performing a code review for a teammate.

medium
Technical and Domain Knowledge

Walk me through your process for performing a code review for a teammate.

Approach
  1. Start from intent: read the description and linked ticket first, so you review the change against what it was meant to do, and check that CI is green before reading line by line.
  2. Review in layers: scope and design (is this the right change, is it too big), then correctness (edge cases, error handling, concurrency, null and empty input), then tests, then readability and naming.
  3. Look at the risks specific to this stack: React state and effect handling, TypeScript types that hide any, SQL migrations and query plans, and anything touching secrets, access or customer data, which matters in a SOC 2 setting.
  4. Label comments by weight (blocking, suggestion, nit), ask questions instead of issuing orders, and say what is good so the review is not only a defect list.
  5. Close the loop: re-review promptly after changes, approve only when you could maintain it yourself, and note that AI-generated code gets the same scrutiny as any other.
Follow-up
  • How would you review a pull request that is far too large?
  • What do you do when the author disagrees with a blocking comment?
  • How does your review change when the code was written with an AI assistant?

Describe a time you received critical feedback on your code. How did you react?

medium
Behavioral and Values-Based

Describe a time you received critical feedback on your code. How did you react?

Approach
  1. Pick a real piece of feedback on code you wrote, ideally one that was fair and stung a little, and state it in two sentences: the change, the comment, who gave it.
  2. Be honest about the first reaction, then show what you did: you checked whether the reviewer was right, reproduced the problem or read the guideline, and replied with evidence rather than defending.
  3. Show the change you made to the code and the one you made to your habits, such as a checklist item, a test you now write first or a smaller pull request.
  4. Close with a later example where that habit paid off, so the story shows growth and not only acceptance.
  5. The mistake that sinks it is a disguised strength ("I was told I care too much") or a story where you were simply right and the reviewer wrong; choose real feedback you acted on.
Follow-up
  • Was there feedback you disagreed with, and what did you do?
  • How do you give critical feedback to a teammate now?
  • What did you change in how you write code afterwards?

Tell me about a time you had to learn a new technology or tool quickly to solve a problem.

medium
Behavioral and Values-Based

Tell me about a time you had to learn a new technology or tool quickly to solve a problem.

Approach
  1. Choose a situation with a real deadline and a real unfamiliar tool, ideally close to this stack (a framework, a database feature, a messaging system, a language like Golang) and say what was at stake.
  2. Describe your method: narrow to the smallest slice needed, read the official documentation, build a throwaway spike, ask the person who knows it, and write tests that prove you understood it.
  3. Say how you checked your understanding before shipping, such as tests, a review from someone experienced, or a staged rollout, and name what you did not learn and left alone.
  4. If you used an AI assistant to speed learning, say what you used it for and how you verified its answers against documentation or running code.
  5. Finish with the outcome and what you kept: a note for the team, a template or a better way to learn the next tool.
Follow-up
  • What was the hardest concept to pick up and how did you know you understood it?
  • What did you decide not to learn, and why?
  • How would you onboard a teammate to the same tool?

How do you balance the need for speed with the requirement for high code quality and SOC 2 compliance?

medium
Behavioral and Values-Based

How do you balance the need for speed with the requirement for high code quality and SOC 2 compliance?

Approach
  1. Answer with a framework before a story: list what you never trade away (automated tests in CI, peer review, no secrets in code, access controls, a traceable change history) and what you trade freely (scope, polish, edge features, internal tooling).
  2. Make the compliance side practical: SOC 2 audits look at controls such as change management and access, so say that you make the controls automatic (required reviews, CI checks, deploy logs) and so they do not slow each change; do not claim detail about the company's own controls.
  3. Give one concrete example where you cut scope or used a feature flag to ship earlier while keeping review and tests intact, and what the customer got.
  4. Show the keep-it-simple side: the smallest change that solves the customer's problem is both faster and easier to review than a clever one.
  5. Say how you handle pressure to skip a step: state the risk plainly, offer a narrower option, and record the decision if the business accepts the risk.
Follow-up
  • Tell me about a time you shipped something you were not fully happy with.
  • What would you do if a product manager asked you to skip code review for a release?
  • How do AI coding tools change your balance between speed and quality?

Tell me about a time you identified a problem that wasn't your responsibility but you took ownership of it any

medium
Behavioral and Values-Based

Tell me about a time you identified a problem that wasn't your responsibility but you took ownership of it anyway.

Approach
  1. Pick a problem that sat outside your assigned work (a flaky test suite, an undocumented integration, a recurring customer error, a broken deploy step) and say how you noticed it and why it mattered to customers or the team.
  2. Show how you respected the owner: you told them, asked whether you could help, and agreed the scope, instead of silently rewriting their code.
  3. Describe the concrete actions you took, such as reproducing the issue, writing a fix or a runbook, and opening a pull request for review, and how you protected your own commitments while doing it.
  4. Give the measurable result (fewer failures, faster builds, fewer support tickets) and the handoff, so the fix did not depend on you staying involved.
  5. The mistake that sinks it is a hero story that ignores the owner, or a problem that was really inside your own job; make the boundary visible.
Follow-up
  • How did the owning team react, and what would you change in how you approached them?
  • How did you decide this was worth your time over your own tasks?
  • When would you decide not to take something like this on?
  • 01

    Walk me through your process for performing a code review for a teammate.

  • 02

    Describe a time you received critical feedback on your code. How did you react?

  • 03

    Tell me about a time you had to learn a new technology or tool quickly to solve a problem.

  • 04

    How do you balance the need for speed with the requirement for high code quality and SOC 2 compliance?

  • 05

    Tell me about a time you identified a problem that wasn't your responsibility but you took ownership of it anyway.

  • 06

    Can you explain a time you had to debug a complex issue in a production environment?

PracHub preparation framework ↗
How long is the Clearstory interview process?

Candidates report three rounds over about 3-5 weeks: a Recruiter Screen, a Technical Assessment, and Cross-Functional Interviews. Ask your recruiter for your own schedule, since details can differ between loops.

Clearstory Software Engineer candidate reports ↗
Is the Technical Assessment a take-home or a live session?

Candidates report that it includes a take-home assignment or a live coding and system design session. Ask the recruiter which format applies. Prepare for both: for a take-home, deliver small, tested code with a short explanation; for a live session, think aloud and start with the simplest working design.

PracHub Software Engineer practice ↗
Which technologies should I prepare?

Candidates list React, TypeScript and SQL as must-haves, with Git and CI/CD experience, and mention Node.js or Golang as examples of a backend language. Prepare React state and asynchronous handling, reusable components, SQL schema design and query optimization, and one backend language well enough to write an endpoint.

PracHub Software Engineer practice ↗
What integration topics come up?

Candidates report pub/sub messaging and event-driven design, ETL-style data transformation, error handling in distributed systems, handling sync problems when an external API is down, and monitoring an integration service. Prepare idempotency, retries with backoff, dead-letter handling, reconciliation and the metrics you would alert on.

PracHub Software Engineer practice ↗
How much should I prepare for the AI-related side of the role?

Candidates describe an AI-assisted workflow and report being asked how they use AI tools. You do not need research knowledge. Prepare a concrete account of what you delegate to an assistant, what you never paste into one, and how you verify generated code with tests and review.

Clearstory Software Engineer candidate reports ↗
What is a change order and do I need to know it?

In construction generally, a change order is a written modification to agreed work, usually with consequences for cost and schedule. Candidates suggest learning the term so you can use the customer's vocabulary. A one-page explanation of how one is requested, priced and approved is enough.

PracHub Software Engineer practice ↗
How do I show the values candidates mention?

Candidates report Be Curious, Customer Obsession and Keep It Simple. Map one story to each: a time you asked why and found a root cause, a time you changed a decision for a user's sake, and a time you chose the simpler design and said what you left out.

PracHub Software Engineer practice ↗
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.