WombatDialer Concepts

In order to work profitably with WombatDialer, it is necessary to understand the core concepts that come into play.

The architecture of WombatDialer

WombatDialer is a complex system that is built out of different subsystems. Understanding which ones they are and what they are for will make understanding the whole product easier.

WombatDialer schematics

As a first thing, WombatDialer can be accessed through its GUI Client (in order to configure it, view what it is doing and run reports) or through APIs (see the HTTP API section). APIs are meant for external programs to control the behavior of the dialer, e.g. by controlling runs, adding new numbers to dial and creating new campaigns.

The dialer itself is controlled by the GUI Server - this way you can start and stop the dialer process from the GUI. When the dialer runs, an associated watchdog process runs - if the dialer process is to terminate for an unexpected error, the watchdog is supposed to log the error on the system log and restart it. As the dialer is able to sync to the state of an external PBX, during the restart phase calls might not be placed for a few seconds but existing calls will be preserved and tracked correctly.

When the dialer is running, it creates separate AMI handlers for each Asterisk PBX. Each of them runs as a separate thread and connects to a PBX through its Asterisk Manager Interface (AMI). If a PBX crashes, the rest of the system keeps on working; and if one PBX is delayed or loses connection, this does not impact other PBXs. In case of errors, each AMI handler will automatically retry until a connection is established.

The dialer also spawns a helper thread that is meant to run long operations, e.g. HTTP notifications (see the HTTP Notifications section), without delaying the main dialer.

Both the dialer and the GUI use a persistence layer that reads and writes to the MySQL database used for long-term persistence and log tracking.

Asterisk servers

WombatDialer can control activities on multiple Asterisk servers at once. It does so by keeping a control channel open with each server through its Asterisk Manager Interface (AMI for short). Each server is managed independently and in case of failure does not stop the rest of WD from running. Servers can be on the same network as WD is, or can be in remote locations.

Asterisk configuration

When editing an Asterisk server, the following information is required:

  • Server description: the name that this server will appear under in WD

  • Server type: for an Asterisk system, select "Asterisk AMI". If running a test, you can select "Fake AMI" - see Fake AMI servers.

  • Close to the Server type, there is the Test Connection icon button. It will try connecting to the currently server with the credentials you entered.

  • Server address: the PBX server’s name or IP address

  • AMI port: the port that Asterisk’s AMI interface uses. Default 5038.

  • Login and Password: the login and password for the AMI user

  • Unit length and Max msg per unit: these settings work as congestion control on the AMI port. WD displays the total maximum number of messages per second.

  • Security key is the key that will protect this resource. Leave blank if not needed.

How congestion control works

In order to avoid flooding the PBX with too many messages at once, WD uses the concept of Time Unit; this is a period of time in which no more than a fixed number of messages can be sent.

For example, using the default values, if WD has to start 100 calls at once, it will send no more than 5 requests to Asterisk every 50 ms, and will queue the rest for the next time unit. This still amounts to a respectable rate of about 100 messages per second! (though multiple messages are needed to track a call’s life-cycle).

The difference is hardly ever noticeable from a human point of view, but sometimes the PBX might crash if it receives too many requests at once. If your PBX runs on low-end hardware, you may want to reduce the number of messages per unit; on the other side, if your PBX is on a high-end server, you may want to increase it. In general the defaults work fine in the majority of cases.

Do I have to configure Asterisk to work with WombatDialer?

You need to tell Asterisk that WD is allowed to connect and send commands. Our suggestion is to have a dedicated AMI user on each machine - so it is easier to keep track of which applications are connected to the PBX at a given time. To use Asterisk, make sure your server type is set to "Asterisk AMI".

You could e.g. have a stanza in your '/etc/asterisk/manager.conf' file like the following one:

[wombat]
secret = dials
read = all
write = all

Even in high load conditions, it is safe to run WD with events "all", as it will automatically manage the set of events that Asterisk is to send it in order to avoid overloading the channel.

What is the Asterisk status?

When WD is running, it will display the current Asterisk status - if a successful connection is possible, then the Asterisk instance will be UP, otherwise it will be DOWN and WD will simply retry after a few seconds.

The current Asterisk status is propagated to the entities that belong to that instance - that is, its trunks, end-points and queues. If there are calls being processed while an Asterisk system becomes unreachable, WD will try and reconcile them to the current status as soon as the system comes back up. This should work even if WD is restarted in the meantime.

What is a "Fake AMI" server?

A "Fake AMI" server is a test server that can be used for load testing/integration testing, without the need of a physical PBX to connect to. It will simulate people answering the phone (or not answering it) - so it’s a handy way to check if your environment is working or simulate an externally-driven campaign without actually making those calls. Or if you want to check how a WD instance behaves when connected to 5 separate Asterisk servers, without actually setting them up.

It will:

  • try and answer 50% of the calls

  • pick up calls between 1 and 3 seconds

  • have calls open between 3 and 6 seconds

This ensures that the campaign will generate way more calls per second than your average "real" campaign.

When using Fake AMI, the settings for Server, Port and Login/Password are ignored (though they must still be entered).

Connection tests for Fake AMI always pass.

At the moment, the Fake AMI server does not support queue end-points; so it will not try simulating queues and will not send events for them.

Trunks

A trunk is a set of lines that are addressed as a single logical entity. They can be a set of physical lines (like a DAHDI interface in Asterisk) or a set of logical lines (like a connection to your SIP provider, or to another PBX). It may be one single line as well if nothing else is available!

Trunk configuration

  • Asterisk server: is the name of the PBX on which this trunk is located

  • Name: is a logical name for the trunk to appear in WD

  • Dial string: is the actual Asterisk channel name that WD will invoke (see below).

  • Close to the Dial string, there is the Test Connection icon button (see below).

  • Capacity: is the number of parallel calls that WD can dial. Make sure you do not exceed the trunk’s physical capacity!

  • Max calls per period (number) and Period length (milliseconds): the maximum CPS rate limiter (see below).

  • Security key is the key that will protect this resource. Leave blank if not needed.

You do not need to define all the trunks that are on your PBX, or to define them to their full capacity. For example, if you have a 15-channel E1 to your telco, you might define the trunk in WD as being a 10-channel one, so that you can use the rest with your PBX without any special rule.

It is also perfectly legal to define a physical trunk multiple times, splitting its capacity: again in the example you have a 15-channel trunk, you might define it as two trunks in WD, one having 10 channels and another having 5. Then you can assign each (or even both) to campaigns to control the maximum number of parallel outgoing calls.

A note on the dial string: it must be a valid Asterisk channel name, and the string '${num}' is replaced with the actual number being dialed. So the following ones are valid examples:

  • 'DAHDI/g0/0${num}' - dial the number through group 0 of your PSTN interface, prepending the digit zero

  • 'SIP/myprovider/${num}' - dial the number through the SIP server 'myprovider' defined in sip.conf

  • 'Local/${num}@from-internal/n' - dial the number as if was input on an local extension when using a popular Asterisk GUI

When using channels of type 'Local', Asterisk will sometimes change them during the call, so that Wombat may lose them. Though WD is able to keep track of calls through multiple masquerades and channel renames, if all else fails, you may want to add a trailing '/n' to your Local channels to make sure that their channel names are not renamed.

Testing a trunk

