Real-Life Salesforce Architecture Review Checklist I Actually Use

Salesforce Architecture Review Checklist
Salesforce Architecture Review Checklist

Business Alignment Check — “Do We Really Need This?”

Checklist:

  • Is this request solving a tangible business need?
  • Is there an existing feature that does this already?
  • Can the business explain the value in one sentence?

🧠 Real Scenario:

Client: “We want a custom approval flow for expense requests.”

Me: “Why not use native Approval Processes?”

Client: “Because we didn’t know that existed…”

Lesson: Most technical debt starts when we build before we ask.

Automation Design Review — “Is the Org About to Explode?”

Checklist:

  • Are there Flows and Apex Triggers running on the same object?
  • Is everything bulk-safe? No SOQL/DML in loops?
  • Are async options used appropriately? (Queueable, Batch, Platform Events)

🧠 Real Scenario:
A Flow saved a record, which triggered Apex, which re-fired the same Flow = infinite loop.
We found this during a UAT dry-run. Debug logs were longer than my coffee break.

Tip: Use Entry Criteria, Asynchronous Paths, and Trigger Frameworks smartly.

Data Model Evaluation — “Are We Creating a Field Museum?”

Checklist:

  • Are custom objects justified or overkill?
  • Is the parent-child relationship modeled correctly?
  • Are we overusing formula fields and cross-object references?
  • Are field names and descriptions meaningful?

🧠 Real Scenario:

Found 7 custom objects named: Customer_Info_1, Customer_Info_2, and so on.
None were being used. They were “temporary.” That was 2 years ago.

Tip: Install "Field Trip" or run Optimizer report regularly.

Code Quality & Apex Standards — “Will This Code Age Well?”

Checklist:

  • Apex is bulkified and governor-limit safe
  • Code is modular — logic is in handlers, utilities, services
  • No hardcoded IDs, RecordTypeIds, UserIds
  • Null checks and try-catch used wisely

🧠 Real Scenario:
Hardcoded RecordTypeId caused a deployment failure to UAT.
UAT had different IDs — of course.

Quick Fix: Use Schema.SObjectType.Account.getRecordTypeInfosByName().get('Customer').getRecordTypeId();

Naming Convention Tip: AccountTriggerHandler, OpportunityService, CaseBatchJob — name things like you’ll hand it to another developer in 6 months (because you will).

Security & Access Control — “Are We Accidentally Exposing Secrets?”

Checklist:

  • FLS and CRUD enforced manually in Apex & LWC
  • Proper Sharing Settings respected (Use with sharing)
  • Sensitive fields (like Salary, Aadhar, PAN) are protected
  • No unnecessary use of “Modify All Data” or System Mode

🧠 Real Scenario:

Sales team in Mumbai could access salary details of employees in Pune.
Why? Because someone used “without sharing” and skipped field-level checks.

Fix: Use Security.stripInaccessible() in Apex + use permission sets for least privilege.

Testing & Deployment Readiness — “Will This Work When I’m Not Watching?”

Checklist:

  • At least 85% test coverage with real business scenarios
  • Test data created using @testSetup methods
  • Negative tests written (e.g. null, empty string, no records)
  • External calls (Named Credentials, HTTP) mocked using HttpCalloutMock

🧠 Real Scenario:

A flow that called an external system failed in Production because the API key expired.
No one tested that failure path.

Tip: Use mocks + retry mechanisms. Also log errors in custom Error_Log__c object for monitoring.

Reporting & Auditability — “Can the Business Measure This?”

Checklist:

  • Report Types created for all major objects
  • Important fields are field-tracked
  • Data is stored in a way that’s reportable (not only in long text area or attachments)
  • There’s a dashboard for each module/feature launched

🧠 Real Scenario:

Built a lead scoring model… but no report on how scores were trending.
Sales team: “Cool, but how do we trust the score?”

Fix: Build a “Lead Health Audit” dashboard that compares old vs. new scores.

Maintainability & Handoff Readiness — “Can Someone Else Understand This Next Month?”

Checklist:

  • Flows, Apex, Rules, Reports follow naming standards
  • Every automation is documented with purpose, owner, last updated date
  • Field labels and help texts are user-friendly
  • A short Loom or Notion doc explains how the feature works
  • Feature flags or Custom Metadata used for toggling logic

🧠 Real Scenario:

Had a process named: “DoNotDelete_UseThisMainFlow_New2”.
No one knew what it did. When we deleted it — guess what — the portal broke.

Tip: Own less, maintain better. Keep your metadata meaningful.

Salesforce Best practices for architects

Salesforce Technical Review Checklist

Salesforce design review process

Scroll to Top