Newer Version Available

This content describes an older version of this product. View Latest

InvocableMethod Annotation

Use the InvocableMethod annotation to identify methods that can be run as invocable actions.

If a flow invokes Apex, the running user must have the corresponding Apex class security set in their user profile or permission set.

Note

Invocable methods are called natively from Rest, Apex, Flow, or Einstein bot that interacts with the external API source. Invocable methods have dynamic input and output values and support describe calls.

This code sample shows an invocable method with primitive data types.

1public class AccountQueryAction {
2  @InvocableMethod(label='Get Account Names' description='Returns the list of account names corresponding to the specified account IDs.' category='Account')
3  public static List<String> getAccountNames(List<ID> ids) {
4    List<Account> accounts = [SELECT Name FROM Account WHERE Id in :ids];
5    Map<ID, String> idToName = new Map<ID, String>();
6    for (Account account : accounts) {
7      idToName.put(account.Id, account.Name);
8    }
9    // put each name in the output at the same position as the id in the input
10    List<String> accountNames = new List<String>();
11    for (String id : ids) {
12      accountNames.add(idToName.get(id));
13    }
14    return accountNames;
15  }
16}

This code sample shows an invocable method with a specific sObject data type.

1public class AccountInsertAction {
2  @InvocableMethod(label='Insert Accounts' description='Inserts the accounts specified and returns the IDs of the new accounts.' category= 'Account')
3  public static List<ID> insertAccounts(List<Account> accounts) {
4    Database.SaveResult[] results = Database.insert(accounts);
5    List<ID> accountIds = new List<ID>();
6      for (Database.SaveResult result : results) {
7      accountIds.add(result.getId());
8    }
9    return accountIds;
10  }
11}

This code sample shows an invocable method with the generic sObject data type.

1public with sharing class GetFirstFromCollection {
2  @InvocableMethod
3  public static List<Results> execute (List<Requests> requestList) {
4    List<Results> results = new List<Results>();
5    for (Requests request : requestList) {
6      List<SObject> inputCollection = request.inputCollection;
7      SObject outputMember = inputCollection[0];
8      
9      //Create a Results object to hold the return values
10      Results result = new Results();
11      
12      //Add the return values to the Results object
13      result.outputMember = outputMember;
14      
15      //Add Result to the results List at the same position as the request is in the requests List
16      results.add(result);
17    }
18    return results;
19  }
20
21  public class Requests {
22    @InvocableVariable(label='Records for Input' description='yourDescription' required=true)
23    public List<SObject> inputCollection;
24  }
25
26  public class Results {
27    @InvocableVariable(label='Records for Output' description='yourDescription' required=true)
28    public SObject outputMember;
29  }
30}

This code sample shows an invocable method with a custom icon from an SVG file.

1global class CustomSvgIcon { 
2  @InvocableMethod(label='myIcon' iconName='resource:myPackageNamespace__google:top')
3  global static List<Integer> myMethod(List<Integer> request) {
4    List<Integer> results = new List<Integer>();
5    for(Integer reqInt : request) { 
6       results.add(reqInt);
7    }
8    return results;
9  }
10}

This code sample shows an invocable method with a custom icon from the Salesforce Lightning Design System (SLDS).

1public class CustomSldsIcon { 
2  
3  @InvocableMethod(iconName='slds:standard:choice') 
4  public static void run() {} 
5  
6  }

Supported Modifiers

All modifiers are optional.
label
The label for the method, which appears as the action name in Flow Builder. The default is the method name, though we recommend that you provide a label.
description
The description for the method, which appears as the action description in Flow Builder. The default is Null.
callout
The callout modifier identifies whether the method calls to an external system. If the method calls to an external system, add callout=true. The default value is false.
category
The category for the method, which appears as the action category in Flow Builder. If no category is provided (by default), actions appear under Uncategorized.
configurationEditor
The custom property editor that is registered with the method and appears in Flow Builder when an admin configures the action. If you don’t specify this modifier, Flow Builder uses the standard property editor.
iconName
The name of the icon to use as a custom icon for the action in the Flow Builder canvas. You can specify an SVG file that you uploaded as a static resource or a Salesforce Lightning Design System standard icon.

InvocableMethod Considerations

Implementation Notes
  • The invocable method must be static and public or global, and its class must be an outer class.
  • Only one method in a class can have the InvocableMethod annotation.
  • Other annotations can’t be used with the InvocableMethod annotation.
Inputs and Outputs
There can be at most one input parameter and its data type must be one of the following:
  • A list of a primitive data type or a list of lists of a primitive data type – the generic Object type isn’t supported.
  • A list of an sObject type or a list of lists of an sObject type.
  • A list of the generic sObject type (List<sObject>) or a list of lists of the generic sObject type (List<List<sObject>>).
  • A list of a user-defined type, containing variables of the supported types or user-defined Apex types, with the InvocableVariable annotation. To implement your data type, create a custom global or public Apex class. The class must contain at least one member variable with the invocable variable annotation.
If the return type isn’t Null, the data type returned by the method must be one of the following:
  • A list of a primitive data type or a list of lists of a primitive data type – the generic Object type isn’t supported.
  • A list of an sObject type or a list of lists of an sObject type.
  • A list of the generic sObject type (List<sObject>) or a list of lists of the generic sObject type (List<List<sObject>>).
  • A list of a user-defined type, containing variables of the supported types or user-defined Apex types, with the InvocableVariable annotation. To implement your data type, create a custom global or public Apex class. The class must contain at least one member variable with the invocable variable annotation.

    For a correct bulkification implementation, the Inputs and Outputs must match on both the size and the order. For example, the i-th Output entry must correspond to the i-th Input entry. Matching entries are required for data correctness when your action is in bulkified execution, such as when an apex action is used in a record trigger flow.

    Note

Managed Packages
  • You can use invocable methods in packages, but after you add an invocable method you can’t remove it from later versions of the package.
  • Public invocable methods can be referred to by flows and processes within the managed package.
  • Global invocable methods can be referred to anywhere in the subscriber org. Only global invocable methods appear in Flow Builder and Process Builder in the subscriber org.

For more information about invocable actions, see Actions Developer Guide.