The Test connection button on the trunk allows you to check your trunk. In order to do this, WD first makes sure that there is a working Asterisk connection, and then tries dialing a channel on the trunk using a number that you supply. If all goes well, the number is called and a whistling "milliwatt" sound is played.

The test shows a "success" icon if the call is answered within 30 seconds.

For example, if your trunk is set with a channel format of "SIP/provider/${num}\" and you enter the number "5551234", WD will try dialing the channel "SIP/provider/5551234". Make sure your number is in a format that your provider accepts.

Limiting maximum CPS (calls per second)

A trunk allows fine control on its maximum numbers of calls per second. Many providers limit the maximum number of originates per second, usually to something like 25 or 30 (but it depends on your provider and the kind of contract you have with them). Providers often blacklist accounts that dial too fast, so if you exceed their allowed CPS rate all calls will end up as REJECTED or BUSY as soon as they are dialed.

As a trunk typically matches one specific outbound route, they usually map to a specific customer account for the provider that in turn would be used as their unit of measuring your originate rate.

As this check is enforced per trunk, if you have multiple campaigns sharing a trunk, no campaign can dial faster than the combined CPS; while if you have a campaign with two separate trunks, the maximum CPS will be the sum of each trunk’s own CPS.

In order to implement CPS limiting, what happens is that when Wombat inquires for the number of empty channels on a Trunk, the Trunk will keep track of the number of calls just placed within the last time period, so if the trunk has (say) 50 channels free, but in the last second 10 calls have been requested and the maximum CPS is 30, it will report back that it has only 30-10 = 20 channels free.

Rate limiting is expressed in terms of a maximum number of calls per a specific period in milliseconds. When a new trunk is created, its default is 100 calls per 1000 ms, that is a value high enough to mean "no CPS limits" for most scenarios.

Using a lower CPS limit does not usually affect so much the speed of your campaigns in real-life, as WD will only effectively "spread out" the calls to be dialed over a few seconds. If you are concerned about this, you can see its current impact by monitoring how often the status LIMITED BY TRUNK RATE appears on the running campaign in the Dialer State page.

Calls that end up on a blacklist are evaluated before they are scheduled on a trunk, so rate limiting is not influenced by the rate of black-listed calls.

Rate limiting is mostly useful if you have a number of channels that is bigger than your maximum CPS.

End-points

An end-point is where a call goes after being answered on the trunk.

End-point configuration

  • Server: is the Asterisk server the EP is on

  • Description: a free name that the EP will appear as

  • EP Type: it can be QUEUE (if it is an Asterisk queue - see below), API or PHONE in all other cases.

  • Max channels: the maximum number of parallel calls to be handled by this EP.

  • Located at Extension and Context: the location in the Asterisk dialplan where the EP can be reached.

  • Close to the Extension, there is the Test Connection icon button (see below).

  • Security key is the key that will protect this resource. Leave blank if not needed.

WD will try and connect answered calls from trunks to end-points on the same Asterisk server. If a campaign has multiple end-points, it will try to connect any EP that has free capacity.

An end point of type PHONE could be:

  • a dial-plan script that plays a recorded message

  • a physical phone given to an agent (set max channels to 1 to receive one call after the other)

  • an IVR script

  • a conference call

  • anything that can be programmed in Asterisk!

WD assumes that Trunks and EPs are always usable to their declared capacity, so it will try to fill them in as soon as possible (within allowed CPS limits). If they are to be shared, make sure you have enough capacity for WD plus other resources that may be using them. If you exceed their physical capabilities, you may experience REJECTED calls or a degradation of speech quality for VoIP. Beware!

Queue end-points

As a special case, it is possible to have EPs of type QUEUE. They are used to distribute calls on a set of agents that are members of a queue. WD will try and observe the queue, in order to determine:

  • how many agents are logged on to the queue

  • how many of them are currently available, that is, neither in conversation nor paused

  • how many calls are currently queued without being answered

The difference between the number of available agents and the number of calls queued is taken as the current capacity of the queue. This value is computed in real-time, so the EP will immediately respond to changes in state to its agent set and to calls queued.

Please note that you can use a single queue both for inbound and outbound activity: if the number of free agents exceeds the number of queued calls, WD will try and fill-in the rest. This makes it easy to implement small blended (inbound/outbound) call-centers.

If the number of free agents is below the number of calls waiting, WD will not place any call and will wait until there are free slots on the queue. This way:

  • calls are in general distributed to agents as soon as they are queued

  • if the number of available agents is not enough to serve calls at once (e.g because some logged off, or pause in the meantime) then calls are queued and picked up by available agents when they become free.

Queue EPs have a few additional parameters that control their behavior:

  • Queue Name: The exact name of the Asterisk queue being used

  • Boost factor: as most of the calls in a campaign are going to be unanswered, it is often effective to have WD place a number of calls that is a multiple of available agents. For example, if you have a boost factor of 1.5 and 4 available agents, it will try and place 6 calls at once. If more calls are completed successfully than the available agents, the remaining calls are held waiting on the queue. The boost factor is applied only on the number of calls that should be made to saturate agents that do not have a call currently in progress for them. Please note that the boost factor can then be managed on running campaign from the Live page, so you can tweak it dynamically as needed - see Boost factor on the Live page - or you can have WD manage it for you based on current traffic conditions - see Adaptive boosting

  • Max waiting calls: if there are more than this number of calls waiting on the queue, then stop making calls. The number of waiting calls is computed as the number of available channels on the queue minus the numbers of calls currently waiting, as Asterisk will report a call to be waiting even when it’s being connected. In theory there should never be calls queued, as they follow the number of available agents, but it is possible that either some agent logs off after being counted or some calls reach a queue without passing through WD. This also acts as a counterweight to high "boost factor" values, to avoid having too large a backlog of calls to process if we are having a "lucky streak" in terms of calls answered.

  • Reverse dialing: check to make this EP use Reverse dialing (see below for "Dialing mode")

  • Manual Preview: check to use Preview mode (only valid in Reverse mode)

  • Find and Replace: sometimes - notably on FreePBX systems - agents that are on a queue cannot be dialed directly, and therefore do not work in Reverse Dialing mode. You find that your queue has agents in the format 'Local/4851@from-queue' but what you would like to do is to dial 'Local/4851@from-internal' instead. By setting '@from-queue' as the Find item and '@from-internal' as the Replace item, you can easily obtain this result.

In addition to these parameters, the maximum capacity of the EPs is used - so if you have a queue with 100 agents but you set the EPs capacity to 10, WD will never use more than 10 lines on this EP at once.

General Asterisk tips for using Queue endpoints

In order to use WD effectively with a queue, the following guidelines are best followed:

  • Though WD works with static member channels, if you want your calls to go through to agents who may or may not be available (e.g. some days they may be sick) it is strongly advisable to use dynamic agents who log on and off from the queue.

  • As an agent cannot be physically available at all times during the day, it is important that they have a way to pause themselves, be it to run "wrap up" activities after calls or to take breaks. The QueueMetrics web interface offers an excellent panel that lets you add pause codes as well.

  • The queue must provide informational "events" about agent activities. On Asterisk 12+ this happens automatically, but on older versions it must be enabled by explicitly setting eventswhencalled=true and eventmemberstatus=true. It is also important that extension presence is correctly observed - e.g. if an end-point is busy because the agent is making a personal call, its queue status should immediately reflect this. Whether this happens or not on your system is a matter of Asterisk version and type of channel that is used to reach the agent - with recent versions of Asterisk and SIP channels this should work automatically. You can make sure this is working correctly by observing the queue status as described in Controlling the Dialer

  • The queue should connect calls to agent as efficiently as possible when there are multiple calls waiting and multiple available agents, so it should have the "auto-fill" option set to true.

  • Do not use the queue wrap-up feature. As Asterisk does not publish wrap-up events though the AMI interface, WD sees the agent as "idle" and tries routing calls to paused agents.

