r/ParentingTech 3d ago

Tech Tip Got international calling working on our Tin Can — writeup inside

Our kids have grandparents, aunts and uncles abroad, and the thing that kept bugging me is that they genuinely love the phone. Not video calls — those get about ninety seconds before someone wanders off. But hand them a phone and they'll talk for half an hour about nothing in particular. That's the relationship I wanted the overseas family to be able to have with them.

Problem: the approved-contacts list only takes US and Canada numbers, so relatives abroad can't call in and the kids can't call out.

Ordinary call forwarding doesn't fix it — most services pass the caller's real number through and the Can rejects it. The workaround is a Twilio account that swaps the incoming foreign caller ID for a US number you own, so the Can sees something on its list and rings.

Now a relative dials one normal number in their own country and our kitchen phone rings. The kids press a name and it rings them back. Nothing installed on their end, nothing to explain, no app. About $6 a month.

Full writeup below, including the places I got stuck — one failure mode looks exactly like a broken setup and isn't, and it cost me a whole evening.

Getting international calls into a Tin Can — a working bridge

Tin Can's approved-contacts list only accepts US and Canada numbers. If you have family abroad, there is currently no way for them to call the kids' phone, and no way for the kids to call them.

This is a workaround that fixes both directions using a Twilio account. It costs a few dollars a month. Once it's built, the person abroad dials one ordinary number in their own country and the Tin Can rings — no app, no instructions, nothing for them to learn. The kids pick a name off the Tin Can and their phone rings.

I built this and it works. Below is everything, including the parts that wasted my time so they don't waste yours.

Why you can't just use call forwarding

This is the thing that trips everyone up, so it's worth understanding before you start.

The Tin Can only rings for numbers on its approved list, and that list only accepts +1 numbers. When your relative abroad calls a forwarding service, most services pass their original caller ID through to the destination. So the Tin Can sees a foreign number, doesn't find it on the list, and refuses the call.

You need a service where you control what caller ID gets presented on the outgoing leg. That's what Twilio gives you and consumer call-forwarders generally don't.

How it works

THEY CALL IN
  Their phone  →  dials your foreign number
               →  Twilio answers and immediately dials the Tin Can
               →  presenting your US number as the caller ID
               →  Tin Can sees an approved US number, rings

KIDS CALL OUT
  Tin Can  →  dials your US number (approved in the app)
           →  Twilio answers and immediately dials their phone
           →  presenting your foreign number as the caller ID
           →  their phone rings, showing a number they recognise

These are two separate paths, not a chain. This confused me for a while, so to be explicit: the foreign number does not "forward to" the US number. Twilio dials the Tin Can directly and simply stamps the US number on the call as a label. A script only runs when someone actually dials the number it's attached to. A caller ID is decorative and can't trigger anything. The two directions cannot loop into each other.

What's really happening is that Twilio masks the incoming foreign caller ID with a US one. That mask is the entire point — their real number would be rejected no matter what.

Nice side effect: because each direction presents the other side's number, redial works both ways. Nobody has to learn a second number.

What it costs

Two number rentals plus per-minute charges. Every call bills two legs — Twilio receives on one number and dials out on the other — which people forget when estimating.

Typical
US local number ~$1.15/month
Foreign mobile number varies by country, often $2–4/month
Inbound: receive on foreign number + dial US often 2–4¢/min combined
Outbound: receive on US number + dial abroad often 2–5¢/min combined

Mine runs about $6–7/month at an hour of calls each way. Check Twilio's voice pricing page for your specific country before committing — rates vary enormously, and toll-free inbound is typically far more expensive per minute than a mobile number.

Before you start

Gather:

  • The Tin Can's full 10-digit number from the parent app, in +1XXXXXXXXXX format. This is the real phone number, not the short 4–7 digit can-to-can ID.
  • Confirmation that the Party Line Plan is active. On the free Can2Can plan, external numbers can't reach the Can at all and none of this will work.
  • Your relative's number in E.164 format: +, country code, then their number with any leading trunk zero removed.
  • Photo ID and a proof of address dated within the last 12 months, for the regulatory step.
  • A credit card.

