Using a "free" international calling service

The reason for this message is that recently no less than THREE services have popped up that allow “free” calls to various international points. There are all based in the U.S. state of Iowa, and the way they work is that you call a regular number in Iowa, wait for a prompt, then dial the number you want to call. As best anyone can determine, there must be some quirk in Iowa telecommunications law that allows them to charge higher than normal termination charges on connected calls, and they use VoIP to complete the calls, so they actually wind up making anywhere from a fraction of a cent to a few cents on each minute of use. If the Federal Communications Commission ever reforms the ridiculous compensation system we have here, these companies will probably be out of business overnight.

But for now, if you have “free” calling within the USA, and can place calls to these Iowa numbers, you can then get connected through to numbers in other countries, including Mexico (which is a fairly high cost call on many U.S. long distance plans) at no additional charge.

The challenge, then, is whether FreePBX can work in this manner. Assuming a user dials an international call to certain countries, select an outbound trunk (that allows completion of U.S. calls) and then do the following:

  1. Connect to a particular U.S. number (NOT the number dialed by the user),
  2. Wait for the other end to answer, then wait until it is ready to receive digits (a couple seconds timeout may work),
  3. Send DTMF tones, possibly interspersed with waits, to the other end, representing the number the caller originally dialed, but the number MIGHT have to be massaged a bit. For example, if the caller is in a country where you dial 00+country code+number and the U.S. system expects 011+country code+number, you’d need to strip the “00” and add the “011.” Also I believe one of the systems has an initial prompt that is something like “press 1 for English, press 2 for Spanish” so in some cases there may be a need to prepend additional digits and/or wait states.

Now, have determined that it IS possible to have Asterisk send post-connect DTMF digits and waits. For example, if you were to add this to extensions_custom.conf:

[code:1]exten => *20,1,Dial(Local/18005558355@outbound-allroutes,D(wwww932))
exten => *20,2,Hangup[/code:1]

Assuming you had a route for U.S. 1-800 numbers, when the user dials *20 it would place a call to the “TellMe” service, then wait two seconds, then send DTMF for 932 (“WEA”) which would take you directly to the WEAther forecast section (to further automate it for a particular location, you could add a few more waits after the 932, and then a five-digit U.S. zip code). The point is that the caller never hears the tones that are being sent because the audio path doesn’t connect until after the digits have been sent (which would make this technique useful for sending account codes, etc.)

I will list a few of these “free” international call services below. Remember that the numbers you have to call are NOT toll free, so they are only “free” if you have unlimited U.S. calling, or are using a cell phone with “free” airtime, etc. Also, I have no connection to any of these companies, so I cannot say whether they might save the calling or called numbers for any reason - obviously if you are highly concerned about privacy of communications, you would want to investigate these services further before using them.

[list]
FuturePhone.com - free international calls to over 50 countries.
FreeCallsToMexico.com - free international calls to Mexico, Canada, China, The UK, Singapore, Korea (Seoul), Hong Kong Mobile, Argentina (Buenos Aires) and Germany.
CallChinaForFree.com - free international calls to China and Hong Kong, as well as Singapore and Singapore mobile numbers.
[/list:u]

Before you could make a transparent pass-thru to any of these services, you’d likely have to place a few manual test calls, listen to the prompts and find how what they want to have entered, and when. Still, for those that have high calling volumes to one of these countries, it might be worthwhile to figure out.

Alternately, if you have only one or two international numbers you call, you could simply create a custom extension for each of the numbers in extensions_custom.conf (as I did in the example above), and set up the DTMF string to insert the requisite waits and prompt responses, and then dial the number for your friend or relative, etc.

Well, it took me a ridiculous amount of time, but I figured it out:

Here’s a basic template for making a two-step dialing route and trunk. This will undoubtedly need some tweaking with regard to timeouts, etc. and it may not be the most efficient way to do this, but it should work in many situations:

Step 1: Make some test calls and note any required timeouts or additional digits

Make a few test calls and note any time delays, dialing prefixes or suffixes required, etc. For example, one service is said to require you to make a language selection, then wait a few seconds before dialing the number.

Step 2: Create a context in extensions_custom.conf

This is just a small four-line context that you will add at the bottom of extensions_custom.conf. The second line is for debugging/logging purposes only but if you remove it, don’t forget to renumber the other lines. The third line is the real “meat” of the context. Your context should look like this:

[code:1][servicename]
exten => _X.,1,NoOp(Number originally dialed was ${EXTEN})
exten => _X.,2,Dial(Local/19995559999@outbound-allroutes,D(wwwwww${EXTEN}))
exten => _X.,3,Hangup[/code:1]

“servicename” is just a name for your context that doesn’t duplicate any other context name. Replace 19995559999 with the number you would dial from a local extension to access the international calling service. The wwwwww${EXTEN} means wait three seconds and then dial the number you want to call. That may need to be tweaked. For example, let’s say that in your testing you found that you had to wait one second, dial either “1” or “2” to make a language selection, wait one more second, and then dial the number you want to call. In that case, you’d use ww1ww${EXTEN} (although I’d throw in an extra w or two in case the system is busy and a little slow on the uptake from time to time).

Step 3: Create a Custom Trunk in FreePBX

This is drop-dead simple (only wish it had been simple to figure out). Normally the only thing you will need to do here is create a new custom trunk and leave everything blank except the Custom Dial String field, which should look like this:

[code:1]Local/$OUTNUM$@servicename[/code:1]

Note that “servicename” is the same context name you used in step 2 - the rest of the line can be copied and pasted verbatim. Although I haven’t tried entering anything in any of the other trunk-specific fields, I would imagine that they could be used normally - for example, to strip or add prefixes from the dialed number. For example, if you’re in a country where you dial 00 in front of an international call, and you’re sending this to a U.S. based service, you’ll want to strip the 00 and then add 011.

Step 4: Create an Outbound Route to send calls to your trunk.

When creating a route, about the only thing you will need to do is enter appropriate dial patterns that will be allowed to access the trunk you created in step 3. For example, if you are in the United States and you are using a service that allows calls to anywhere in the U.K., you’d simply put something like
01144.
as a dial pattern. Of course, the service you use may not allow calls to high-cost numbers (e.g. mobiles) so it may get more complicated. Creating dial plans is beyond the scope of this article, but just remember when you are finished with the dial plan to select your newly-created custom trunk at the bottom of the screen, and don’t forget to click the red bar so all your changes take effect.

A few caveats:

[list]If you make any changes to extensions_custom.conf, don’t forget to have FreePBX re-read the configuration files (this happens any time you click the red bar).

Not all services will accept touch tones sent in this manner. If the touch tone signals are converted from digital to analog before they are received at the service (which should never happen in today’s telephone system unless you are connecting your Asterisk box to an analog telephone line, but there are no guarantees), the tones may be received erratically. As far as I know, there is nothing that can be done about this. That’s another reason for making a few test calls first - if you have touch tone reception problems when placing calls manually, automatic two-step calls probably won’t work.

Don’t use this method for placing high volumes of overseas calls unless you want your VoIP provider to decide they don’t want you as a customer anymore, particularly if you’re on a flat rate unlimited plan. While the calls are free to you, they may be costing your VoIP provider as much as around a nickel a minute to complete.[/list:u]

about a year later none of them offer free service.

even freeconferencecall.com is being blocked by many carriers.