API-driven queue end-points

An API driven end-point behaves exactly like a Queue end-point, but will not actively monitor the queue located on its Asterisk server; in fact, it will use the queue name as a simple placeholder, and will wait for you to update its status through a periodical API call (see API documentation). Like every other queue end-point, you can see it in real-time - and check that your API updates are working - from the Dialer State page.

Why would you want to use something like this? for example, because you have WD use a server to dial out, but then you trunk calls from the main server to another one holding the actual queues being used. Or you use WD to dial out, but actual queues or end-points are on a server that is not Asterisk based, and you want to control how quickly WD is dialing out.

The way it works is that, on agent status changes, you send WD:

  • A list of agent channels that are currenty IDLE, DIALLING, BUSY or PAUSED

  • A list of calls that are queued on the remote system (that is, not yet assigned to an agent, but about to)

If you use reverse dialling, it is important that the channels you publish let the local Asterisk reach the remote agent, so they must go through a trunk (e.g. SIP/destinationserver/123).

If you just use direct dialling, you do not need to tell WD about the exact agents being involved; you just need to tell it how many agents are in whatever state. The API offers a simmplified call format to handle this common scenario.

The biggest challenge you face in using API updates is making sure that you send WD an updated picture on time, so that it can make sensible decisions at the right time.

For example, if you tell WD that there are two free agents, but fail to notify it that those agents got busy, it will keep on trying until agents do get busy - that is, never. This may or may not be what you are looking for.

Dialing modes

Depending on how you set up your end-point, WombatDialer offers different dialing modes.

  • Direct dialing is the default and works with extension and queue end-points. When doing direct dialing, WD will first try to connect the callee and will then route the call to a local extension, that may or may not be a queue. This is fine for delivering voice messages or for situations where any agent can process any call. When working with call queues, this dialing mode might introduce a slight delay, as the call has to be answered by the agent - not usually a big deal, but it might be there.

  • Reverse dialing has WombatDialer connecting the agent first and then placing the call. This is less effective in terms of agent efficiency than direct dialing, as the agent has to wait for the call to connect. The big advantage is that when the callee picks up, he is immediately on line with your agent. WD picks an agent at random from the available pool in order to share the load with all available agents.

  • Reverse preview dialing has the agent reviewing the call before the call is made. This may happen through the API, or by using a special page that WD offers. A number is "reserved" when an agent is to dial it, and the agent has 10 minutes to accept it (and have it placed) or skip it. Calls skipped are marked as such and not retried, unless you set up a reschedule rule to have them retried. Calls for which a decision is not made within 10 minutes are simply returned to the pool of callable numbers.

When using reverse dialing (vanilla or preview) WombatDialer uses a queue to keep track of agent presence. This lets you manage log ons, log offs, agent pause and unpauses the same way you would for inbound queues. Also, as agent state is shared across multiple queues, you can have agents working on multiple queues at once. In reverse dialing, through, calls are NOT connected through queues, as WD decides which agent is to receive which call; in order to do this, the agent channels are connected directly without going through the queue.

When using preview dialing, the agent must reserve a call before it can be placed. In order to do this, WD offers a rich API for your integration software see Preview API.

WombatDialer includes a simple preview panel that can be called as a web page and lets you reserve calls and open external URLs for previewing - typically you will use it to preview a call in your CRM software before it goes live. See the Preview Page for more information.

A simple example tutorial on preview dialing can be found in Preview dialing with Elastix, WombatDialer, QueueMetrics and SugarCRM.

Safety measures when running in reverse dialing

Though most calls will correctly be handled in Reverse or Reverse Preview mode, it is always possible that a call gets "stuck" because the agent that was to serve it was not able to complete it or to answer the phone (this often happens with remote agents becoming suddenly unavailable because of network problems, or because their soft-phones crash. It’s wise to make plans in advance).

In this case, WD has a set of built-in safety measures, including:

  • If a call stays reserved for more than 10 minutes, it is unreserved and put back in the pool

  • If an agent is not able to answer to a call that they asked for within 60 seconds, the call is closed with state RS_NOAGENT. You should usually add a reschedule rule in order to "recycle" those numbers.

Testing end-points

The Test connection button allows you to check your End-point. In order to do this, WD:

  • first, makes sure that there is a working Asterisk connection

  • if the EP is of type queue, checks that a queue with the name defined in Queue name actually exists on the server

  • then it tries dialing a channel on the end-point, as defined in "extension" and "context". If all goes well, the number is called and a whistling "milliwatt" sound is played.

When running a test on a queue, make sure that your agents are aware that a test call playing "milliwatt" will be sent to one of the available agents.

Call lists and call records

Call lists are sets of numbers (or more technically, sets of call records) ready to be dialed.

Call list

After being created they cannot be deleted, so you will end up having quite a number of them. In order to avoid having too many of them as visible/selectable items, it is possible to set a "hidden" flag so that they disappear from normal views.

As happens with the campaigns, you can enter a tilde "~" symbol in the search box to see all lists, including hidden ones. All searches happen on both visible and hidden lists.

If you add calls to running campaigns through the APIs, WD will create a hidden list called "CampaignName/AUTO" to which all of your new items will be added to. This list behaves a bit differently than ordinary lists when run - see Automatic lists.

It is possible to import and export data from lists through the GUI, and it is possible to create new lists based on the final state of existing campaign runs from the Reports page.

A call list will store multiple instances of the same number and will dial them in succession; so if you upload the same set of numbers multiple times, you get them called multiple times.

As with other WD resources, call lists can be protected by Security keys.

Call records

A call record represents a single number to be dialed by WD.

Call record

  • Number is the number to be dialed

  • Attributes are an (optional) set of variables that are sent or read from Asterisk during the call processing phase.

Attributes make WD very powerful: input attributes are sent to Asterisk along the number and are available at the dialplan level as standard channel variables, and can also be used to compose the internal or external caller-id. Output attributes instead are values set by Asterisk on this call and are meant for data collection.

You can manually edit the number or the attributes from the web GUI, though you cannot delete an existing call record.

Campaigns

A campaign is the basic unit of work of WD. It behaves as a template for running an actual campaign, that we call a Campaign Run. A campaign defines:

  • a set of general properties

  • a set of trunks

  • a set of end-points

  • a set of list (zero or more). They are further classified as normal or black lists.

  • a set of reschedule rules

  • a set of disposition rules

  • a set of opening hours

A campaign can only be run one at a time - before running it again, you must make sure that any actual runs are terminated. Trunks, end-points and list are instead shared entities - you can have multiple campaigns using them at the same time.

Campaign configuration

If you are running a campaign that does not appear to work, remember to check the Dialer state page that has a deeper view of the decisions WD takes for each specific campaign.

The following properties are defined for a campaign:

