Using a VoIP telephone system provides a great deal of flexibility over your calls. This can be great if you are a business and have a lot of calls or are a home user and have a special VoIP provider to call relatives overseas.
This flexibility comes at the cost of having to understand the complex and initially confusing dial plan; the regular expression that tells the phone how it should route your call based on the number you have typed.
Chances are your VoIP telephone is using the default dial plan that looks similar to this
Now at first sight that looks confusing, lets break it down to figure out what is going on. First some details of the syntax.
| Separates items in the dial plan.
* Is the star key on the phone keypad.
# Is the pound or hash key.
x Defines a single digit 0-9.
x. Repeat the previous numeral zero or more times.
 Range of explicit values. E.g.  3 or 4 or 6 or 9.
[2-9] Numbers 2 through 9 allowed.
[25-7*] Numbers 2 or 5 or 6 or 7 or *
! Used for barring numbers.
, Sends the dial tone to the handset.
S0 Immediate dial, do not wait for caller timeout.
Dissecting the default dial plan
The default dial plan on most VoIP systems is setup for callers in the USA, once you’ve figured this part out it’s easy to see how the patterns would match.
*xx Allows redial last caller service e.g. *69
11 Allows you to dial a host of USA based emergency and information services including the commonly known 911.
0 Zero is a common prefix for numbers, all internal calls in the UK begin with 0.
00 Zero zero is the international dialling prefix when calling FROM the UK to a foreign country.
[2-9]xxxxxx This is a USA dialling rule for local calls within the same area code(Simpsons episode 250?)
1xxx[2-9]xxxxxxS0 Again this is a national USA phone number, usually written 1-(555) 123-1234 S0 for immediate dial on the end.
xxxxxxxxxxxx Finally at the end any 12 digit phone number.
Dial plan for the UK
For use in the UK I find this is a better dial plan.
(<911:999> | <00:00>x. | <:441642>[2-9]xxxx. | xxxxxxxxxxxx. | 1xxx | 0x.| [1xx] | 999S0)
So breaking it down as before we have.
<911:999> 911 to 999 Conversion for American visitors to our offices just in case.
<00:00>x. Allows for all international numbers from the UK. (essential for our international sites)
<:441642>[2-9]xxxx. Allows 5 or 6 digit local numbers to be prefixed with the local area code.
xxxxxxxxxxxx. Allows any full telephone number not covered by other rules.
1xxx Allows for special service numbers like 1471 for ring back and 1571 for voice mail.
0x. Allows for special numbers in the UK, 0800, 0500 and 09 etc.
[1xx] Again used for special numbers like 123 (speaking clock) and 141 (withhold number).
999S0 finally, allow 999 to be dialled directly and dial immediately.
The dial plan constructed for use in our office is very open in its restrictions and UK centric. Many home users may want to restrict the use of premium 0871 numbers and 09 preium rate numbers, but at work we have need to be able to dial such numbers and have policies in place to deal with staff who abuse the open system.
More advanced uses of the dial plan include routing calls between different VoIP providers. If, for example, you had relatives in Australia and friends in Japan you might have a different VoIP provider for each country.
In this case you could add the following rules
<0061:0061>x.<:@gw1> | <0081:0081>x.<:@gw2>
Each of these say if dialling Australia (country code 61) route calls via VoIP gateway 1 and if calling Japan (country code 81) route via VoIP provider 2.
There are some excellent resources on Wikipedia on the state of the UK telephone system and a excellent php based dial plan simulator you can use when testing your own rules.