providers.google.users. GitHub
pull requests are providers.github.pull_requests. Linear issues are
providers.linear.issues. A person who exists in more than one of those
tools is joinable on email, or through providers.identity.* when the
emails do not match.
A tap lands as one or more tables in that connector’s schema. Nested
object arrays become their own tables. Column names are the tap schema
names, lowercased (primaryEmail -> primaryemail). Nested objects
that flatten use __ between segments (assignee.email ->
assignee__email). See
How taps project into tables
for dedup keys, ordering keys, and identity flags.
A table appears only if that connector is configured in your workspace
and the tap has synced. The examples below use common connectors.
Swap slugs and column names for what
the catalog lists for you.
Address a table
{connector} is the connector slug (google, github, linear,
slack, okta, workday, salesforce). {table} is the tap name,
lowercased. Child tables from exploded arrays are {tap}__{path}:
GitHub issue labels are providers.github.issues__labels.
References are fully qualified. There is no USE or search_path.
Which column is unique, which version of a row wins, and which fields
identify a person come from flags on the tap schema. You inspect those
flags; you do not set them.
See what you have
List tables, columns, and row counts from the catalog before you assume a table has rows. A table can be registered before the first sync writes data. Connected tools and enabled taps are also live in the workspace pool:Query one connector
Active Google Workspace users, with org unit and last login:full_name is copied onto the
PR so you do not have to join repositories:
Combine connectors on email
Person-email columns (x-transformPersonEmail on the tap) are safe to
join to each other and to workspace.users.email. Linear email and
Google primaryemail are the same kind of value:
Combine connectors when emails differ
GitHub org members have alogin and an id, not an email. Slack and
Okta store email on a nested profile that may not flatten. Do not join
two providers’ id columns to each other and expect a person match.
Taps with identityDirectory: true (Google users, Linear users,
GitHub members, Slack users, Workday workers, and others) feed
providers.identity.*. That family appears after at least one
directory tap has synced.
account_id is the provider-native principal (Google users.id, GitHub
members.id, Linear users.id). account_id_type is id, uuid, or
email. match_method records how the link was made (canonical,
email_exact, email_local_part, email_fuzzy, name_fuzzy).
Identity is best-effort: service accounts and shared mailboxes get
identities too.
Every account linked to a resolved person:
Join work items, not just people
Linear issues carrybranchname. GitHub pull requests carry the head
branch on the flattened head object. That join does not need email or
identity:
providers.google.groups is the group list (name, email,
directmemberscount). Confirm in the catalog how members link back to
a group before you join those two tables; the member tap’s documented
columns are the member fields, not the parent group id.
Child tables
Nested object arrays explode to a second table,{tap}__{path}, with
the parent id repeated. GitHub issue labels:
users does the same for phones, emails, and external ids
(providers.google.users__phones, and similar). Child tables have their
own dedup keys. Do not SELECT DISTINCT id on a child table to “clean
it up”; the parent id is supposed to repeat. Details are on
How taps project into tables.
Quality and other pools
SPC, Gate 2 checks, and table stats for provider tables live in Quality (providers_quality.google.users__checks, and the
providers_quality.summary.* tables). Identity tables do not get
quality sidecars.
A Plot can read providers and write to
parables. Published uploads in
artifacts join the same way as any
other table — typically on a person-email column.