Basics

  • Name: a name to display in WD

  • Priority: the relative importance of this campaign against any other (see below)

  • Status: this field lets you decide what to do with the campaign:

    • RUNNABLE: this campaign can be run

    • CLOSED: this campaign cannot be run, but it is still visible in the default editor

    • HIDDEN: this campaign is not visible anymore unless you set the flag "Display hidden campaigns"

    • ERROR: this campaign is marked as an error. Cannot be started but visible.

  • Idles on termination: whether this campaign terminates when out of numbers, or will live on waiting for more numbers to be added via the API

  • Batch size: The number of calls to be placed that are cached in memory when reading from the database. They should be roughly 2x the size of outgoing trunks. The higher your batch size, the less disk accesses to find new numbers are necessary; the lower it is, the more "snappy" Wombat is in picking up new numbers or reschedules.

  • Security key is the optional key that protects this resource.

Active Period

  • Start active period: the time of day after which this campaign can place calls

  • End active period: the time of day before which this campaign can place calls

  • Allowed Days of Week: the days of the week that the campaign is allowed to run on

Call Placing Details

  • Answer timeout: if the number dialed does not answer within this period (expressed in milliseconds), consider the call to be a NOANSWER

  • Forced closure: the maximum length of this call, in seconds. If reached, the call is forcibly closed and set to status TIMEOUT. Set to zero to turn off.

  • Dial CLID: the caller-id to use for this campaign. This may be overridden by your provider.

  • Agent CLID: the caller-id that will be set on the end-point. This might for example be the internal code of the campaign, or the name of the called person. If the Agent CLID is not displayed correctly, try adding a short delay between the start of the EP leg and the queuing, so that WD has a bit of time to set it up before the call is queued.

  • Dial account: the account code that will be used by Asterisk when writing CDR records

  • Dial presentation: The number to set as "call presentation", that is the number that callees are expected to see as the caller-id. This may be overridden by your provider. Currently not used - use Dial CLID instead.

  • Auto-pause: if this is set and the campaign has queue end-points, each agent will be automatically paused when the call terminates (so that they can process their wrap-up activities). The agent will then have to manually unpause when he is ready to take a new call. (Note: this is not currently implemented).

  • Campaign variables: a set of variables defined for this specific campaign. They should be in the format "A:B,C:D" to set a dialplan variable "A" to "B" and "C" to "D".

Amd & Boosting

  • Boosting model: turn this on to enable Adaptive mode (see Adaptive boosting) or leave to OFF for manual mode (controlled by the default boost factor and the manual boost factor on the Live page).

  • Initial boost factor: This is the extra boost factor applied when a campaign runs. This value can be modified dynamically through the Live page.

  • AMD FAX tracking mode: Determines which AMD/FAX tracking mode is to be used. If AMD or fax are to be detected, the dialplan variable AMD_MODE is set to the required mode. See AMD and fax tracking.

  • Extra AMD settings: A string of additional parameters to be used when doing AMD detection. This is translated into the dialplan variable AMD_EXTRA. You may or may not want to use this.

  • Audio file to send on AMD: The name of a file to be sent to the client on AMD detection. This is passed to the dialplan under the name AMD_FILE

  • TIFF file to send on fax: The name of a TIFF file to be sent to the client on fax detection. This is passed to the dialplan under the name FAX_FILE

Logging

  • Additional logging: set to QM_COMPATIBLE to have the campaign log to 'queue_log' on the Asterisk server

  • Alias for logging: if this field is set, this is the name that this campaign will be logged under on the 'queue_log'. If empty, the name of the campaign is used. This way you can have multiple WD campaigns log as the same Asterisk queue.

  • Attributes to be logged as QM variables: which attributes (if any) are to be sent to QueueMetrics. See Logging of attributes for a detailed explanation.

  • HTTP notification URL: the URL to be called when a call has a state change in WD

  • Send campaign events by e-mail: whether WD should send life-cycle notifications by e-mail. Can be set to:

    • NO: No notifications.

    • ALL: All campaign life-cycle changes.

    • FINISH: Send only on campaign completions.

  • E-mail addresses: a set of e-mail addresses to receive notifications for this campaign.

A campaign has a priority so that you can have multiple running campaigns at the same time. Priorities are taken into consideration from the lowest to the highest, where each priority level has a go to fill in all available channels; if some available channels are left over, campaigns with a higher priority number are processed. For example, imagine you have a campaign of priority 1 linked to a queue (for human outbound) and then a quality review automated campaign running at priority 10. If there are available agents, it is just natural that the campaign at priority 1 has its go first at placing calls. But if for example some of your agents are paused, then not all outbound lines are used - in this case, they are used by the campaign at priority 10. As soon as your agents go back on line, calls for them are dialed first.

If you have multiple campaigns at the same priority level, they are offered a fair chance of placing calls, so you would expect them to place roughly the same number of calls if calling an homogeneous set of callees. In practice the numbers may differ based on call length, call completion ratio and average answer times.

You can define an active period for calling, so that you can e.g. tell WD to place calls between 9 AM and 4 PM of working days. Any reschedules will be placed only in the active period. If the campaign is in its active period, then any Opening Hours linked to the campaign will be processed. They will be processed in the order they are defined, and in case of no match, the value from the last rule will be used to decide whether the campaign can run or not. See Opening Hours.

There is no guarantee as which trunks and end-points will be chosen when a campaign is running. Call lists instead are processed in order from the first to the last.

If you want WD to send you e-mail when something happens on a campaign, you should make sure that you configured the SMTP parameters as explained in Configuring e-mail. You can have WD send you notifications for all campaign life-cycle event changes, or simply when the campaign completes.

What happens to hidden campaigns?

Hidden campaigns are removed from the editor so that you don’t have to see them all of the time. They are still present on the database, and may be found again by:

  • entering a search string. It will match all campaigns, including hidden ones (this way it easy to access them and un-hide them if necessary)

  • entering a single tilde "~" in the campaign search box. This will display all campaigns, whether they are hidden or not.

Using attributes in Caller-Ids

WombatDialer lets you enter placeholder values in the Dial CLID, Agent CLID, Dial account, and Caller presentation fields. These values are expanded when a call is actually being connected using the values of attributes set for the number dialed.

For example, you may be dialing number 5551234 to reach Mr. White. You may upload a list of numbers setting the attribute NAME to the name of the person called, and you may want the caller-id changed when the call reaches your agents so that they see "WHITE" instead of the campaign’s caller id. Or you may dial a list of numbers by setting an unique call presentation for each of them.

In order to do this, you have to specify attributes to be expanded. For example, if you set the agent CLID of your campaign to "C1 ${NAME}", agents will see on their phone "C1 WHITE", "C1 SMITH" and so on. You may use multiple variables in the same ID, so that you can pass along a practice ID, or the code used to find the person called in your CRM.

Together with the custom attributes you manually define for each number, WombatDialer will also expand:

  • ${NUM} to the number being called

  • ${LST} to the name of the list that the number belongs to

Adaptive boosting

WombatDialer has a zero-configuration adaptive-boosting mode that lets Wombat manage the over-dialing rate of a queue-based campaign. This way, you can start with a rough idea of the required over-dialing rate (say, 3x) and Wombat will tweak it continuously based on recent traffic, state of the underlying queue, current completion rates and nuisance calls detected.

The model is based on the fact that the quality of traffic on the same campaign, with leads coming from the same list, is strongly correlated in time; so by looking at recent data it is able to extract reasonable call patterns and adapt the current over-dialing rate.

