Like many of you, I try to avoid the Teams ecosystem (though I’m a Windows guy in every other way). But Teams webinars are so easy to set up — Calendar » New » Webinar — that inevitably someone’ll ask if you can use Marketo to register people.
Indeed you can. There’s no Marketo connector comparable to Zoom and ON24, but if all you want to do is add registrants to a Marketo program (via a Marketo form or any other way) and push the registration to Teams, it’s very easy with a FlowBoost webhook.
⚠️ FlowBoost Standard required (sorry)
The vast majority of FlowBoost users are on the free Community plan, since they make < 50,000 calls per month and don’t need the few extra features offered by Standard.
Every other post on FlowBoost, give or take, works with Community. But this one’s connecting to a non-Marketo service, which requires Standard.[1] We’re grateful to the core group of Standard users that help us keep the lights on and hope you’ll join them if your org needs this functionality. Reach out for a Standard trial key.😀
And now, on to the code.
Teams Tenant ID and Event ID are all you need
A Microsoft subscription has a single Tenant ID shared across all users. Each webinar has its own Event ID. You can get both of those from the Teams-hosted Event URL, which follows this structure:
https://events.teams.microsoft.com/event/{{Microsoft Teams Event ID}}@{{Microsoft Teams Tenant ID}}We won’t be sharing that URL for registration, obviously, but we need it to grab the IDs:

Once you copy those out (remember, it’s event@tenant) put the Tenant ID in a global token {{my.Microsoft Teams Tenant ID}}. Drop the Event ID into a program-level {{my.Microsoft Teams Event ID}} for each webinar.
Then set up this FlowBoost webhook and call it from a trigger campaign in any program:
const eventId = {{my.Microsoft Teams Event ID}};
const tenantId = {{my.Microsoft Teams Tenant ID}};
const email = {{lead.Email Address}};
const firstName = {{lead.First Name}} || "[Not Provided]";
const lastName = {{lead.Last Name}} || "[Not Provided]";
const ianaTimeZone = {{lead.Person Time Zone}} || "America/New_York";
const language = {{lead.Preferred Language}} || "en-US";
const getTokenURL = () =>
`https://authsvc.teams.microsoft.com/v1.0/authz/visitor`;
const getRegisterURL = (eventId, tenantId) =>
`https://teams.microsoft.com/api/virtualevents/prod/events/${encodeURIComponent(eventId)}@${encodeURIComponent(tenantId)}/attendee/register`;
const CONTENT_TYPE_JSON = { "content-type": "application/json" };
FBHttp.fetch(getTokenURL(), {
method: "POST",
headers : { ...CONTENT_TYPE_JSON },
body: JSON.stringify({
tenantId
})
})
.then((tokenRespJ) => tokenRespJ.json())
.then((tokenResp) => {
return FBHttp.fetch(getRegisterURL(eventId, tenantId), {
method: "POST",
headers : { "x-skypetoken": tokenResp.tokens.skypeToken, ...CONTENT_TYPE_JSON },
body: JSON.stringify({
firstName,
lastName,
email,
language,
timeZoneDetails: {
ianaTimeZone
},
answers: [],
hasAcceptedTermsOfUse: null
})
})
.then((registerRespJ) => registerRespJ.json())
.then(success)
})
.catch(failure)It’s really simple:
(1) get the rather nostalgically named x-skypetoken from the Teams auth endpoint
(2) pass the x-skypetoken together with lead fields to the Teams register endpoint
The person is immediately registered and Teams will send them a confirmation email and all follow-up emails.
The code assumes you have a person field for {{lead.Preferred Language}}. If not, hard-code your default corporate language. Or have a {{my.token}} if language varies at the webinar level, it’s up to you!
It’s a unidirectional, registration-time sync
With these endpoints, it’s impossible to get a joinWebUrl in the webhook response (Microsoft doesn’t provision it until after the registration.) So emails must still be sent via Teams as usual.
Like I said, it’s no match for the Zoom and ON24 connectors, but it lets you present a nicely branded Marketo LP + form and work directly with Marketo program membership. You’re in control of registration, so you can also use FBCounter to limit registrants — that’ll mesh together nicely with the back end.
If you’re on very good terms with IT, we can go further
There is a way to fetch joinWebUrl using the Graph API, getting you closer to an all-Marketo solution. However, coordinating Graph API tenant permissions with your IT team could be hairy. For FlowBoost Standard users, I’m happy to try to get that worked out with IT, after which I’ll provide the updated code, but can’t guarantee they’ll go for it.
Notes
[1] FlowBoost Community keys can only connect to Marketo APIs and assets. (Technically, Community can connect to any Marketo instance, not just the one calling the webhook.) Standard is required to hit SFDC, Teams, or other remote APIs.