Готовых вариантов для динамического создания воркеров, к сожалению, нет (или по крайней мере я никогда не сталкивался с такими). Можно сделать следующим образом.
В базе данных сделайте таблицу для очереди, в которой одним из столбцов будет номер аккаунта клиента.
При получении вебхука не обрабатывайте (т.е. не делайте запросы к crm) его сразу, а только сохраняйте в вышеуказанную таблицу.
Напишите скрипт, который будет запускаться раз в минуту по крону. Этот скрипт должен получить уникальные аккаунты (DISTINCT) из таблицы очереди и запустить все обработчики, каждый из которых будет обрабатывать только 1 аккаунт клиента (т.е. аккаунт передается обработчику как аргумент). Запускать нужно как фоновый процесс (&). Можно перед запуском проверять, не запущены ли они уже, или сделать это на следующем шаге.
Обработчик при старте проверяет, не запущен ли другой его экземпляр для этого же клиента. Затем до тех пор, пока есть записи в очереди именно для этого аккаунта, скрипт получает по 7 записей для этого аккаунта, и по ним делает 7 одновременных запросов к api crm с помощью guzzle
docs.guzzlephp.org/en/stable/quickstart.html#concu... , после чего удаляет записи из очереди.
Альтернативным вариантом будет использование очереди вроде RabbitMQ вместо базы данных. Нужно будет в exchange создать очередь для каждого аккаунта клиента, и также скриптом по крону получать информацию по тому, какие есть очереди и запускать обработчиков. Первый способ, на мой взгляд, проще, да и его будет достаточно, если вы не обрабатываете миллионы записей ежедневно.