The adaptive model is allowed to boost calls in the range from 1x to 4x; this way, if you are running a campaign with a default boost factor of 2X, the booster will have it run between 2X and 8X. On top of this, you can always use the Boosting control from the Live page to further correct the current amount of applied boosting.

Please note that the adaptive booster will try counterbalancing any change you make manually, so you should use the manual toggle only to "speed up" the adaptive convergency behavior in case the dialer should not be aggressive enough at pursuing it.

As with all adaptive and predictive models, the quality of its predictions is strongly linked to how much data it has and how many calls are being made at once, as higher numbers tend to make the system more stable and smoothen its variance.

It works well if you have a good number of calls (dialing at least 40 channels simultaneously) where it can usually get you an agent occupation of 60% to 80% with a nuisance rate of about 1-3%, and it scales back reasonably well for smaller systems with about 10 channels. Of course these figures may be significantly different based on your traffic patterns.

An adaptive boosting example

The following simulation is based on actual real-life data; it shows you a situation where you have 30 agents and you are initially over-dialing at a rate of 10X, for a period of a few hours, placing a total of about 100,000 calls. The blue line in the graph is the actual number of agents that are in conversation.

No boosting model

As you can see, the over-dialing rate is initially adequate, but the blue line often has "valleys" where the over-dialing rate is not adequate. Especially in the second part of the campaign, traffic patterns change and Wombat is not dialing effectively anymore. At the end of the campaign, agents have an utilization of about 56% and a nuisance rate of about 3%.

Adaptive boosting model

By using the adaptive model, you can see that the blue line is consistently higher, and that it matches trends in calls by counterbalancing the quality of traffic. By the end of the campaign we have a total utilization of 73% (+30% over the basic model) with a nuisance rate of 4%.

This example was chosen because the quality of the leads was intentionally pretty bad, and this is the case where you have the highest improvement in using a predictive model.

Reschedule rules

It is a fact of life: most calls placed on an outgoing campaign are destined to fail. Maybe the user is not available, maybe your provider has a temporary failure, or maybe your PBX (or even WD itself!) crashes while calling. It is advisable to take this into consideration when programming a campaign. For example, you could say that:

  • if a number is busy, you retry two times after 5 minutes each

  • if a number does not answer, you retry two times after 30 minutes each

  • if a call has a technical glitch and ends in error, or is lost due to a PBX crash, then retry it once in 10 minutes

The number of retries is computed after the call is first attempted - so if you have a retry rule of 2, the call is first tried once and then retried twice, for a maximum of three times if it goes wrong every time. All retries are attempted in the active period of the campaign - so if a call is rescheduled in 20 minutes at 5:50 PM and the campaign is not allowed to run after 6 PM, then it is retried the next day.

WD in general tries first to obey any applicable reschedules and then fetches new calls form call lists, so you can expect the retry period to be quite accurate in most scenarios. Still there is no hard guarantee that a call will be placed at exactly the time it was rescheduled for.

Parameters are set as follows:

  • On status: the call status this rule applies to

  • With custom status: the custom status to consider (see below). Custom statuses can be set through the API - see Controlling WD from Asterisk.

  • Max Attempts: the maximum attempts this rule applies to. If zero, it always applies and the reschedule counter is not incremented (see below).

  • Retry after: the number of seconds to retry after

  • With mode: the way to compute the retry period

Each rule is evaluated against the current number of attempts for the call, so it does not take into consideration the statuses for previous attempts.

When rescheduling, you can set the mode to FIXED or MULTI. In fixed mode, if you set the retry time to 5 minutes, it tries after 5 minutes at every attempt. In multiplicative mode, the retry period is computed multiplying the number of the current attempt by the number of attempt it’s trying - so it would be 5 minutes on the first attempt, 10 minutes on the second, 15 minutes on the third and so on.

If a call has a normal completion or is over the maximum number of retries, then it is not rescheduled. You can look-up the status of the last attempt in order to know why it was not rescheduled.

Writing advanced reschedule rules

It is valid to have multiple reschedule rules that pertain to the same status code - in this case, WD will find the rule that matches. For example, imagine we have two rules:

             Attempts   Retry in
             --------   --------
RS_BUSY         2         300s
RS_BUSY         5        1800s

Up to the second BUSY attempt, WD will retry in 5 minutes (300 seconds); from the third to the fifth, it will retry in 1800 seconds (30 minutes).

The status code considered is always the current status code; so for example given this set of rules:

             Attempts   Retry in
             --------   --------
RS_BUSY         3         300s
RS_NONASWER     1         600s

If we get a BUSY on first attempt and a NOANSWER on second attempt, as the NOANSWER retries only once, the call is not retried.

You can also have an extended status set through the APIs - if that is present on the call, the rule matches only if the extended status matches - see Controlling WD from Asterisk.

If you specify an ExtStatus for the call, then only the same ExtStatus will match. If you do NOT specify an ExtStatus, then the rule will match any ExtStatus. If you need the rule to match only on an empty ExtStatus, then you must set it to '$'.

Handling technical errors through Reschedule Rules

Sometimes you do not want to treat technical errors (e.g. statuses like RS_LOST, RS_NOAGENT and RS_ERROR) as normal recalls: you want to keep track of the number of recalls and handle them accordingly only for calls that actually try to reach a person.

In this case, you can enter zero as the maximum number of attempts; the rule will match no matter how many recalls you are having (and will be preferred to other rules), and the number of attempts will not be incremented on the next recall.

When you run a report for the number dialed, it will then be possible to see a number of calls having the same "attempt number"; this is correct, it means the rule matched and was applied successfully.

As these calls do not increment the recall counter, this feature can send calls into an infinite loop; therefore it is important that you only handle transient technical errors with this, and that the reschedule time is high enough that the problem will likely be resolved before the call is attempted again.

Disposition rules

Disposition rules are like Reschedule Rules; the main difference is that while a Reschedule Rule is applied on each call tried, a Disposition Rule is matched only when the call is not rescheduled further.

For example, let’s say that you are dialing out on a campaign where there is a reschedule rule to retry twice in 10 seconds on busy. You dial a number, and the number is busy; it is rescheduled in 10 seconds, retried and it’s busy again; it’s rescheduled again, and again it’s busy. At this point the call is "complete", meaning that it is not meant to be rescheduled again. So, the call will be matched against any disposition rules with the current status of "busy".

With disposition rules, you can have actions that are more complex than reschedule rules and are meant to interact with external systems. You can:

  • Call an HTTP service of type GET or POST, with a variable payload.

  • Send an email (for example, if you want someone to be notified when some rare status happens)

  • Add the number to an existing list,

  • Add the number to an existing blacklist. This is the same thing as adding the number to a list, but with an optional parameter to control the amount of time the number is to be blacklisted.

  • Pipe the number to be recalled on a different run. The run must be active at the time the number is added.

Multiple rules may match the same call, so for example you might be sending two separate HTTP notifications and an email, or you could reschedule the number to be recalled and add it to a new list at the same time. Matching happens on the basis of the (last) dialing state. If the rule specifies an extended state, it is to be matched as well.