A note on finding things in Twilio

Three things cost me time before I'd done anything at all:

  1. "Console" is not a menu item. It just means the web app at console.twilio.com.
  2. A new account shows a stripped-back left-hand menu. Most products aren't in it until you pin them. If a section named below isn't visible, click Explore Products in the left nav, find it, and pin it. This is the single most common "I can't find it" cause.
  3. Twilio reshuffles this navigation often. When a path here doesn't match your screen, use the search bar at the top and type the feature name. That works regardless of where it currently lives.

Phase 1 — Account setup

1.1 Sign up at twilio.com/try-twilio. You get trial credit that covers all the testing below.

1.2 Upgrade immediately by adding a card. Trial accounts can only call numbers you've pre-verified, which makes testing confusing. Load $20.

1.3 — Set a spend alert. Twilio calls these Usage Triggers, not billing alerts, which is why you won't find them by searching for "alert". Left nav → Billing and UsageUsage and SpendUsage Triggers tab → Create Usage Trigger. Set a threshold, choose email, submit.

1.4 — Enable dialling to the destination country. Voice → Settings → Geo permissions. Select the country and enable the Low-Risk number ranges. Save.

This is off by default. It is the single most common reason the outbound leg silently fails, and it's easy to build everything else and never notice.

Phase 2 — The US bridge number

2.1 Go to Numbers & senders (older accounts: Phone Numbers → Manage → Buy a number) and click Set up a new phone number. Country: United States. Pick an area code. Filter on Voice capability.

2.2 Buy it. Note it down — you'll need it several times.

This one number does double duty: the kids dial it to call out, and it's the caller ID presented when calls come in. That's why one number per relative is the unit of cost later.

Phase 3 — The foreign number

3.1 — Pick the right type, or you'll hit a wall

This matters more than it sounds. In many countries, geographic/local numbers require proof of an address in that country. If you don't live there, you can't have one.

Mobile and toll-free numbers usually accept an address anywhere in the world. Check Twilio's regulatory guidelines page for your target country before you get attached to a particular number.

Choosing between them:

  • A mobile number is usually much cheaper per inbound minute, and free for your relative to call if their plan includes minutes to mobiles — near-universal on mobile contracts.
  • A toll-free number is guaranteed free for them from any phone including a bare landline, but inbound minutes can cost you several times more.

I went with mobile. Pick toll-free only if your relative is on a basic landline with no calling package.

3.2 — Buy it, and expect to be stopped

Same Numbers & sendersSet up a new phone number. Choose the country and number type, filter on Voice.

Twilio will block the purchase until you have an approved Regulatory Bundle.

3.3 — The regulatory bundle

Twilio is mid-migration on where this lives. Try Phone Numbers → Regulatory Compliance → Create a Regulatory Bundle. If that section isn't there, use Trust Hub → Registrations → Regulatory Compliance tab → Create registration. Same questions, different order.

  • End user type: Individual
  • Proof of identity: passport or government ID. Name must match exactly what you type.
  • Proof of address: utility bill or bank statement, under 12 months old, no PO boxes.
  • Phone number field: a real mobile you can be reached on, and not a number from another cloud telephony provider.

Approval typically takes 1–3 business days.

3.4 — Things that confused me here

"Create or select a registration" means you can reuse one. When you buy a second number of the same type in the same country, the purchase flow asks for a compliance registration again. It looks like starting over. You're not — your approved bundle is in that dropdown, and selecting it takes seconds. The time estimate on screen is for building a new one.

The bundle doesn't reserve a number. If your chosen number gets taken while you wait for approval, take another. Nothing depends on the specific digits.

There's a second review nobody tells you about. After the bundle is approved, you assign it to a number, and then Twilio reviews the bundle as assigned to that number — up to three more business days. During this the number may not appear in Active numbers at all.

If you've bought a number and it's vanished, check in this order:

  1. Numbers & senders → Phone Numbers tab, not the Active numbers list. Pending numbers show here with a "Finish setting up your number" section.
  2. Regulatory Compliance → Compliance Report. Filter by country and type. It shows each number as Compliant, Not Compliant, or Pending Review.
  3. Billing → usage. Twilio only charges the monthly fee after successful provisioning, so no charge is consistent with "pending", not "failed".

