Skip to main content
New tool CRON Expression Builder — preview next run times before you schedule Apex. Open the builder →
Live interview

An interviewer that actually talks back

Tell it the job you're chasing — paste the description or just describe the role. It asks from a bank of 122 hand-written Salesforce interview questions, times each answer like a real screen, digs into what you actually said, and hands you a scored report when time runs out.

Your answers are graded by a third-party AI model. How your interview data is handled.

  1. It starts with the job. Paste the posting or describe the role; it asks until it knows enough.
  2. Every question has a clock. Harder questions get more time. Silence counts, same as the room.
  3. Follow-ups chase your answer — not a script. Strong answers push the difficulty up.
  4. The report lands at the end: per-topic score, strengths, gaps, and what to read next.

What it can ask you

The interviewer draws on 122 hand-written questions across 10 Salesforce topics — every one with a model answer written per experience level, so grading compares you against a real bar, not a keyword list.

  • Apex Triggers, async, governor limits and the order of execution. 13 questions · 5 scenario
  • Agentforce Topics, Actions, grounding, the Trust Layer and what an agent cannot do. 14 questions · 5 scenario
  • LWC Lifecycle hooks, the wire service, events and re-render traps. 13 questions · 4 scenario
  • Visualforce View state, controllers, and where it still beats LWC. 8 questions · 2 scenario
  • Flow Entry criteria, bulkification, fault paths and Flow versus Apex. 12 questions · 4 scenario
  • Integration Patterns, callout limits, retries and idempotency. 13 questions · 5 scenario
  • Testing Test data, mocks, coverage that means something, and assertions. 12 questions · 4 scenario
  • Security & sharing OWD, sharing rules, apex sharing, FLS and permission sets. 13 questions · 5 scenario
  • Data model Relationships, skew, large data volumes and schema trade-offs. 12 questions · 4 scenario
  • Admin Declarative config, approvals, reporting and release hygiene. 12 questions · 4 scenario

Sample questions from the bank

One from each topic, with the answer a solid mid-level candidate gives. In the interview you get the question cold — the answer only shows up in how you're graded.

When would you use a before trigger instead of an after trigger?
Model answer (mid-level)

The question I actually ask is whether the record has an Id yet. In a before trigger it does not, so Trigger.new is still writable and I can set fields with no DML at all. In an after trigger the Id exists, and that is the only reason to be there — related records, anything keyed on Id. Trigger.new is read-only in an after trigger, and touching it throws System.FinalException: Record is read-only. Doing the same field default after the save instead costs an extra update, which re-enters the trigger and spends part of the 100-query budget on a second pass I did not need.

How do you expose Apex to an agent, and what decides whether the agent ever calls it?
Model answer (mid-level)

Mechanically it is an @InvocableMethod — static, one per class, taking a List of an inner request class and returning a List, with each input marked up as an @InvocableVariable. Then register it as an Agent Action, attach it to a Topic, and grant the class on the agent user's permission set. What decides whether it ever runs is none of that: the planner reads the label and description on the annotation and the description on each variable, and nothing else. It never sees the body. So description='Cancels an order' competes badly against a sibling Action, and description='Use when the customer asks to stop an order that has not shipped' wins. A vague description is a working Action that is never chosen.

How do you handle errors in a component so a user knows what to do?
Model answer (mid-level)

Every path needs a handler, and there are three. A wire puts its failure in error rather than throwing, so the template needs a branch for it. An imperative call rejects, so it needs a catch. And a DML error from Apex is not one message — it arrives as error.body.pageErrors and error.body.fieldErrors, so pulling out error.body.message alone will show undefined for exactly the errors users care about, the validation rules. I normalise all of them through one helper and show the result in a toast, or inline if the error belongs to a field.

How would you get a Lightning web component onto a Visualforce page?
Model answer (mid-level)

Lightning Out. The page includes apex:includeLightning, creates an app reference, and calls $Lightning.createComponent to mount the component into a div. The component needs to be exposed for that target in its metadata, and I need a Lightning app as the dependency container. It is the normal route for modernising a page I cannot replace outright — the old page stays, the new part is a component I can reuse elsewhere.

When do you use a before-save record-triggered flow instead of after-save?
Model answer (mid-level)

Before-save updates the record in memory on its way to the database, so there is no second save and no second pass through the automation. That makes it dramatically cheaper than the after-save equivalent, which had to issue its own DML and re-enter the order of execution to change the same field. What it cannot do is the whole reason after-save exists: no related records, no callouts, no email, no Apex actions, and on an insert there is no record Id yet because the row does not exist. So the split is not about preference — anything that only touches Trigger.new-equivalent fields belongs in before-save, and everything else has no choice.

What limits do you have to design a callout around?
Model answer (mid-level)

The count is rarely what stops me. The 120 second cumulative budget is, because it is shared: three endpoints at 40 seconds each and the fourth call fails no matter how healthy it is. So I set an explicit setTimeout per call rather than leaving the 10 second default and hoping. The one that actually catches people is You have uncommitted work pending — a callout after DML in the same transaction throws, and the fix is not reordering the statements, it is moving the callout into a Queueable so the DML gets its own transaction to commit in.

Why test with 200 records rather than one?
Model answer (mid-level)

Because the bugs that matter in Apex are bulk bugs, and one record cannot see them. A query inside a loop passes with one record and fails at 101; a handler that reads Trigger.new[0] passes with one record and silently ignores the other 199. Inserting 200 in the test is the cheapest way to catch both, and 200 specifically because that is the trigger batch size the platform uses, so it is the size real automation will meet.

When would you write Apex managed sharing, and what does it cost you?
Model answer (mid-level)

When access depends on something the sharing model cannot see. A rule can target owners, roles and groups; it cannot say "the two people named on this record's fields, plus their managers, until the close date passes". For that I insert share rows — AccountShare, or MyObject__Share for a custom object — with the user or group Id, the access level, and a sharing reason I declared on the object. The cost is that it is now code: nothing in Setup explains it, and recalculating after a rule change is something I have to write.

Custom metadata type or custom setting — which do you reach for?
Model answer (mid-level)

Custom metadata types for configuration that belongs to the application — they deploy with their records, so the same rows exist in every org and a release does not need somebody retyping values in production. Hierarchy custom settings for anything that has to vary by profile or user, because metadata types cannot do that. The other practical difference is limits: Type__mdt.getAll() and a custom setting's getInstance() both read from cache and cost no SOQL query, but a SOQL query against a metadata type does count, which surprises people.

Data Loader or the Import Wizard?
Model answer (mid-level)

The Import Wizard for small, supervised loads on the objects it supports — up to 50,000 records, with built-in duplicate matching, and no delete. Data Loader for everything else: all objects, up to 5,000,000 records, insert, update, upsert, delete and hard delete, and the Bulk API option for volume. The rule of thumb is that the wizard is for a person doing a one-off and Data Loader is for anything repeatable or large.

How the scoring works

Every answer is marked HIT (you covered the substance), PARTIAL (the core idea is there but something load-bearing is missing), or MISS — judged against the model answer for your level, crediting substance over vocabulary. Letting the clock run out or skipping counts against you, the same way silence does in a real room.

Concept questions get 90 seconds and scenario questions 150, scaled to the seniority the interview is pitched at. Answer well twice in a row and the difficulty steps up a rung; struggle twice and it steps down — so a senior candidate ends up defending design calls while a junior one builds up from fundamentals.

The report at the end scores each topic separately, names what you did well and what to work on, and links the deep-dive guides for anything you missed.