When a Disposition Rule is matched, sometimes it is useful or necessary to access some information from the call and put it in the request, for example to specify the number called in the email body. WombatDialer offers a number of variables that you can use for this purpose:

  • NUM is the number dialed

  • N_RETRY is the number of retries made on this call

  • LIST is the list name

  • STATE is the current state

  • EXTSTATE is the extended status (if set)

  • CAMPAIGN is the name of the campaign that this call was dialed upon

  • RUNNAME is the name of the current campaign run

  • ATTR is a prefix that lets you access call attributes. They can be inbound or outbound attributes.

So if you set an HTTP GET URL of ''http://server/page.php?num=${NUM}&var=${ATTRV}'' will be rewritten with the current number and the current value of attribute V.

When doing a disposition to a list or a different run, you can control which attributes are to be set on the new number. You can decide if you want ALL, NONE, INBOUND or OUTBOUND attributes; plus you can manually specify a set of attributes which values will be set on the new call.

Blacklists

WombatDialer has the concept of Blacklists; they are lists like any other but are used to collect numbers that are not to be called. A discursive explanation of how they work and interact with the rest of the system is available at Understanding blacklists .

When WombatDialer is loading numbers to be dialed, they are checked against all black lists defined for that campaign. This is done automatically and behind the scenes; if a number is found, it is logged as dialed in state BLACKLIST without actually trying to dial it.

Blacklists are checked dynamically when a number is first scheduled; so if you add numbers to a blacklist while a campaign is running, new numbers to be scheduled will be checked against the blacklist.

Starting with WombatDialer 19+, black lists are checked two times:

  • every time a number is fetched to be dialed, and

  • just before actually dialling it, every time this is supposed to happen.

This way, if you add a number to a blacklist, future retries may be blacklisted even if the original call was not.

You may have multiple blacklists on a campaign; their order in unimportant. All numbers are checked against all defined blacklists at once.

A number may be added to a blacklist up to a specific point in time; this means that the number will be a valid match for the blacklist only until the date passed is in the future. In order to do this, you need to set a call attribute called BLACKLISTED_UNTIL with a valid date in the format "YYYY-MM-DD.hh:mm:ss" or "YYYY-MM-DD". You may also have an expiry date computed for you by using a Disposition Rule to add the call.

Note that if you use the shorter date format, the number is supposed to be blacklisted until the midnight of the given day. If the date format is not valid, the number will be blacklisted forever.

It is perfectly acceptable to add a call multiple times to a blacklist, each time having a different expiry date. The number will be blacklisted up to the maximum date specified.

If you need to cancel a blacklisted number, you might remove the number from the list or, better, add a special attribute BLACKLISTED_CANCELLED that we suggest to use to record the reason why blacklisting was cancelled. This attribute only happens to the specific number, so if the same number is present multiple times, then each of them must be cancelled separately. See also Cancel numbers from a blacklist.

When using blacklists, we suggest using an attribute to store the reason why a number was blacklisted, and a reson why the number was removed from a blacklist. This will prove invaluable for your future self when tasked with auditing why a call was or was not actually placed.

Automatic lists

You may add calls to a running campaign through the API; those numbers will be added to a list called NameOfCampaign/AUTO that is created automatically. This list is just meant as a container to store those numbers and is always present after you add at least one number through the API.

Automatic list are very useful, but they come with a couple of warnings. The first is that an auto list is never explicitly linked to a campaign – it just exists. It acts like a kind of placeholder for calls that were scheduled dynamically – as each and every number has to be a part of a list, your automatic list is the place they will go to.

The second is that the content is not fixed like a call list you upload from a file - it grown as numbers come in while a run is in progress, so it’s final content is the one at the point you stop adding a new number to it.

This has a couple of consequences that may - but most likely will not be - what you want:

  • If you add an existing automatic list to a different campaign, it is executed as a normal list, up to the point when it contains no new numbers. At that point, the campaign will consider it done and stop running it. If you add some new numbers after the list has been completed, the campaign will not process them (exactly the way it would do with a normal list to which you add some numbers after it was completely run).

  • An auto list must not be added explicitly to its owner campaign. If you do, what happens is that the campaign will run (again!) all the numbers that are on the list. And like in the previous case, any numbers that were not included at the point the list was terminated will not be run again.

So, in general, it is OK to add an automatic list from a closed campaign to another campaign, but it’s not wise to add an automatic list for a campaign that is still running to another campaign - because you definitely want to know in advance which numbers will be processed and which ones won’t.

What you most definitely don’t want to do, is add explicity, at setup time or during its execution, an automatic list to the very campaign it belongs to.

As a general policy, we suggest to never add automatic lists to campaigns. Don’t do it. If you need to recall all numbers in a different campaign, create a new list out of the same numbers and use that instead.

AMD & Fax detection

WombatDialer allows you to track answering machines (AMD) and faxes. Following the general WombatDialer philosophy of leveraging the capabilities of your PBX, WombatDialer sets a series of additional dialplan variables that are to be used in order to detect them and react accordingly. This way:

  • You configure AMD and/or fax detection on your PBX

  • When either detection triggers, you have variables that tell the dialplan how to handle those cases

In general, we suggest using an extended status of "AMD" when an answering machine is detected, and "AMDSENT" when a message is left on the machine; and "FAX" when a fax is detected and "FAXSENT" when a fax is successfully sent.

It is also wise to offer your agents a quick blind transfer hook that lets them transfer calls to AMD or FAX routines in case the detection went wrong. See Call transfers.

Working with AMD and fax can be tricky. Make sure you can talk to an Asterisk consultant with a proven experience before running a large-scale campaign.

Detecting answering machines

Asterisk ships with an application called AMD that will analyze audio and try to guess whether the other party is a live person or an answering machine. Keep in mind that the call does not "go through" while the analysis is in progress, so there is a definite trade-off between a long and accurate detection versus a quick but less accurate detection.

AMD receives a set of parameters to discriminate what is an answering machine and what is a live person, so you may want to experiment a bit to find a setup that works for your country and for your callers.

A good starting point would be to set in amd.conf the following parameters:

initial_silence            = 2500
greeting                   = 1500
after_greeting_silence     = 300
total_analysis_time        = 5000
min_word_length            = 120
between_words_silence      = 50
maximum_number_of_words    = 4
silence_threshold          = 384

It is also customary to send a background tone (be it blank or a beep) to the called party to help set-up the line on SIP circuits. This way the accuracy of AMD is reported to be increased considerably.

So you would:

  • Play audio, e.g. via 'Background(beep)'

  • Run AMD, optionally passing the contents of AMD_EXTRA if you want to override the default parameters

  • Check the status of the dialplan variable AMDSTATUS. If set to "MACHINE", go to the AMD processor; else route to a live agent. You may want to log the AMDCAUSE as well; it contains an explanation of the reason why Asterisk decided the call was of the specific kind.

  • On the AMD processor, set the extstatus to "AMD", so that Wombat logs this call as an Answering Machine

  • Wait for silence (so the greeting message is terminated)

  • Play the audio file defined in AMD_FILE

  • Set the extstatus to AMD_SENT

  • Hang up.

An example is available in Answering-machine detection.

Detecting faxes

Asterisk is natively able to detect faxes on DAHDI and SIP channels; all you have to do is tell it to run the detection engine.

  • For DAHDI, you have to turn on the option "faxdetect" in chan_dahdi.conf by setting it to "incoming", "outgoing" or "both".

  • For SIP, you need to turn on "faxdetect" in sip.conf. Valid options are "cng", "t38" or "yes" for both.

