Microsoft Teams to BigQuery: How to Move Your Data

Move Microsoft Teams into BigQuery with Airbyte. Why administrator consent is the critical path, and why overlapping usage periods must not be summed.

Summarize with AI:

Moving Microsoft Teams into BigQuery gives you a measurable view of how an organisation collaborates. Which teams exist, who belongs to them and how activity has moved are questions the Teams admin centre answers awkwardly and a warehouse answers instantly.

This guide covers the managed path with Airbyte. Two things shape the build: getting access is an administrator's decision rather than yours, and the usage figures arrive already aggregated over a window you choose.

Microsoft Teams to BigQuery at a glance:

CapabilitySupportedWhat it means for this pipeline
PermissionsApplication typeWhich only an administrator can consent to
CredentialsThree valuesClient ID, tenant ID and a client secret
Period settingA rolling windowUsage reports are aggregated by Microsoft, not by you
Error messagesOften genericA permissions failure can surface without its cause
Dataset locationImmutableFixed at creation, so match your other data

Why move data from Microsoft Teams to BigQuery?

Two situations account for most of these pipelines.

The first is understanding adoption, which matters when an organisation is paying for licences and wants to know whether people use them. Those are counts and trends, and a warehouse holds them beside headcount and cost data that Teams has never seen.

The second is governance, meaning which teams exist and who can reach them. If you want to transform this alongside other collaboration data rather than report on it, Microsoft Teams to Databricks covers the same source with a different emphasis.

What do you need before you start?

Four things, and the first depends on somebody else saying yes:

An app registration with application permissions, consented by an administrator. Graph distinguishes delegated permissions, which act as a signed-in user, from application permissions, which do not, and only an administrator can consent to the second. The Microsoft Teams source documentation covers the registration.

The client identifier, tenant identifier and client secret. Recorded when the application is registered, with the secret value captured at creation since it is not shown again afterwards.

A decided reporting period. The connector takes a period for its usage reports, and that choice determines what a row means rather than merely how much you get.

A BigQuery dataset in the right location. Location is fixed at creation and BigQuery will not join across locations, so put this where your headcount and licence data already live.

If your network restricts traffic by IP, add the Airbyte Cloud IP addresses to the relevant allow list before you begin.

How do you build a Microsoft Teams to BigQuery pipeline in Airbyte?

Step 1: Start the permissions request first

Register the application and get administrator consent before planning anything else, because this step waits on somebody outside your team and tenant administrators are cautious about application permissions for good reason. Explain what the connector reads and why, since a request arriving without context tends to sit. Everything after this is an afternoon.

Step 2: Configure the Microsoft Teams source

Click Sources in the left navigation, then New Source, and select Microsoft Teams, following adding a source. Supply the credentials and your period. If the connection fails with something unhelpfully general, check the consented permissions before anything else, since that is the usual cause and the message rarely says so.

Step 3: Configure the BigQuery destination

Click Destinations, then New Destination, and select BigQuery, following adding a destination. Supply the project identifier, dataset and service account credentials. This is a small dataset, so batched standard inserts are ample and staging is unnecessary.

Step 4: Create the connection and record the period

Click Connections, then New connection, select your streams and a sync mode. Daily is right. Then write the period into your table documentation, because a usage figure means nothing without knowing the window it covers.

Check which streams actually arrived too, since availability depends on what was consented rather than on what the documentation lists.

Why is access somebody else's decision?

Because this connector needs application permissions, and Microsoft Graph lets only an administrator consent to those. Delegated permissions act on behalf of a signed-in person and some can be approved by the person themselves; application permissions run with no user present, which is what a scheduled pipeline requires and what makes them a bigger decision.

Tenant administrators are rightly careful about that, since an application permission applies across the organisation rather than to one person's view of it. Arriving with a clear account of which permissions you need and what the pipeline does with them turns a slow conversation into a quick one, and arriving without it usually means waiting.

The diagnostic consequence is worth knowing too. Failures here often surface as something general rather than naming a missing permission, so a connection that will not establish is a permissions question long before it is anything more interesting. Check what was actually consented against what the connector asks for, rather than debugging the credentials.

What does the period actually mean?

That usage figures are Microsoft's aggregates rather than raw activity. The connector asks for a period, and the reports it retrieves summarise what happened across that window, so a row describes a rolling span rather than a day on which something occurred.

The trap follows directly. Syncing daily with a multi-day period gives you overlapping windows, and summing across them counts the same activity repeatedly, producing a total that is confidently wrong. The figures are correct individually and meaningless added together, which is the sort of error that looks like growth.

So treat each extraction as a reading rather than an increment. Compare the latest window against earlier ones to see a trend, state the period in the table documentation, and never sum across rows without establishing whether their windows overlap. If somebody needs genuinely daily figures, that means choosing a period to match rather than aggregating what you have.

Frequently asked questions

Why does the connection fail with an unclear message?

Usually consented permissions. Failures here often surface generically, so check what an administrator actually approved before investigating the credentials.

Can I set this up without an administrator?

No. The connector requires application permissions, and only a tenant administrator can consent to those.

Can I add up usage figures across syncs?

Not if the periods overlap, which they will when syncing daily with a multi-day window. Compare readings instead of summing them.

Which streams will I get?

Check after configuring rather than assuming, since availability depends on the permissions consented as well as on the connector version you are running.

Can I do this without writing code?

The pipeline, yes, once consent is granted. The views comparing periods and the note recording what a window covers are the work that keeps the numbers honest.

Get your Microsoft Teams data into BigQuery

Start the permissions request before anything else, because application permissions need administrator consent and that wait is the project's critical path. Expect generic errors to mean permissions. Then record your reporting period beside the tables and treat each extraction as a reading rather than an increment, since overlapping windows summed together produce a total nobody should trust.

Airbyte's connector catalog includes 600+ pre-built connectors, so collaboration data can be measured beside what it costs. For the same source into a lakehouse, see Microsoft Teams to Databricks, and for another Microsoft source with a similar permissions model, Microsoft Dataverse to Kafka.

Start syncing now →

Integrate with 700+ apps using Airbyte

Move data from 700+ sources into warehouses, lakes, and beyond. Set up pipelines in minutes with pre-built connectors and the Connector Builder.