Salesforce Administration

Explore top LinkedIn content from expert professionals.

  • View profile for Deepankar Tiwari

    Salesforce Technical Consultant | Agentforce

    9,250 followers

    𝗟𝗼𝗼𝗸𝗶𝗻𝗴 𝘁𝗼 𝗔𝗱𝗱 𝗮 𝗥𝗲𝘁𝗿𝘆 𝗠𝗲𝗰𝗵𝗮𝗻𝗶𝘀𝗺 (𝗮𝗻𝗱 𝗠𝗼𝗿𝗲!) 𝗳𝗼𝗿 𝗬𝗼𝘂𝗿 𝗤𝘂𝗲𝘂𝗲𝗮𝗯𝗹𝗲 𝗝𝗼𝗯 𝗶𝗻 𝗔𝗽𝗲𝘅? 👇 Transaction Finalizers in Salesforce Apex are a solid approach for robust and reliable asynchronous processing. By implementing the 𝗦𝘆𝘀𝘁𝗲𝗺.𝗙𝗶𝗻𝗮𝗹𝗶𝘇𝗲𝗿 𝗶𝗻𝘁𝗲𝗿𝗳𝗮𝗰𝗲, you can define actions to run after your asynchronous job completes, no matter if it succeeds or fails. This unlocks advanced patterns such as retry logic, resource cleanup, dynamic process chaining, and bulletproof error handling. 𝗪𝗵𝘆 𝗰𝗼𝗻𝘀𝗶𝗱𝗲𝗿 𝗔𝗽𝗲𝘅 𝗧𝗿𝗮𝗻𝘀𝗮𝗰𝘁𝗶𝗼𝗻 𝗙𝗶𝗻𝗮𝗹𝗶𝘇𝗲𝗿𝘀 𝗳𝗼𝗿 𝘆𝗼𝘂𝗿 𝘀𝗼𝗹𝘂𝘁𝗶𝗼𝗻𝘀?  • 𝗣𝗼𝘀𝘁-𝗣𝗿𝗼𝗰𝗲𝘀𝘀𝗶𝗻𝗴: Ensure your critical logic always runs after a job, eliminating missed cleanups or notifications.  • 𝗘𝗿𝗿𝗼𝗿 𝗛𝗮𝗻𝗱𝗹𝗶𝗻𝗴: Capture and process exceptions right after async processing, enabling custom recovery or robust retries.  • 𝗥𝗲𝘀𝗼𝘂𝗿𝗰𝗲 𝗠𝗮𝗻𝗮𝗴𝗲𝗺𝗲𝗻𝘁: Clean up temporary data, release locks, or manage resources to keep your org tidy and efficient.  • 𝗣𝗿𝗼𝗰𝗲𝘀𝘀 𝗖𝗵𝗮𝗶𝗻𝗶𝗻𝗴: Dynamically trigger follow-up jobs, conditional logic, or notifications based on job outcomes. 𝗣𝗼𝗽𝘂𝗹𝗮𝗿 𝗨𝘀𝗲 𝗖𝗮𝘀𝗲𝘀:  • Automatic retry of failed jobs with exponential backoff.  • Logging or alerting after any job outcome.  • Triggering API callouts that weren’t possible during database operations.  • Ensuring idempotency and data consistency across chained jobs. Have you integrated Transaction Finalizers into your Salesforce solutions yet? Share your most creative use case, questions, or lessons learned in the comments below. Let’s connect! – Deepankar Tiwari #Salesforce #Apex #AsynchronousApex #TransactionFinalizers #Resilience #SFDC #BestPractices #SalesforceDevelopers #Trailblazer

  • View profile for Rahul Parjapati

    Senior Associate @ PwC | Apex Data Loader, Salesforce.com Consulting

    14,578 followers

    Hello #Connection #SalesforceInterview #Question #2025 #Question: You have a high-volume Salesforce org where millions of records are processed daily. Your team notices performance issues with triggers, batch jobs, and integrations. How would you analyze and optimize the performance of these components while ensuring scalability? #Expected Answer: To optimize the performance of a high-volume Salesforce org, I would take a multi-layered approach, addressing triggers, batch jobs, and integrations separately while ensuring overall scalability. 1. Trigger Optimization: Bulkification: Ensure all triggers handle bulk operations using Trigger.New, Trigger.Old, and Maps/Sets for efficient processing. One Trigger per Object: Implement a Trigger Handler framework to centralize logic and prevent recursion issues. Use Asynchronous Processing: Offload heavy processing (e.g., API calls, complex calculations) to Queueable, Future, or Batch Apex. Selective Queries & Indexing: Use indexed fields, WHERE clauses, and avoid full table scans. Leverage Skinny Tables if necessary. Avoid DML inside Loops: Batch DML operations to avoid exceeding limits. 2. Batch Jobs Optimization: Reduce Query Load: Use incremental processing (query only new/updated records). Implement Selective SOQL filters using indexed fields. Tune Batch Size: Experiment with scopeSize (e.g., 200 for optimal performance). Monitor governor limits via Limits.getDMLStatements() & Limits.getQueryRows(). Parallel Processing: Use Queueable Apex or Parallel Batch Jobs for non-dependent operations. Implement Chaining but avoid overloading Queueable limits. Use Platform Events or CDC (Change Data Capture): For real-time processing instead of polling-based batch jobs. 3. Integration Performance (APIs & External Systems): Optimize Callouts: Use Continuation (for LWC) or Queueable (for Apex) for long-running external API calls. Implement caching (Custom Settings, Platform Cache) for static data to reduce API calls. Governor Limits Management: Reduce API calls by batching requests (e.g., Composite API, GraphQL). Use Asynchronous Apex (Future, Queueable) for non-critical operations. Streaming APIs for Real-Time Data: Implement Streaming API, Platform Events, or Pub/Sub API instead of periodic polling. 4. Monitoring & Troubleshooting: Apex Execution Logs & Debugging: Analyze logs using Event Monitoring, Apex Replay Debugger, or Log Analyzer. Use System.debug(Limits.getHeapSize()) to check memory consumption. Performance Monitoring: Use Salesforce Optimizer, Lightning Usage App, and Einstein Recommendations. Enable Debug Logs, Governor Limits Monitoring, and Transaction Security Policies. Query Performance: Run SOQL queries in Developer Console to check execution time. Use Query Plan Tool to identify indexing needs.

  • View profile for Gourav Bhardwaj

    Help developers build systems that scale, not just features that work.| Salesforce

    2,869 followers

    Stop trying to “fix” governor limits with more code. In Salesforce, the async Apex type you pick is the real performance lever. A lot of teams default to one pattern (usually Queueable) for everything. Then jobs fail, retries pile up, and limits get hit in the worst places—production. Here’s what no one tells you: 𝟏. 𝐅𝐮𝐭𝐮𝐫𝐞 𝐌𝐞𝐭𝐡𝐨𝐝𝐬 → Best for simple, fire-and-forget callouts; limited control and no job chaining, with smaller async limits than other options. 𝟐. 𝐐𝐮𝐞𝐮𝐞𝐚𝐛𝐥𝐞 𝐀𝐩𝐞𝐱 → Best for complex processing with state + chaining; more flexible than Future, and generally higher async query/heap headroom for larger workloads. 𝟑. 𝐁𝐚𝐭𝐜𝐡 𝐀𝐩𝐞𝐱 → Best for large data volumes; runs in chunks with fresh limits per batch execution, making it the safest option for “process thousands/millions” scenarios. 𝟒. 𝐒𝐜𝐡𝐞𝐝𝐮𝐥𝐞𝐝 𝐀𝐩𝐞𝐱 → Best for time-based automation; use it to trigger Batch/Queueable on a cadence, not for heavy lifting inside the schedule itself. 𝟓. 𝐏𝐥𝐚𝐭𝐟𝐨𝐫𝐦 𝐄𝐯𝐞𝐧𝐭𝐬 / 𝐄𝐯𝐞𝐧𝐭-𝐃𝐫𝐢𝐯𝐞𝐧 𝐀𝐬𝐲𝐧𝐜 → Best for decoupling systems; publish now, process later, and scale with subscribers while keeping the main transaction lean. 𝟔. @𝐈𝐧𝐯𝐨𝐜𝐚𝐛𝐥𝐞 (𝐀𝐬𝐲𝐧𝐜 𝐯𝐢𝐚 𝐅𝐥𝐨𝐰) → Best when admins own orchestration; great for business-led automation, but you still need to design for limits and bulk patterns. The mindset shift: don’t ask “How do I avoid limits?” Ask “Which async lane gives me the right limits, retries, and control for this job?” Pick the right tool. Design for volume. And your org will feel faster, safer, and easier to evolve—one async decision at a time. Read this complete article on Async Apex - https://lnkd.in/gJXve3rX ♻️ Reshare this if it clarified async Apex for you. 👉 Follow me for more practical Salesforce engineering insights. #Salesforce #Apex #AsyncApex #SalesforceDeveloper #SFDC #GovernorLimits #Queueable #BatchApex #FutureMethod #PlatformEvents #SalesforceArchitecture #CRM #SalesforceFlow

  • View profile for Kevin Antonioli

    Founder & Chief Architect at XLerated LLC | Enterprise-Ready, Revolutionary Salesforce Solutions

    2,545 followers

    🔍 Leveraging SBQQ Record Job Triggers to Hook Into CPQ Asynchronous Processes As Salesforce CPQ developers, we often need to execute custom logic after CPQ completes its asynchronous processes. Instead of creating complex polling mechanisms or custom fields, we can leverage the SBQQ__RecordJob__c object that CPQ maintains throughout its processes. 📋 How It Works CPQ uses the SBQQ__RecordJob__c object to track all its asynchronous processes. The key fields to monitor are: 1. SBQQ__RecordId__c: A composite string containing both the record ID and process type in the format [RecordId]::[ProcessType]. For example: a1z3m00000NyqQLAAZ::QuoteCalculator. 2. SBQQ__JobStatus__c: Status field that CPQ updates to "Completed" when the async process finishes. By creating a trigger on SBQQ__RecordJob__c that watches for status changes to "Completed", you can reliably detect when various CPQ processes finish and take appropriate action. ⚠️ Important distinction: When Renewal Forecast is marked on a contract, CPQ does not generate the renewal opportunity asynchronously, and therefore CPQ never populates the SBQQ__JobStatus__c for this operation. This operation can still be keyed into using the SBQQ__RecordId__c in the after insert context, but there's no need to check SBQQ__JobStatus__c value there. 🔄 CPQ Process Patterns This approach allows you to hook into these key CPQ processes: 1️⃣ Quote Processes: [QuoteId]::QuoteCalculator - Triggered when quote calculation completes [QuoteId]::QuoteDocumentService - Triggered when document generation completes 2️⃣ Opportunity Processes: [OpportunityId]::QuoteCalculator - Triggered when opportunity-level calculations complete 3️⃣ Order Processes: [OrderId]::OrderCalculator - Triggered when ordering via SBQQ__Ordered__c checkbox [OrderId]::CreateContract - Triggered when contracting via SBQQ__Contracted__c checkbox 4️⃣ Contract Processes: [ContractId]::QuoteCalculator - Triggered when renewal forecast via SBQQ__RenewalForecast__c [ContractId]::RenewContract - Triggered when using the Renew Contracts button [ContractId]::AmendContract - Triggered when amending a contract ✅ Benefits of This Approach Event-driven: No polling or scheduled jobs needed Reliable: Captures the exact moment when CPQ completes its managed processes Maintainable: Centralized handler for all CPQ async processes Efficient: Minimal code footprint with maximum coverage of CPQ operations This pattern has been invaluable for integrating custom business logic with CPQ's asynchronous processes without modifying the CPQ package itself. #SalesforceCPQ #SalesforceDevs #Apex #SalesforceArchitecture

  • View profile for Venkata Sai Harsha Chenna

    Salesforce Developer & Admin | PD II | Copado | Service Cloud | Financial Services Cloud | OmniStudio | LWC | Apex | Flows | MuleSoft | REST/SOAP | CI/CD | Driving Efficiency & Automation in Scalable CRM Solutions

    3,961 followers

    A while back, I was working on an automation where a case update needed to trigger multiple downstream actions — updating entitlement records, sending an escalation email, and syncing data to an external system. Everything was working fine… until it wasn’t. During a high-volume day, the system started throwing errors: “CPU Time Limit Exceeded.” The root cause surprised even me: A simple email alert inside a record-triggered Flow was delaying the whole transaction — and because everything ran synchronously, nothing could move forward until the email was processed. That’s when I realized something important: Synchronous automation has limits. Scalability needs asynchronous design. Instead of trying to “optimize” the Flow further, I redesigned the entire solution: 1️⃣ Shifted Email Alerts to Platform Events Instead of sending the email directly, the Flow published a Platform Event, which triggered a separate asynchronous Flow to send the notification. 2️⃣ Moved the External System Callout to Queueable Apex Instead of blocking the transaction with a callout, I queued the integration using Queueable Apex, allowing Salesforce to handle it in the background. 3️⃣ Reduced CPU Load by Splitting Logic Into Subflows Each subflow handled only one type of operation, making the main Flow much lighter. 4️⃣ Added Monitoring and Retry Logic Platform Event subscribers were configured with fault paths, so failures didn’t get lost — they triggered retry logic automatically. After redesigning the automation, the same process that previously failed under load began handling 20,000+ case updates per hour without a single CPU timeout. That day taught me something about Salesforce architecture: > “If your automation struggles under pressure, it’s not a Flow problem — it’s a design pattern problem.” Since then, my rule is simple: Use synchronous automation for user-facing logic. Use asynchronous automation for everything else. #Salesforce

Explore categories