When a fax is detected, the dialplan will jump to the extension "fax". At this point:

  • you set the extstatus of the call to "FAX" in Wombat (so it can be traced)

  • you send a fax by issuing the command 'SendFAX(/path/to/FAX_FILE,d)', where FAX_FILE is the file name set through the GUI

  • you set the extstatus to "FAXSENT" in Wombat

  • you hang up the call

The file must be a valid TIFF file that is compatible with Asterisk. Digium’s "Fax For Asterisk Administration Manual" documents a process for converting a PDF file into a TIFF using commonly available Linux command-line tools.

Campaign runs

Campaign runs are real, out-calling instances of campaigns. You start them from the Live page, by selecting one of the available campaigns. They are named after their parent campaign and the time when they were started.

The system displays a set of information on the Live page:

Campaign name: C1
Started at: Wed Oct 17 15:54:22 CEST 2012
Current state: COMPLETED
Priority: 10
Calls placed: 40 - Items in call cache: 0
Calls terminated: 10
Life-cycle termination rate: 25% - Reschedule rate: 75%
Est. remaining calls: 0
Running for: 00:00:05 - Estimated completion in: 00:00:00
Attempts per hour: 72720 - Completions per hour: 72720
High-water mark: 20 in L2

The run name is actually made of the Campaign name plus the time it was started. This uniquely identifies a run in the system.

The other parameters are as follows:

  • Current state: is the state the run is in (see below).

  • Priority: is the campaign’s priority

  • Calls placed: is the total number of call attempts made

  • Items in call cache: is the number of calls currently held in the hopper plus any open reschedules

  • Calls terminated: is the numbers of calls that have either been successful or gone through the last possible reschedule, so they will not be retried

  • Life-cycle termination rate: is the percentage of calls that are not to be retried (terminated)

  • Reschedule rate: is the percentage of calls that are to be retried

  • Est. remaining calls: this is a rough estimate of calls that remain to be placed. Might be rather inaccurate - consider it only a basic indicator that will converge to zero as the run terminates.

  • Running for: is the total time that this run has been going.

  • Estimated completion: tries to display the remaining time to completions. This time may actually vary strongly from what is displayed depending on what happens during the campaign. Estimates will be produced after a few calls have completed.

  • Attempts per hour: its the average number of calls attempted per hour on this run

  • Completions per hour: is the average number of calls completed per hour

  • High-water mark: the last call record added to the cache

A run’s life-cycle

When a run is first started, it goes through a set of stages.

Run life-cycle

Initially the run will be made RUNNABLE, WD will prepare to run it and will put it in RUNNING state. A run stays in state RUNNING as long as it has retries to complete or calls not yet placed. When a RUNNING campaign is out of the allowed time period, it is put to WRONG_TIME; from here it goes back automatically to RUNNING state when time conditions (hour and day of week) are successfully matched.

When out of calls, a run can either COMPLETE or become IDLE; when IDLE it waits for new calls to be added through the API and goes back to RUNNING mode to process them.

A RUNNING campaign run may be manually PAUSED and from PAUSED it can manually be made RUNNING again.

If a run is no longer needed, it can be manually set to REMOVE; when in REMOVE status the run is terminated and cannot be restarted.

A call’s life-cycle

When a call is started, it is first loaded in a cache called 'hopper' that contains calls that are to be dialed soon. This way it is not necessary to consult the database for each and every call to be made.

Call life-cycle

When WD is about to place the call, it marks it as SCHEDULED and sends it to Asterisk for processing; if all goes well, it then goes from REQUESTED to DIALLING to CONNECTED and then TERMINATED.

Of course it may not be possible to start the call (so you get BUSY, NUMBER and NOANSWER states), or the call might be ended by WD because it exceeded the maximum allowed duration (TIMEOUT).

When using reverse dialing, a call starts its life being RD_SCHEDULED, so that the agent can be called. When this happens, the call progresses forward. In preview mode, the call is first RD_RESERVED and when the agent approves it, it is placed.

Initial states
IN_HOPPER

Call will be placed soon - not visible to user

SCHEDULED

WD requested the call to be placed

RD_RESERVED

When preview dialing, an agent has reserved this call but has not processed it yet

RD_AGENTREQ

When doing reverse dialing, WD is connecting the to an agent before the call is actually placed

Call processed
REQUESTED

The request was sent to Asterisk for processing

RD_REQUESTED

Asterisk is processing this call when reverse dialing

DIALLING

Asterisk confirmed the call was started

CONNECTED

The opposite side picked up the call

TRANSFERRED

Agent transferred the call somewhere else. The agent is free but the trunk’s channel stays in use. This call is not controlled by WD anymore.

Error states
RS_ERROR

A technical error happened while dialing

RS_LOST

WD lost track of this call. Usually happens only on system crashes.

RS_NOAGENT

An agent that was being pre-dialed in reverse mode did not answer. You should reschedule those calls.

Calls that could not go through
RS_REJECTED

The call was rejected by the network. This is usually caused by the upstream provider returning ''Congestion'' (all circuits busy), ''Off-hook dialing'' with analog interfaces, or your upstream provider terminating a call before it’s answered without providing any status code.

RS_BUSY

Number called was busy.

RS_NUMBER

Number called appears to to be invalid. Asterisk also raises this error if it cannot allocate a new channel for the call.

RS_NOANSWER

Number did not answer within the 'Answer timeout' period set on the Campaign

Completion states
TERMINATED

Call completed successfully

RS_TIMEOUT

Call was forcibly closed because it exceeded the maximum allowed duration set on the Campaign.

RS_AGENTSKIP

Agent decided to skip this call.

RS_BLACKLIST

The call was skipped as the number was blacklisted.

States not already implemented
RS_AGENT

Agent requested special retry.

Call transfers

This feature is currently experimental and may be subject to changes in future versions.
This feature requires Asterisk 13 or newer, and won’t work on earlier versions.

WombatDialer is able to track calls that are transferred by the connected agent. Once a call is transferred, it keeps existing in WombatDialer, but the agent is freed so they can take another call.

The agent can transfer a call using two ways:

  • With a Blind Transfer, that is, forwarding the call to a fixed destination, for example a second-level queue. This is usually implemented using the feature code ## in FreePBX, but your PBX may be set for a different feature code

  • With an Attended Transfer, where the agent dials an extensions, speaks to the receiver, and either confirms the transfer or goes back to the original call. In a stock FreePBX system, this uses feature code *2 to start the transfer and *2 to confirm.

When a call is transferred:

  • Direct calls keep existing on the Live page (in state TRANSFERRED), and are logged until their full completion (time talking to the agent plus time until call completes); still the agent is freed at the moment the transfer is confirmed and can take another call

  • Reverse calls are closed by the moment the transfer is acknowledged, so the call length is only the one spent in conversation with the agent.

Opening Hours

It is very often needed to have a finer level of control on the opening hours of a campaign.

Typical scenarios include:

  • Having different opening and closing times for a campaign during the week. For example,you might want to dial out from 9:30 to 11:30 and 13:30 to 17:00 Monday to Thursday, and only 9:30 to 13:00 on Fridays.

  • Marking specific time periods as invalid; for example, public holidays.

It is also often needed to maintain and share these "opening hours" across campaigns; for example, by having one single instance of public holidays to be shared across all campaigns.