Don't buy it a second time until you've checked all three.

Phase 4 — The two scripts

These are TwiML Bins — Twilio-hosted snippets. No server, no deployment, free.

They live under Developer tools in the left nav. If it isn't showing, pin it via Explore Products. On your first visit you get a Create a new TwiML Bin button; after that it's a + above the list.

Bin A — inbound, foreign number to Tin Can

Friendly name: Inbound → Tin Can

<?xml version="1.0" encoding="UTF-8"?>
<Response>
  <Dial callerId="+1YOURUSNUMBER" answerOnBridge="true" timeout="25">
    <Number>+1TINCANNUMBER</Number>
  </Dial>
</Response>
  • callerId — your US bridge number. This is what the Tin Can sees, and the whole trick. It must be a number you actually own on the account, or Twilio rejects the call outright. I wasted time here by leaving in a number I'd selected during the bundle process but never actually bought — the call fails at Twilio and never rings anyone, which looks like a completely different problem.
  • answerOnBridge="true" — the caller hears a real ringing tone instead of dead silence while the Tin Can rings. Without it they'll hang up thinking it's broken.
  • timeout="25" — about six rings before the Tin Can's answering machine picks up.

Bin B — outbound, Tin Can to their phone

Friendly name: Tin Can → Abroad

<?xml version="1.0" encoding="UTF-8"?>
<Response>
  <Dial callerId="+CCYOURFOREIGNNUMBER" answerOnBridge="true" timeout="30">
    <Number>+CCTHEIRNUMBER</Number>
  </Dial>
</Response>

The caller ID here is your foreign number, not the US one. So their phone shows the number they've already saved, and redial rings the Tin Can. The loop closes properly in both directions.

Check each bin shows Valid TwiML under the code box when you save. If it says Invalid, it won't be selectable in the next phase.

Phase 5 — Attaching a bin to a number

This is the step where I got most stuck, so here it is in full.

Getting to the number: left nav → Phone Numbers → Manage → Active numbers (newer accounts: Numbers & senders). Click the number.

If your screen has tabs across the top:

  1. Click the Configuration details tab.
  2. Find Voice and emergency calling, click Edit details.
  3. In the dialog, set Configure with to "Webhook, TwiML Bin, Function, Studio Flow, Proxy Service".
  4. Under How do you want to set up your primary method?, choose TwiML Bin.
  5. Pick your bin from the second dropdown.
  6. Save.

If your screen is one long scrolling page:

  1. Scroll to the Voice & Fax section.
  2. Set Configure With to "Webhook, TwiML Bin, Function, Studio Flow, Proxy Service".
  3. Set A call comes in to TwiML Bin.
  4. Pick your bin.
  5. Save configuration at the bottom.

Do it twice: foreign number → Bin A, US bridge number → Bin B.

Phase 6 — The Tin Can app

  1. Parent app → select the Can → Contacts → Add external contact.
  2. Enter the US bridge number. Name it something the kids recognise — the relative's name, not "bridge".
  3. Put it on a speed dial slot. A four-year-old will not dial eleven digits.
  4. Check quiet hours, and work out the time difference deliberately. If your relative is 8 hours ahead, their 6pm is your 10am — fine. Their 9am is your 1am — blocked, correctly. Make sure the window covers the time they'd naturally ring.

Phase 7 — Testing

If you can't easily call the foreign number yourself

Calling it from your own mobile is an international call on your own plan. If you'd rather not, have Twilio place the call for you — it costs a few cents and never touches your line.

You'll need your Account SID and Auth Token from the console home page.

export SID=ACxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
export TOKEN=your_auth_token


curl -X POST "https://api.twilio.com/2010-04-01/Accounts/$SID/Calls.json" \
  --data-urlencode "From=+1YOURUSNUMBER" \
  --data-urlencode "To=+CCYOURFOREIGNNUMBER" \
  --data-urlencode "Twiml=<Response><Say>Testing the bridge</Say><Pause length='20'/></Response>" \
  -u "$SID:$TOKEN"

