My best guess is that you want to make sure that no account has more than 4 opportunities that were created via leads that came from the web. **Disclaimer: the following is intentionally not copy/paste code and meant as a guide to get you started. Use it as a guide and if you run into any specific issues you can ask another question for more assistance.** trigger oppTriggerTest on Opportunity (before update, before insert) { // FIrst step is to get account ids Set<id> accountIds = new Set<Id>(); for (Opportunity opp : trigger.new) { if (opp.leadSource = 'Web') { // Make sure we only look at opps that we care about accountIds.add(opp.Id); } } // Let's make the database do as much of the work as possible List<AggregateResult> ars = [ SELECT Count(Id) numOfWeb, AccountId FROM Opportunity WHERE AccountId IN :accountIds And LeadSource = 'Web' GROUP BY AccountId HAVING Count(Id) >= 4 ]; // Lets make a map that's easier to work with Map<Id, Integer> accountToCount = new Map<id, Integer>(); for (AggregateResult ar : ars) { accountToCount.put(ar.get('AccountId'), ar.get('numOfWeb')); } // Now, lets add an error to opps that violate the rule for (Opportunity opp : trigger.new) { if (accountToCount.get(opp.accountId) >= 4) { opp.addError('Too many web opps for the given account'); } } }