Opening Hours work by defining a set of items that must match for a rule to be considered valid.

  • Rules are scanned from top to bottom, in order

  • If a rule matches, its output will be passed to the campaign.

  • If no rule matches, the campaign can ask a rule for a default value.

For example, let us say that we want to implement the multiple hours scenario as described above:

Rule  DayOfWeek      DateFrom DateTo    TimeFrom   TimeTo    State

 #1   Mo Tu We Th    -        -          9:30:00   11:30:00  OPEN
 #2   Mo Tu We Th    -        -         13:30:00   17:00:00  OPEN
 #3   Fr             -        -          9:30:00   13:00:00  OPEN

You could also have a separate rule based on dates to flag some days as always invalid:

Rule  DayOfWeek      DateFrom DateTo    TimeFrom   TimeTo    State

 #1   -              25/12    26/12     -          -         CLOSED
 #2   -               1/01     1/01     -          -         CLOSED

Rule 1 tells us that December 25 and 26 are always invalid; and January 1 is as well.

When running on an existing campaign, you first have to make sure that the campaign is allowed to run in the specific time period.

In most cases, you will want to keep the campaign always active and tweak associated Opening Hours instead. This lets you use campaign rules for very simple campaigns and Opening Hours for more complex scenarios.

Then you would add:

  • First the Opening Hours based on dates. If any of these match, we know that we cannot run.

  • Then you would add the rule about time periods by day, with a default of CLOSED.

The order in which you add Opening Hours to a campaign is important, and so is the order of rules within an existing Opening Hour.

Opening Hours Inspector

Under the Opening Hours tab, inside of the Campaign Editor page, you can see a button named "Test Opening Hours". This button opens the Opening Hours Inspector, a tool designed to preview the effects of Opening Hours rules on your campaign.

Opening Hours Inspector

As you can see in the picture, the inspector shows a colored bar for each day of the week, each color representing the state of your campaign in different times of the day. You can choose the date from the calendar widget at the top of the inspector.

If you fly with your mouse over the colored bars, WombatDialer will show you a pop-up text with the state of the campaign, the name of the rule that is being applied and the name of the matching sub-rule. If a sub rule has no name is automatically named after a number in a sequential fashion.

Here is a list of the possible states for a campaign:

  • OPEN: The campaign is open due to the campaign active period (no Opening hours rule applied).

  • CLOSE_DAY: The campaign is closed due to the campaign active period (no Opening hours rule applied).

  • CLOSE_HOUR: The campaign is closed due to the campaign active period (no Opening hours rule applied).

  • CLOSE_RULE: The campaign is closed due to an explicit Opening Hours rule.

  • OPEN_RULE: The campaign is open due to an explicit Opening Hours rule.

  • DEFAULT_OPEN: The campaign is open due to the Def. Mode of the last Opening Hours rule

  • DEFAULT_CLOSE: The campaign is closed due to the Def. Mode of the last Opening Hour rule.

Call logs

After a call record is processed, it leaves a "trail" in the form of a call log.

Call log detail

From here we can see:

  • Call: this section displays the number that was called and any attributes that are set on that call record. Any output attributes (coming from Asterisk) are marked with a ">" prefix.

  • Campaign: the name of the campaign that this call was placed on

  • Run as: the name of the campaign run that had this call placed

  • Run started: when the campaign run was started

  • List: The list this number belongs to

  • Attempted: when the call was actually attempted

  • Wait Pre: the difference (in milliseconds) between call stages REQUESTED and DIALLING

  • Wait After: the difference (in milliseconds) between call stages DIALLING and CONNECTED

  • Talk: the duration (in milliseconds) of the active call, that is, while the callee was connected

  • Status code: the call status code when it was closed

  • Extended status: the extended status set by Asterisk

  • Retry #: The number of retry this call was on (0: initial attempt)

  • Next retry: When the next retry is scheduled. If set to zero, this means the call was not set to be rescheduled.

  • Trunk: The trunk the call was placed on

  • Log Id: The internal log id

  • Asterisk channel: The Asterisk channel that was created for the first leg of the call

  • Asterisk unique: The Asterisk internal Unique-Id that was used

Users and security

WombatDialer offers a powerful and pervasive security model that is similar to the one used in QueueMetrics. It is built around the concepts of users, classes and keys.

The idea is that each user has a keyring and all features are controlled by keys. Every time WombatDialer has a possible feature to show the user (e.g. editing servers) it checks whether the current user holds the correct key in its keyring. If he does not have it, the feature is hidden or grayed out.

Each user has a keyring that is composed of their personal keys plus all the keys for their class. This way you can organize multiple groups of users (e.g. administrators, monitors, etc) with different grants, and then give each specific user additional keys to fine-tune each person’s profile.

A set of default users and of security keys is available below.

The security model

You can set security keys on most entities in WombatDialer - you can have them on servers, trunks, end-points, campaigns and lists. They will be enforced for:

  • Selection of items to be added to campaigns

  • Live monitoring

  • Reporting

The following rules apply:

  • Elements are visible both to users holding the required key and to their creator, even if he does not hold the required key (in order to avoid "locking yourself out")

  • Elements having no keys will be visible to everyone

  • Key security is not transitive, that is, if you can observe a campaign, you can observe it in its entirety, even if (say) one of the trunks it uses is protected with a key you do not hold.

Users

A user is some person who can log on to WombatDialer.

User editor

They have the following properties:

  • Login and Password are used to log on from the main page

  • Real Name is displayed on the WombatDialer page

  • Enabled may be toggled to avoid a user logging on without deleting it.

  • E-mail The user’s e-mail address

  • Master key: if set to "yes", all security checks are bypassed. You should only set it to yes for testing and debugging.

  • Class is a pre-defined set of keys that is used for this user. Any user must have a class.

  • User keys are additional keys granted to this user. They are space.-separated. If keys are prefixed with a minus sign, they are revoked if present in their class and ignored otherwise.

  • Logged on are the number of successful log-ons for this user and Last logon is the time this user last logged on successfully.

  • Comment and Token are free fields you can use to keep track of your users.

Password security

WombatDialer can store passwords either in an encrypted form made of a SHA with random salt (level 2) or plain text (level 1). Encrypted passwords are not recoverable. The defaults are that all default passwords are stored as plain text, while any password changed by the user is stored in encrypted form.

This behavior is controlled by two parameters in tpf.properties:

pwd.defaultLevel=2
pwd.minAllowedLevel=1

The first parameter defines the format of new passwords, while the second one decides which is the minimum level for a valid password. There is usually no need to modify the defaults.

If those parameters are missing, both of them are level 1 - unencrypted passwords.

There is really no way of recovering an encrypted password. If you lock yourself out of a working system, Loway technicians can be asked to connect to your server and set a temporary password for you. This is a paid service.

Classes

Classes are common profiles to be given to all users of a certain kind. So you do not have to remember which keys to give users for each specific functionality, but you can group them all together.

Classes editor

Any class has the following properties:

  • Class name is the name used in the User Editor to choose the class.

  • Description is a long version of the class name

  • Keys are a space-separated set of keys that are granted to all users of this class.

You can create new classes than the ones that ship with WD in order to fine-tune access controls for your instance.

The system log

When something important happens in WombatDialer, it is written to the System Log. The system log tracks:

  • Campaign life-cycle events

  • User logins and log-offs

  • System errors

The Syslog page