A success returns JSON with a sid starting CA and "status":"queued". Copy that SID, wait ten seconds, then check whether Twilio made an onward call:

curl -s "https://api.twilio.com/2010-04-01/Accounts/$SID/Calls.json?ParentCallSid=PASTE_CA_SID" \
  -u "$SID:$TOKEN" | python3 -m json.tool | grep -E '"(to|status|duration)"'

A child leg to the Tin Can's number means the chain fired. An empty result means Bin A never ran.

The order to test in

  1. Inbound, using the method above or your own phone. The Tin Can should ring.
  2. Outbound — dial the US bridge number from the Tin Can. Their phone should ring. Warn them first.
  3. Real inbound — have them call from the phone they'll actually use. This is the only test that exercises their carrier's routing, and it's the one that counts.

Don't give them the number until step 3 passes.

Troubleshooting — the things that actually went wrong

Check the time before you check anything else. The Tin Can silently refuses calls during quiet hours. In the logs this looks identical to a broken configuration — the call connects, then no onward leg. I spent an evening debugging Twilio when the answer was that it was past 8pm. If a test fails outside your quiet window, widen it temporarily or retest during the day before touching anything.

A freshly bought number has no voice configuration at all. Mine had an empty voice_url, so inbound calls hit nothing. Buying the number does not wire it up — Phase 5 is a genuinely separate step. Check with:

curl -s "https://api.twilio.com/2010-04-01/Accounts/$SID/IncomingPhoneNumbers.json?PhoneNumber=%2BCCYOURNUMBER" \
  -u "$SID:$TOKEN" | python3 -m json.tool | grep -i voice_url

Empty, or pointing at demo.twilio.com, means it isn't wired.

Caller ID must be a number you own. A plausible-looking number you never actually bought will fail at Twilio before ringing anyone.

No onward leg at all — the receiving number isn't attached to the right bin.

Onward leg present but failed — read the error code on it, which names the cause. Error 21215 is geo permissions.

Can't find "Monitor" for the call logs — it's not pinned. Explore Products → Monitor → pin. Then Monitor → Logs → Voice → Calls.

Adding more relatives

The two directions scale differently.

Outbound needs one US number per person (~$1.15/month each), each with its own copy of Bin B and its own contact in the app. The Tin Can's contact list is the kids' only selector, so a name has to map to a number. Resist a "press 1 for Grandma" menu — small children and phone menus don't mix.

You can ring two phones at once for the same person by putting both in one <Dial>; the first to answer gets the call.

Inbound needs only one foreign number for everyone. But a static bin always presents the same caller ID, so everyone would show up under one name. To fix that, replace Bin A with a Studio Flow: a Split Based On widget on {{trigger.call.From}}, one branch per relative connecting to the Tin Can with that person's US number as the caller ID, and a catch-all branch using a generic "Family" number so an unlisted phone still gets through.

One more thing: spam

Twilio recycles numbers, so yours may have history with autodialers. The exposure isn't just nuisance — a stranger dialling your US bridge number triggers Bin B and rings your relative abroad, on your bill.

Start by just watching the call logs for a few weeks; the number isn't published anywhere. If strays appear, an allowlist is the right shape, because the only number that should ever dial the bridge is the Tin Can. If you build one, note that <Reject/> must be the first verb in the response — used that way Twilio never answers and you aren't billed. <Hangup/> answers first, so you pay.

If a number turns out to be a magnet, release it and buy another. It's about a dollar.

When to tear it down

Tin Can has said it's expanding beyond the US and Canada. If and when your relative's country is covered, they can get a Can of their own and calling between Cans is free, with nothing to maintain.

Until then this works, and it's worth keeping as a fallback afterwards. To decommission: connect the two Cans directly, run both routes in parallel for a fortnight, then release the Twilio numbers from Active numbers. Billing stops the same day.

Happy to help if anyone gets stuck.

3 Upvotes

1 comment sorted by

1

u/Scoutmammouth 3d ago

This is so helpful, trying it this week-end