HTTP Callout from Triggers

Callouts cannot be made from triggers as that would hold up the database transaction until the callout completed, which can be up to 120 seconds from a limits perspective. This could obviously cause significant contention with other transactions and impact performance.

The only way that you can execute a callout from a trigger is to schedule it to run asynchronously, for example by executing a method with the @future method as you have found. The key word here is asynchronously - you can't wait for a response from the callout as that would require the transaction to stall until it completes, which is the reason that synchronous callouts aren't allowed.

The way that I've handled this kind of thing in the past is to have a field on the object that captures the response. I pass the id(s) of the record(s) that I am processing to the @future method. Then when the callout completes, the @future method can retrieve the record(s) from the database and update the field(s).

If you are trying to return a response to the user (as part of a visualforce page maybe) you can still utilise this mechanism, you just have to poll the controller to check the object to see if a response has been received - I've used an actionpoller for this and provided the user with a 'checking' spinner to keep them (hopefully) interested.


try using @future(callout=true) http://www.salesforce.com/us/developer/docs/apexcode/Content/apex_classes_annotation_future.htm

The following snippet shows how to specify that a method executes a callout:

  @future (callout=true)
  public static void doCalloutFromFuture() {
   //Add code to perform callout 

}

You can specify (callout=false) to prevent a method from making callouts.

When the callout is done you can get a status 200 code or some response body reponse and make sure the handshake was complete !!! If you want to give the user an idea of the handshake I would suggest create a child object and create a field like " Status of transcation" and insert the response body/ response status code in the field.

To get something from the other end spin up a Rest Endpoint with a httppost method and provide the endpoint to the other vendor so that he can send the data back to you once the transaction is complete at his end.

This way you do not have to wait for the transaction to complete and use future for making callouts!!!

Hope this helps!!


The use of a Queueable Apex method is likely preferable to a Future method.

If another future or batch method is what triggers your trigger, you'll encounter this error message.

Future method cannot be called from a future or batch method.

Many people describe Queueable Apex as "Futures 2.0", and recommend using them in most cases instead of an @future annotated method. It makes sense that the other answers recommended a Future method back in 2012 because Queueable Apex was released in Winter 2015.

You can learn more about this in this answer.