Le parcours complet, en une page : mesurer l’audience et le tunnel, recevoir les demandes, collecter les inscriptions, faire surveiller vos tâches planifiées, déposer vos sauvegardes. Comptez une heure la première fois.
Chaque étape renvoie vers son guide détaillé — cette page est la carte, pas le territoire.
Toutes les clés vivent dans config/services.php, jamais en dur dans une vue.
config/services.php
'inotrack' => [ 'endpoint' => env('INOTRACK_ENDPOINT', 39;https://messagerie.inovertix.com/api/inotrack'), 'public_key' => env('INOTRACK_PUBLIC_KEY'), // Serveur uniquement : ne JAMAIS l'exposer dans une vue. 'secret' => env('INOTRACK_SECRET_KEY'), ], 'inodesk' => [ 'endpoint' => env('INODESK_ENDPOINT', 39;https://messagerie.inovertix.com/api/inodesk'), 'public_key' => env('INODESK_PUBLIC_KEY'), 'secret' => env('INODESK_SECRET_KEY'), ], 'inocampagne' => [ 'endpoint' => env('INOCAMPAGNE_ENDPOINT', 39;https://messagerie.inovertix.com/api/inocampagne/public'), 'public_key' => env('INOCAMPAGNE_PUBLIC_KEY'), ],
Dans resources/views/layouts/app.blade.php, avant </body> :
resources/views/layouts/app.blade.php
</body>
<script src="https://messagerie.inovertix.com/inotrack.js" data-site="{{ config('services.inotrack.public_key') }}" data-endpoint="{{ config('services.inotrack.endpoint') }}" defer></script>
Suivre un clic : <button data-inotrack="Ajouter au panier">…</button>.
<button data-inotrack="Ajouter au panier">…</button>
Le navigateur fournit son session_uid (champ caché alimenté depuis le localStorage, clé _inotrk_sid) ; le serveur ajoute les données sensibles et la clé secrète. Le parcours reste ainsi raccroché à la navigation.
session_uid
localStorage
_inotrk_sid
use Illuminate\Support\Facades\Http; Http::withToken(config('services.inotrack.secret')) ->timeout(3) // une mesure ne doit jamais faire attendre un client ->post(config('services.inotrack.endpoint').'/funnel', [ 'session_uid' => $request->input('session_uid'), 'step_key' => 'commande_validee', 'data' => ['amount' => $order->total, 'order_ref' => $order->reference], ]);
C’est ce canal qui alimente le taux de livraison. Il exige la clé secrète et accepte des lots de 200 :
Http::withToken(config('services.inotrack.secret')) ->post(config('services.inotrack.endpoint').'/order-status', [ 'orders' => [ ['order_ref' => 'CMD-1042', 'status' => 'delivered'], ['order_ref' => 'CMD-1043', 'status' => 'cancelled'], ], ]);
→ INOTRACK — Laravel · la référence de l’API
<script src="https://messagerie.inovertix.com/inodesk.js" data-site="{{ config('services.inodesk.public_key') }}" data-endpoint="{{ config('services.inodesk.endpoint') }}" defer></script>
Un formulaire dans la page : <div data-inodesk-form="contact"></div>.
<div data-inodesk-form="contact"></div>
Quand c’est votre code qui détecte le besoin d’assistance — un paiement en échec, une livraison bloquée — ouvrez la demande côté serveur, avec la clé secrète :
$response = Http::withToken(config('services.inodesk.secret')) ->post(config('services.inodesk.endpoint').'/tickets', [ 'email' => $customer->email, 'message' => "Paiement refusé sur la commande {$order->reference}.", ]); $reference = $response->json('reference'); // « DSK-1042 » $trackUrl = $response->json('track_url'); // lien magique — clé secrète uniquement
→ INODESK — Laravel · la référence de l’API
<script src="https://messagerie.inovertix.com/inocampagne.js" data-marque="{{ config('services.inocampagne.public_key') }}" data-endpoint="{{ config('services.inocampagne.endpoint') }}" defer></script> <div data-inocampagne-form></div>
Pour une inscription déclenchée par votre code (case cochée à la commande, par exemple), l’appel serveur suffit :
Http::withToken(config('services.inocampagne.secret')) ->post(config('services.inocampagne.endpoint').'/subscribe', [ 'email' => $customer->email, 'first_name' => $customer->first_name, 'source_url' => url()->current(), ]);
→ INOCAMPAGNE — le formulaire en 5 minutes · la référence de l’API
C’est l’étape la plus rentable pour une application Laravel : vos tâches planifiées tournent sans témoin, et une tâche morte n’émet aucune erreur.
Un listener sur le planificateur bat automatiquement à chaque tâche terminée — vous n’avez rien à écrire dans vos commandes :
// app/Providers/AppServiceProvider.php — boot() Event::listen(ScheduledTaskFinished::class, function ($event) { Http::timeout(3)->withHeaders(['X-Beat-Key' => config('services.inowatch.key')]) ->post(config('services.inowatch.endpoint').'/beat/'.Str::slug($event->task->command)); });
Le guide détaillé donne la version complète, y compris l’extraction propre du nom de la commande et le traitement des échecs.
→ INOWATCH — application Laravel · tâche cron · la référence de l’API
composer require inovertix/control-backup php artisan vendor:publish --tag=control-backup-config php artisan control:backup
Puis, dans routes/console.php :
routes/console.php
Schedule::command('control:backup')->dailyAt('02:00')->withoutOverlapping();
→ INOBACKUP — package Laravel · dépôt des sauvegardes
php artisan config:clear après avoir renseigné le .env, puis un ping par module branché : chacun renvoie {"ok":true,…} avec le bon nom.
php artisan config:clear
.env
ping
{"ok":true,…}
Les domaines sont déclarés pour chaque clé publique — production et préproduction.
Aucune clé secrète dans une vue. grep -r "_SEC_" resources/ ne doit rien ressortir, et les variables secrètes ne sont lues que côté serveur.
grep -r "_SEC_" resources/
Le tunnel remonte : une étape franchie apparaît dans INOTRACK → Funnel. Un 422 unknown_step signifie que l’étape n’est pas déclarée dans CONTROL.
422 unknown_step
Les appels sortants ne bloquent jamais une transaction : timeout court, try/catch, et aucun throw qui remonte jusqu’à l’utilisateur.
timeout
try/catch
throw
Les tâches planifiées battent : INOWATCH → Heartbeats les montre au vert après un cycle complet.
La première sauvegarde est arrivée, et le db_name correspond bien à la base attendue.
db_name