IVR toolkit
Buduj w pełni spersonalizowane przepływy połączeń i automatyzuj każdy krok interakcji z klientami dzięki naszemu potężnemu zestawowi narzędzi IVR.
Używaj prostych poleceń, aby odtwarzać dźwięk, zbierać cyfry, łączyć dzwoniących, uruchamiać logikę, przesyłać dźwięk do systemów AI i więcej - wszystko w ramach Twojej istniejącej konfiguracji telefonicznej.
- Integruj AI, automatyzację lub niestandardową logikę back-endową
- Twórz kompletne przepływy IVR bez dodatkowego sprzętu
- Kontroluj zachowanie połączeń za pomocą precyzyjnych poleceń
Zalety funkcji Zestaw narzędzi IVR
Odkryj, jak nasze funkcje pomagają pracować mądrzej, oszczędzać czas i ulepszać sposób, w jaki Twoja firma się komunikuje.
Elastyczna automatyzacja połączeń
Zdefiniuj dokładnie, jak ma zachowywać się każde połączenie. Odtwarzaj komunikaty, zbieraj dane wejściowe, kieruj dzwoniących lub uruchamiaj logikę warunkową - wszystko z jednego przejrzystego, przyjaznego dla programistów zestawu narzędzi.
Zaprojektowane dla zespołów deweloperskich
Używaj ustrukturyzowanych akcji, które naturalnie pasują do Twojej logiki backendowej. Każda akcja ma przewidywalne wyniki, obsługę błędów i przykłady, które pomogą Ci budować z pewnością.
Działa z Twoją istniejącą konfiguracją
Nie wymaga nowej infrastruktury. Użyj swojego numeru Callfactory i po prostu rozszerz swoją logikę połączeń poprzez API, swoje skrypty lub wewnętrzne narzędzia automatyzacji.
Zestaw Narzędzi Akcji IVR
Kliknij na akcję, aby zobaczyć jej opis, sygnaturę i przykłady.
Odbiera połączenie przychodzące. Musi zostać wywołane przed odtworzeniem dźwięku lub zebraniem danych wejściowych w połączeniu przychodzącym.
Description
- Oznacza połączenie jako odebrane po stronie telefonii.
- Wymagane przed użyciem akcji takich jak
Play,PromptDigit,GatherDigits,Dial,Record, itp., w połączeniach przychodzących.
Throws
InvalidOperationException- jeśli połączenie zostało już odebrane.
Signature
void Answer();Example
protected override async Task
HandleCallAsync(CancellationToken ct)
{
// Zawsze odbieraj najpierw połączenia przychodzące
Answer();
await Play("welcome.wav", ct);
}
Odtwarza plik audio dzwoniącemu lub na kanał wychodzący.
Description
- Odtwarza plik audio (np.
.wav) znajdujący się w katalogu audio serwera. - Może być skierowany do dzwoniącego przychodzącego lub określonego OutboundChannel.
Parameters
audioFile- Nazwa/ścieżka pliku względem katalogu audio IVR.channel- (opcjonalnie) Kanał wychodzący, na którym ma być odtwarzany dźwięk.ct- Token anulowania; anulowany, gdy dzwoniący lub kanał się rozłączy.
Returns
PlayResult.Success- Audio odtworzone w całości.PlayResult.Fail- Odtwarzanie nie powiodło się (np. nieprawidłowy plik).PlayResult.Cancel- Operacja anulowana (np. dzwoniący się rozłączył).PlayResult.Error- Nieoczekiwany błąd podczas odtwarzania.
Throws
OperationCanceledException- Jeśli ct zostanie anulowany podczas odtwarzania.- Inne wyjątki transportu/wejścia-wyjścia w zależności od implementacji.
Signatures
Task<PlayResult> Play(
string audioFile,
CancellationToken ct = default);
Task<PlayResult> Play(
string audioFile,
OutboundChannel channel,
CancellationToken ct = default);
Example
protected override async Task HandleCallAsync(CancellationToken ct)
{
Answer();
var result = await Play("welcome.wav", ct);
if (result != PlayResult.Success)
{
Logger.LogWarning("Nie udało się odtworzyć wiadomości powitalnej (Wynik:
{Result})", result); return;
}
await Play("next_prompt.wav", ct);
}
Odtwarza monit audio i zbiera pojedynczą cyfrę DTMF.
Description
- Odtwarza monit menu (np. ‘Naciśnij 1 dla sprzedaży, 2 dla wsparcia, 3 aby zostawić wiadomość’).
- Czeka na pojedynczą cyfrę DTMF: 0-9, *, lub #.
- Przeznaczone dla wyborów menu głównego.
Parameters
audioFile- Plik monitu do odtworzenia.timeoutSeconds- Jak długo czekać na cyfrę (domyślnie 10).ct- Token anulowania; anulowany, gdy dzwoniący się rozłączy.
Returns
MenuResult.Successz ustawioną Digit, gdy cyfra zostanie odebrana.MenuResult.Timeoutgdy żadna cyfra nie zostanie odebrana w ciągutimeoutSeconds.MenuResult.Cancelgdy operacja zostanie anulowana.
Throws
OperationCanceledException- Jeśli ct zostanie anulowany (np. dzwoniący się rozłączy).
Signatures
Task<(MenuResult Result, char? Digit)> PromptDigit(
string audioFile,
int timeoutSeconds = 10,
CancellationToken ct = default);
Example
protected override async Task HandleCallAsync(CancellationToken ct)
{
Answer();
await Play("welcome.wav", ct);
var (menuResult, digit) = await PromptDigit(
"main_menu.wav",
timeoutSeconds: 10,
ct);
if (menuResult == MenuResult.Success && digit.HasValue)
{
switch (digit.Value)
{
case '1':
await HandleSales(ct);
break;
case '2':
await HandleSupport(ct);
break;
default:
await Play("invalid_option.wav", ct);
await Hangup(ct);
break;
}
}
else if (menuResult == MenuResult.Timeout)
{
await Play("no_input_goodbye.wav", ct);
await Hangup(ct);
}
else
{
await Play("system_error.wav", ct);
await Hangup(ct);
}
}
Odtwarza monit i zbiera wiele cyfr DTMF (np. numer konta, PIN).
Description
- Odtwarza monit proszący dzwoniącego o wprowadzenie kilku cyfr.
- Zatrzymuje się, gdy:
- osiągnięto
maxDigits
- osiągnięto
- naciśnięto cyfrę kończącą (np. #)
- upłynął limit czasu
Parameters
audioFile– Monit do odtworzenia (np. “Wprowadź numer konta, a następnie #”).maxDigits– Maksymalna liczba cyfr do zebrania przed zatrzymaniem.terminationDigits– Ciąg cyfr, które kończą zbieranie po wprowadzeniu.timeoutSeconds– Maksymalny czas oczekiwania na dane wejściowe.ct– Token anulowania.
Returns
- Krotka (
GatherResult Result,string? Digits): GatherResult.Successi Digits ustawione, gdy dane wejściowe zostaną zebrane.GatherResult.Timeoutgdy nie otrzymano danych wejściowych.GatherResult.Cancelgdy operacja zostanie anulowana.GatherResult.Errorprzy nieoczekiwanym błędzie.
Throws
OperationCanceledException- Jeśli ct zostanie anulowany (dzwoniący się rozłączy).
Signatures
Task<(GatherResult Result, string? Digits)> GatherDigits(
string audioFile,
int maxDigits = 20,
string terminationDigits = "#",
int timeoutSeconds = 30,
CancellationToken ct = default);
Example
protected override async Task
HandleCallAsync(CancellationToken ct)
{
Answer();
await Play("welcome.wav", ct);
var (result, digits) = await GatherDigits(
"enter_account.wav",
maxDigits: 10,
terminationDigits: "#",
timeoutSeconds: 30,
ct);
if (result == GatherResult.Success && !string.IsNullOrEmpty(digits))
{
await ProcessAccountNumber(digits, ct);
}
else if (result == GatherResult.Timeout)
{
await Play("no_input_goodbye.wav", ct);
await Hangup(ct);
}
else
{
await Play("system_error.wav", ct);
await Hangup(ct);
}
}
Wybiera jeden lub więcej numerów telefonu wychodzącego i zwraca OutboundChannel po odebraniu.
Description
- Inicjuje połączenie wychodzące do pojedynczego miejsca docelowego lub do wielu miejsc docelowych równolegle.
- W przypadku wielu miejsc docelowych, pierwsze, które odbierze, wygrywa; wszystkie inne są anulowane.
Parameters
destination/destinations– Numer(y) telefonu do wybrania.callerId– Numer do zaprezentowania jako ID dzwoniącego.ringTimeoutSeconds– Maksymalny czas dzwonienia przed rezygnacją.ct– Token anulowania.
Returns
- Pojedyncze miejsce docelowe:
(DialerResult Result, OutboundChannel? Channel)- Wiele miejsc docelowych:
(DialerResult Result, string? AnsweredDestination, OutboundChannel? Channel)DialerResultmoże być: Init, Ringing, Answered, Busy, Rejected, NoAnswer, Failed, Cancel.
Throws
OperationCanceledException– Jeśli operacja zostanie anulowana podczas wybierania numeru.
Signatures
Task<(DialerResult Result, OutboundChannel? Channel)> Dial(
string destination,
string callerId,
int ringTimeoutSeconds = 60,
CancellationToken ct = default);
Task<(DialerResult Result, string? AnsweredDestination,
OutboundChannel? Channel)> Dial(
string[] destinations,
string callerId,
int ringTimeoutSeconds = 40,
CancellationToken ct = default);
Przykład (pojedyncze miejsce docelowe)
private async Task TransferToSupport(CancellationToken ct)
{
var (dialResult, channel) = await Dial(
destination: "18885554444",
callerId: Context.Ani,
ringTimeoutSeconds: 30,
ct);
if (dialResult == DialerResult.Answered && channel != null)
{
await Play("connecting_to_support.wav", ct);
await Connect(channel, ct);
}
else
{
await Play("support_unavailable.wav", ct);
await HandleVoicemail(ct);
}
}
Przykład (wiele miejsc docelowych)
private async Task TransferToSalesHuntGroup(CancellationToken ct)
{
var salesTeam = new[]
{
"18885551111",
"18885552222",
"18885553333"
};
var (result, answeredNumber, channel) = await Dial(
destinations: salesTeam,
callerId: Context.Ani,
ringTimeoutSeconds: 40,
ct);
if (result == DialerResult.Answered && channel != null)
{
Logger.LogInformation("Połączono z agentem sprzedaży {Number}", answeredNumber);
await Connect(channel, ct);
}
else
{
await Play("sales_unavailable.wav", ct);
await HandleVoicemail(ct);
}
}
Łączy audio między dwoma kanałami.
Description
- Dla przepływów przychodzących: łączy dzwoniącego przychodzącego z kanałem wychodzącym.
- Tylko dla scenariuszy wychodzących: łączy dwa kanały wychodzące razem.
- Blokuje do momentu, aż jedna ze stron się rozłączy lub połączenie zostanie w inny sposób zakończone.
Parameters
channel– Kanał wychodzący do połączenia z połączeniem przychodzącym.primary,secondary– Dwa kanały wychodzące do połączenia.ct– Token anulowania.
Returns
ConnectResult.Success– Połączenie zakończone normalnie (rozłączenie).ConnectResult.Error– Połączenie nie mogło zostać nawiązane lub nie powiodło się.
Throws
OperationCanceledException– Jeśli ct zostanie anulowany podczas połączenia.
Signatures
Task<ConnectResult> Connect(
OutboundChannel channel,
CancellationToken ct = default);
Task<ConnectResult> Connect(
OutboundChannel primary,
OutboundChannel secondary,
CancellationToken ct = default);
Example
protected override async Task HandleCallAsync(CancellationToken ct)
{
Answer();
await Play("connecting_you_now.wav", ct);
var (dialResult, channel) = await Dial(
destination: "18885550000",
callerId: Context.Ani,
ringTimeoutSeconds: 30,
ct);
if (dialResult == DialerResult.Answered && channel != null)
{
var connectResult = await Connect(channel, ct);
Logger.LogInformation("Połączenie zakończone z wynikiem: {Result}", connectResult);
}
else
{
await Play("agent_unavailable.wav", ct);
}
await Hangup(ct);
}
Nagrywa dźwięk od dzwoniącego lub z kanału wychodzącego.
Description
- Rozpoczyna nagrywanie od dzwoniącego przychodzącego lub z określonego kanału wychodzącego.
- Kończy się, gdy:
- osiągnięto
timeLimitSeconds
- osiągnięto
- naciśnięto cyfrę kończącą (jeśli skonfigurowano)
- dzwoniący lub kanał się rozłączy
Parameters
timeLimitSeconds– Maksymalna długość nagrania.fileName– Opcjonalna niestandardowa nazwa pliku (generowana automatycznie, jeśli null).terminationDigits– Cyfry DTMF, które zatrzymują nagrywanie.playBeep– Czy odtworzyć sygnał dźwiękowy przed nagrywaniem.channel– Opcjonalny kanał wychodzący.ct– Token anulowania.
Returns
- Krotka (
RecordResult Result,string? FilePath): RecordResult.SuccesszFilePathjest zapisany.RecordResult.Timeout,MaxDurationReached,TerminationDigit,Cancel,Error.
Throws
OperationCanceledExceptionjeśli anulowano.
Signatures
Task<(RecordResult Result, string? FilePath)> Record(
int timeLimitSeconds = 120,
string? fileName = null,
string? terminationDigits = null,
bool playBeep = true,
CancellationToken ct = default);
Task<(RecordResult Result, string? FilePath)> Record(
OutboundChannel channel,
int timeLimitSeconds = 120,
string? fileName = null,
string? terminationDigits = null,
bool playBeep = true,
CancellationToken ct = default);
Example
private async Task HandleVoicemail(CancellationToken ct)
{
await Play("leave_message_after_beep.wav", ct);
var (recordResult, filePath) = await Record(
timeLimitSeconds: 180,
fileName: null,
terminationDigits: "#",
playBeep: true,
ct: ct);
if (recordResult == RecordResult.Success && !string.IsNullOrEmpty(filePath))
{
Logger.LogInformation("Wiadomość głosowa zapisana w {Path}", filePath);
await Play("thank_you_message_received.wav", ct);
}
else
{
Logger.LogWarning("Nagrywanie nie powiodło się: {Result}", recordResult);
await Play("recording_failed.wav", ct);
}
await Hangup(ct);
}
Odrzuca połączenie przychodzące z kodem przyczyny SIP i kończy połączenie.
Description
- Używane do filtrowania połączeń, blokowania i zachowania poza godzinami pracy.
- Zwraca kod błędu SIP do operatora nadrzędnego.
Parameters
reason–RejectReason.Busy,.TemporarilyUnavailable,.Declined.ct– Token anulowania.
Returns
RejectResult.Success– Połączenie odrzucone.RejectResult.AlreadyAnswered– Połączenie już odebrane.RejectResult.Error– Nie udało się odrzucić.
Throws
OperationCanceledExceptionjeśli anulowano.
Signatures
Task<RejectResult> Reject(
RejectReason reason = RejectReason.Busy,
CancellationToken ct = default);
Example
protected override async Task HandleCallAsync(CancellationToken ct)
{
if (IsBlockedNumber(Context.Ani))
{
await Reject(RejectReason.Declined, ct);
return;
}
if (!IsWithinBusinessHours(DateTime.UtcNow))
{
await Reject(RejectReason.TemporarilyUnavailable, ct);
return;
}
// Normalny przepływ
Answer();
await Play("welcome.wav", ct);
}
Czysto kończy aktywne połączenie.
Description
- Kończy połączenie ze strony IVR.
Returns
HangupResult.Success– Połączenie zakończone pomyślnie.HangupResult.NotAnswered– Nigdy nie odebrano.HangupResult.AlreadyDisconnected– Dzwoniący się rozłączył.HangupResult.Error– Rozłączenie nie powiodło się.
Throws
OperationCanceledExceptionjeśli anulowano.
Signature
Task<HangupResult> Hangup(CancellationToken ct = default);
Example
protected override async Task HandleCallAsync(CancellationToken ct)
{
Answer();
await Play("goodbye.wav", ct);
var result = await Hangup(ct);
Logger.LogInformation("Wynik rozłączenia: {Result}", result);
}
Wstrzymuje wykonywanie na podaną liczbę sekund.
Description
- Czeka przez durationSeconds utrzymując połączenie otwarte.
- Może zostać przerwane przez wejście DTMF w zależności od implementacji.
Parameters
durationSeconds– Czas trwania w sekundach.ct– Token anulowania.
Returns
PauseResult.Success– Pauza zakończona normalnie.PauseResult.Interrupted– Dzwoniący nacisnął klawisz podczas pauzy (jeśli obsługiwane).PauseResult.Cancel– Operacja anulowana.PauseResult.Error– Pauza nie powiodła się.
Throws
OperationCanceledException– Jeśli ct zostanie anulowany.
Signatures
Task<PauseResult> Pause(
int durationSeconds,
CancellationToken ct = default
);
Example
protected override async Task HandleCallAsync(CancellationToken ct)
{
Answer();
await Play("please_wait.wav", ct);
var result = await Pause(3, ct);
if (result == PauseResult.Interrupted)
{
await Play("you_pressed_a_key.wav", ct);
}
else
{
await Play("thank_you_for_waiting.wav", ct);
}
await Hangup(ct);
}
Wysyła sygnał zajętości do dzwoniącego i kończy połączenie.
Description
- Prezentuje standardowy ton zajętości.
- Powszechnie używane, gdy wszyscy agenci/linie są zajęte.
Returns
BusyResult.Success– Sygnał zajętości wysłany i połączenie zakończone.BusyResult.Cancel– Operacja anulowana.BusyResult.Error– Nie udało się wysłać sygnału zajętości lub zakończyć połączenia.
Throws
OperationCanceledException– Jeśli ct zostanie anulowany.
Signature
Task<BusyResult> Busy(CancellationToken ct = default);
Example
protected override async Task HandleCallAsync(CancellationToken ct)
{
if (AllAgentsBusy())
{
var result = await Busy(ct);
Logger.LogInformation("Wynik zajętości: {Result}", result);
return;
}
// W przeciwnym razie kontynuuj normalny przepływ
Answer();
await Play("welcome.wav", ct);
}
Rozpoczyna przesyłanie strumieniowe dźwięku na żywo z połączenia do zewnętrznego punktu końcowego (np. silnik AI lub STT).
Description
- Otwiera strumień medialny w czasie rzeczywistym z połączenia do podanego adresu url (np. punkt końcowy WebSocket).
- Zazwyczaj używane do wysyłania dźwięku do:
- asystenta AI,
- silnika zamiany mowy na tekst,
- niestandardowej usługi analitycznej/monitorującej.
- Zalecany jest tylko jeden aktywny strumień na połączenie.
Parameters
url– Docelowy punkt końcowy strumieniowania (np.wss://ai.callfactory.nl/voice-stream).options– Opcjonalna konfiguracja strumieniowania (kierunek, metadane, nazwa).ct– Token anulowania. Jeśli anulowany, strumień jest zrywany.
Throws
OperationCanceledException– Jeśli ct anulowany podczas konfiguracji.- Wyjątki połączenia/transportu w zależności od implementacji.
Sygnatury
Task<StreamResult> StartStream(
string url,
StreamOptions? options = null,
CancellationToken ct = default
);
Parametry
public class StreamOptions
{
public string? Name { get; set; } //
Opcjonalna nazwa strumienia
public StreamDirection Direction { get; set; } =
StreamDirection.Both;
public Dictionary<string, string>? Metadata { get; set; }
}
public enum StreamDirection
{
Inbound, // Od dzwoniącego do AI
Outbound, // Od agenta/systemu do AI
Both // Oba
}
Zwraca
public enum StreamResult
{
Started, // Strumień pomyślnie rozpoczęty
Stopped, // Strumień pomyślnie zatrzymany (dla
StopStream)
AlreadyStarted, // Strumień jest już aktywny
NotActive, // Brak aktywnego strumienia (dla StopStream)
Error // Nie udało się rozpocząć/zatrzymać
}
Example
protected override async Task
HandleCallAsync(CancellationToken ct)
{
Answer();
// Rozpocznij przesyłanie strumieniowe dźwięku dzwoniącego do AI
var streamResult = await StartStream(
url: "wss://ai.callfactory.nl/voice-stream",
options: new StreamOptions
{
Name = "support-ai",
Direction = StreamDirection.Inbound,
Metadata = new Dictionary<string, string>
{
["caller"] = Context.Ani,
["dnis"] = Context.Dnis
}
},
ct
);
if (streamResult != StreamResult.Started)
{
Logger.LogWarning("Nie udało się uruchomić strumienia AI:
{Result}", streamResult);
await Play("ai_unavailable.wav", ct);
await Hangup(ct);
return;
}
await Play("connected_to_ai.wav", ct);
// Kontynuuj logikę IVR, gdy przesyłanie strumieniowe jest aktywne...
var (menuResult, digit) = await
PromptDigit("ai_menu.wav", 30, ct);
if (menuResult == MenuResult.Success && digit == '0')
{
// Dzwoniący chce rozmawiać z człowiekiem
await StopStream(ct);
await Play("transferring_to_human_agent.wav", ct);
await TransferToHuman(ct);
}
else
{
await Play("thank_you_goodbye.wav", ct);
await StopStream(ct);
await Hangup(ct);
}
}
Zatrzymuje aktywny strumień audio, który został wcześniej uruchomiony za pomocą StartStream.
Description
- Czysto zamyka aktywny strumień medialny.
- Nie rozłącza połączenia - tylko przestaje wysyłać dźwięk.
- Bezpieczne do wywołania, nawet jeśli nie ma aktywnego strumienia (zwraca
NotActive).
Parameters
ct– Token anulowania.
Returns
StreamResult.Stopped– Strumień pomyślnie zatrzymany.StreamResult.NotActive– Nie znaleziono aktywnego strumienia.StreamResult.Error– Nie udało się zatrzymać strumienia.
Throws
OperationCanceledException– Jeślictzostanie anulowany.
Signatures
Task<StreamResult> StopStream(
CancellationToken ct = default);
Example
private async Task TransferToHuman(CancellationToken ct)
{
// Zatrzymaj przesyłanie strumieniowe AI przed transferem do człowieka
var stopResult = await StopStream(ct);
Logger.LogInformation("Wynik StopStream: {Result}",
stopResult);
await Play("transferring_to_agent.wav", ct);
var (dialResult, channel) = await Dial(
destination: "18005550000",
callerId: Context.Ani,
ringTimeoutSeconds: 30,
ct
);
if (dialResult == DialerResult.Answered && channel !=
null)
{
await Connect(channel, ct);
}
else
{
await Play("agent_unavailable.wav", ct);
await Hangup(ct);
}
}
Dlaczego to jest ważne
Zestaw narzędzi IVR daje Twojemu zespołowi pełną kontrolę nad przepływami połączeń. Od prostych menu po złożone interakcje sterowane przez AI - wszystko jest możliwe dzięki naszej bibliotece akcji.
Narzędzia te są szczególnie przydatne dla zespołów budujących niestandardowe rozwiązania telefoniczne, wdrażających integracje AI lub rozszerzających istniejące systemy o zaawansowaną logikę połączeń.
Ta funkcja jest dołączona bezpłatnie do każdego numeru firmowego lub numeru międzynarodowego.
Dowiedz się więcej o innych funkcjach
Znajdź więcej informacji o naszych funkcjach, które mogą usprawnić komunikację Twojej firmy.
FAQ Zestawu Narzędzi IVR
Uzyskaj jasne odpowiedzi na temat zestawu narzędzi IVR i tego, jak działa on dla Twojej firmy.
Możesz budować przepływy za pomocą naszych akcji IVR w swoim panelu. Każda akcja zawiera przykłady, sygnatury i przewidywalne zachowanie, dzięki czemu możesz wdrażać logikę bez potrzeby zakupu nowego sprzętu telefonicznego.
Możesz tworzyć proste przepływy bez kodowania, ale zestaw narzędzi jest zbudowany dla zespołów, które chcą automatyzować lub integrować logikę. Programiści mogą używać ustrukturyzowanych akcji do wyzwalania monitów, przechwytywania cyfr lub łączenia dzwoniących programowo.
Tak. Możesz wyzwalać wywołania API, wysyłać dane do swojego back-endu lub przesyłać strumieniowo dźwięk do usług AI lub STT. Zestaw narzędzi naturalnie pasuje do Twojej istniejącej infrastruktury.
Absolutnie. Nie musisz zmieniać swojej konfiguracji. Wszystkie akcje IVR działają z Twoimi istniejącymi numerami Callfactory, routingiem i ustawieniami połączeń.
Tak. Możesz bezpiecznie budować i wyświetlać podgląd swoich przepływów. Zestaw narzędzi pozwala symulować monity, zbieranie danych wejściowych i zachowanie routingu przed aktywowaniem zmian dla prawdziwych dzwoniących.
Ty decydujesz o zachowaniu. Możesz powtórzyć monit, przekierować do poczty głosowej, połączyć ze wsparciem lub zakończyć połączenie. Każda akcja IVR obsługuje niestandardową obsługę błędów.
Tak. Każda akcja zawiera obsługę limitów czasu i opcjonalną logikę rezerwową. Możesz zdefiniować, co się stanie, gdy nie zostaną odebrane żadne dane wejściowe lub gdy dzwoniący się rozłączy.
Tak. Zestaw narzędzi został zaprojektowany do łączenia akcji w łańcuchy. Możesz odtwarzać dźwięk, zbierać cyfry, uruchamiać logikę, wywoływać API i przekazywać dzwoniących - wszystko w jednym przepływie.
Tak. System jest zaprojektowany pod kątem niezawodności i skalowalności. Niezależnie od tego, czy prowadzisz małą firmę, czy call center o dużym wolumenie, wszystkie akcje zapewniają przewidywalną wydajność.
Jeśli Twój zespół potrzebuje wskazówek, możemy pomóc w przeglądzie projektu przepływu, przetestowaniu konfiguracji lub wsparciu bardziej zaawansowanej logiki routingu.









