InputKit
← Centre d'aide

Intégration Salesforce avec Flow

Mis à jour le 7 octobre 2026

*Important, vous devez avec les accès Admin et avoir la license Enterprise, Performance ou Unlimited pour avoir accès à l'outil Flow.

Voici les 3 étapes :

  1. Autoriser api.inputkit.io

  2. Créer la classe Apex pour Send Sequence

  3. Utiliser le Send Sequence dans un Flow

1. Il faut autoriser l'URL du API d'InputKit dans Salesforce

1.1. Setup

1.2. Remote Site Settings

1.3. Ajouter l'URL d'InputKit dans les Remote Site Settings

Clique sur New Remote Site

Mettre ce URL : https://api.inputkit.io

2. Créer la class Apex "InputKit Send Sequence"

Il faut créer la classe Apex pour pouvoir l'utiliser dans le Flow

2.1 Apex Classes

2.2 New

Copier coller ce code :

public with sharing class InputKitSendSequence {

@InvocableMethod(
label='Send InputKit Sequence',
description='Sends a sequence via InputKit API and returns the response'
)
public static List sendSequence(List requests) {
List results = new List();
Http http = new Http();

for (Request req : requests) {
String endpoint = 'https://api.inputkit.io/v3/send/' + EncodingUtil.urlEncode(req.sequenceId, 'UTF-8');

HttpRequest httpReq = new HttpRequest();
httpReq.setEndpoint(endpoint);
httpReq.setMethod('POST');
httpReq.setHeader('Content-Type', 'application/json');
httpReq.setHeader('inputkit_api_key', req.apiKey);

// Build body
Map body = new Map{
'location_id'     => req.locationId,
'creation_source' => req.creationSource
};

if (req.email        != null) body.put('email', req.email);
if (req.phone        != null) body.put('phone', req.phone);
if (req.firstName    != null) body.put('first_name', req.firstName);
if (req.lastName     != null) body.put('last_name', req.lastName);
if (req.fullName     != null) body.put('full_name', req.fullName);
if (req.honorific    != null) body.put('honorific', req.honorific);
if (req.locale       != null) body.put('locale', req.locale);
if (req.sendingModes != null) body.put('sending_modes', req.sendingModes);
if (req.timeToSend   != null) body.put('time_to_send', req.timeToSend);
if (req.employees    != null) body.put('employees', req.employees);
if (req.departments  != null) body.put('departments', req.departments);

httpReq.setBody(JSON.serialize(body));

ResponseWrapper wrap = new ResponseWrapper();
try {
HttpResponse res = http.send(httpReq);
wrap.statusCode = res.getStatusCode();
wrap.responseBody = res.getBody();
wrap.success = (res.getStatusCode() >= 200 && res.getStatusCode()

## 2.3 Classe test (si votre Salesforce oblige une classe de test)

Créer une 2e classe Apex et coller ce code :

@IsTest private class InputKitSendSequenceTest { // Mock to simulate HTTP callouts private class MockHttpResponseGenerator implements HttpCalloutMock { private Integer statusCode; private String responseBody;

public MockHttpResponseGenerator(Integer statusCode, String responseBody) { this.statusCode = statusCode; this.responseBody = responseBody; }

public HTTPResponse respond(HTTPRequest req) { HttpResponse res = new HttpResponse(); res.setHeader('Content-Type', 'application/json'); res.setBody(this.responseBody); res.setStatusCode(this.statusCode); return res; } }

@IsTest static void testSendSequenceSuccess() { // Prepare mock for a 201 Created response Test.setMock(HttpCalloutMock.class, new MockHttpResponseGenerator(201, '{"message":"Sequence sent"}'));

// Build the request InputKitSendSequence.Request req = new InputKitSendSequence.Request(); req.sequenceId = 'seq123'; req.apiKey = 'test_api_key'; req.locationId = 42; req.creationSource = 'TEST'; req.email = 'foo@bar.com'; req.firstName = 'Foo'; req.lastName = 'Bar';

Test.startTest(); List results = InputKitSendSequence.sendSequence( new List{ req } ); Test.stopTest();

// Assertions System.assert(results.size() == 1, 'One result expected'); InputKitSendSequence.ResponseWrapper wrap = results[0]; System.assert(wrap.success == true, 'Callout should be marked as success'); System.assert(wrap.statusCode == 201, 'HTTP status must be 201'); System.assert(wrap.responseBody.contains('Sequence sent'), 'Response body should contain our JSON message'); System.assert(wrap.errorMessage == null, 'No error message on success'); }

@IsTest static void testSendSequenceFailure() { // Prepare mock for a 400 Bad Request response Test.setMock(HttpCalloutMock.class, new MockHttpResponseGenerator(400, '{"error":"Invalid payload"}'));

// Build the minimal request InputKitSendSequence.Request req = new InputKitSendSequence.Request(); req.sequenceId = 'badSeq'; req.apiKey = 'invalid_key'; req.locationId = 0; req.creationSource = 'TEST_FAIL';

Test.startTest(); List results = InputKitSendSequence.sendSequence( new List{ req } ); Test.stopTest();

// Assertions System.assert(results.size() == 1, 'One result expected'); InputKitSendSequence.ResponseWrapper wrap = results[0]; System.assert(wrap.success == false, 'Callout should be marked as failure'); System.assert(wrap.statusCode == 400, 'HTTP status must be 400'); System.assert(wrap.responseBody.contains('Invalid payload'), 'Response body should contain the error message'); System.assert(wrap.errorMessage.startsWith('Non-2xx response'), 'errorMessage should describe status and body'); } }


## 3. Utiliser le service **SendSequence** dans le Flow

3.1 Flows --> New Flow

![](https://downloads.intercomcdn.com/i/o/niwvlyiq/1628446252/f55da92f2d6ed632e06ea818e850/image.png?expires=1792627200&signature=4c13e716a29697e1be0241a226c0d3aa357e4f16f37f3f36c81583df7d03f5fd&req=dSYlHs16m4NaW%2FMW3nq%2BgTpx4khOWUrBQ99s4b6BFVLT6a5PW6ClgJcoiFsu%0AoL1DVbLkFk8Yr%2BpBsG%2BbIyTDx48%3D%0A)

Sur le Trigger, il faut activer le "**Add Async Path**"

![](https://downloads.intercomcdn.com/i/o/niwvlyiq/1628472534/e4ab9f6394700b87df61b8c46d0b/image.png?expires=1792627200&signature=b4b4b79908c17b17db4b02e4020ae157be99bb03f5d565d7d3cfdee42ce81f54&req=dSYlHs15n4RcXfMW3nq%2BgcetDqfTk4CStToaV%2Bn0DviGmH7K0KhaA8f6sKJQ%0A0vCslLhJahIANrpZYSOf9gkL7nI%3D%0A)

Et ajouter les actions en dessous du "Run Asynchronously"

![](https://downloads.intercomcdn.com/i/o/niwvlyiq/1628472847/ddf6c1c659115ef8fb85e33df21a/image.png?expires=1792627200&signature=0f7e9d526a22d5bb90151a6e6d1793e19d0e4e902ec33e6b64f7ebdd05e6a16a&req=dSYlHs15n4lbXvMW3nq%2BgZG%2F%2BgUevZ%2Br90BrTHOEKI22eQVxPxmMA2FJ4Ah5%0A6iy0ohP5AQK%2BL6Kq4G1nclmef2w%3D%0A)

3.2 Ajouter un **Action** à l'endroit de votre choix

![](https://downloads.intercomcdn.com/i/o/niwvlyiq/1628454984/68cba9d809a131de7bc2ab151807/image.png?expires=1792627200&signature=fcd3d4385fac9168eeaccc0854d73d416babd5e97f2a92051a0ed3f3fe5eb6e0&req=dSYlHs17mYhXXfMW3nq%2BgTrAn9K7hbO3l5tTvuxtsPgfJXdx5jNy%2BTZw%2FKPU%0Ajnl8kNlvrfdPVxbXajKl0wBLDAw%3D%0A)

3.3 Send InputKit Sequence (Apex)

![](https://downloads.intercomcdn.com/i/o/niwvlyiq/1628457318/60fb3b9958d7352be027ae81ed0e/image.png?expires=1792627200&signature=d501971154f43693fd09aa15f72718c9ee92758348fa499be533f10536202cfb&req=dSYlHs17moJeUfMW3nq%2BgX10sBTI2gkDPfSUmm1JE7%2BkLqMPWzuwcYNF4Hn7%0AczV2%2FLkCB8QEE88miqD%2BbBppfyM%3D%0A)

3.4 Remplir les champs

- API KEY : Votre clé API de votre compte InputKit, dans vos **[Paramètres](https://app.inputkit.io/#/settings/integrations)**[ > **Intégrations**](https://app.inputkit.io/#/settings/integrations)
- Creation Source : Salesforce
- Location Id : Le ID du bureau, trouvé dans votre page **[Bureaux](https://app.inputkit.io/#/locations)**
- Sequence Id, trouvé dans votre page **[Sequences](https://app.inputkit.io/#/sequences)**

![](https://downloads.intercomcdn.com/i/o/niwvlyiq/1628458068/5e128e46d4686b1cf3c831b6d256/image.png?expires=1792627200&signature=221e6b1ff69fac0c27e3d179eb763ef73ca1e84006a526565b1df5690f6644f5&req=dSYlHs17lYFZUfMW3nq%2BgeNct%2FmMr%2Fy5Q8Uvs60%2FX73Eiq%2BNBjIlWjSS1hVx%0APOd33gW2e%2Bbm07iMJxXnFGTOCKo%3D%0A)

La valeur du champ peut venir de l'object qui a trigger le Flow, ou de n'importe quelle autre étape précédente dans le Flow

Exemple, le Last Name du client vient du Triggering Case.

![](https://downloads.intercomcdn.com/i/o/niwvlyiq/1628460965/548433fa34555af5d9643bc0f69e/image.png?expires=1792627200&signature=0d83514b6c707a7290047d56e2efe3f77aa4b4339ad177a687d1d4482d9c8090&req=dSYlHs14nYhZXPMW3nq%2BgeNwBL75cKUcxJEGHlsOC5KJBAAUS266RXAq80%2B1%0AYQd2Q5g6N668XjoPyChprTzGUiI%3D%0A)

Et je vais sur le Contact associé au Case pour prendre le Last Name.

![](https://downloads.intercomcdn.com/i/o/niwvlyiq/1628461686/b659077f76b0a65a0395bb531b68/image.png?expires=1792627200&signature=d01da9ca47570967d466e19066843d38dbd6b7c948faf9cef6ab47e2d6cfbb3e&req=dSYlHs14nIdXX%2FMW3nq%2BgVeL5v4DsUvodO6nVTZR6tOhL7Y3l2czBWGFcCOZ%0AnmU8BLefgFw%2FgdlLa6%2FBSIziwPk%3D%0A)
Built with Alori