PodiumTry the demo
Integrations

It connects to your stack without becoming part of it.

Podium's core imports no vendor SDK and names no provider. Every integration is an adapter behind a narrow contract, so swapping Resend for SendGrid is an install and a default flag.

How it works

Install it, name the secret, make it the default.

Each integration declares the settings it needs and one credential. You give Podium the name of a secret and it resolves it at call time, so the credential is never in the settings.

A misconfigured provider says so on this screen, with the provider's own error. It does not fail silently as four hundred acceptance emails go out.

One default per capability. Everything else is installed and idle until you point at it.

The integrations screen listing five installed adapters — Resend and SendGrid for email, Slack for chat, and two sync providers including Airtable — each active, with Resend and Airtable flagged as the default for their capability.
Shipped today

Six capabilities with an adapter you can install now.

The contract under each is the interesting part. Each is the smallest thing a provider could satisfy, so the widest set of providers can.

Email

Put this rendered message on the wire, and tell us when it bounced. Templating, batching, quiet hours and suppression stay on our side.

email.resend

Resend

Point it at a verified domain and every acceptance, reminder and campaign goes out through it. Bounces and complaints come back on a signed callback and land on the suppression list unwatched.

email.sendgrid

SendGrid

The same contract, a different provider. Swapping one for the other is an install and a default flag. No template, schedule or audit trail is rewritten.

email.log

Outbox only (no provider)

The default when nothing is installed. Every message is composed, rendered, recorded and never sent. It is how you rehearse an announcement to four hundred speakers.

Two-way sync

List tables, describe their columns, upsert by id, enumerate what changed. Six methods, none of which know what a proposal is.

sync.airtable

Airtable

A live mirror of proposals, sessions, speakers and sponsors, in a base your AV contractor and sponsorship lead can open. Linked records, single-selects and attachments, not a wall of text.

Chat

Post this into that channel.

chat.slack

Slack

New submissions, decisions and publication into the committee channel. Nobody waits on someone remembering to tell them.

Assets

Hand back a presigned upload, a presigned download, a delete.

storage.r2

Object storage (R2)

Headshots, slides and recordings upload straight from the browser to your bucket. File bytes never pass through the application, so a 200 MB deck is not a request timeout.

First-pass review

Score this proposal against this rubric, and say why.

analytics.local_evaluator

First-pass triage (local, no model)

Off unless you switch it on. Its opinions sit beside your reviewers', never inside them, and a machine score never contributes to quorum. The shipped evaluator calls no external model; the contract lets you point it at one you trust.

Ticketing

Is this workshop full? Nothing else.

ticketing.stub

Ticketing (local stub)

One method on purpose. Registration lives in your ticketing system and attendees are not modelled here. The one answer the schedule needs — has this workshop room left — is cached into the published snapshot, so a public page never calls your provider.

Two-way sync, in detail

The spreadsheet your team keeps anyway, made live.

Organizers keep a spreadsheet regardless. It holds the columns this tool will never have — hotel booked?, swag size, legal cleared the recording— and it is open to sponsorship sales, the AV contractor and the volunteer coordinator. Today it is a stale copy somebody pasted in March.

Map a kind of record to a table and Podium mirrors it, with linked records, single selects and attachments. Every mapped field is pushed; only the ones you mark two-way come back.

When both sides moved, the inbound edit loses. It is not thrown away: it goes into a conflict queue showing both values, and Podium's value is re-pushed so the table converges.

Decisions, entitlements and the schedule are push-only and always will be. A dropdown in a spreadsheet must not be able to send four hundred rejections at 2 a.m.

The sync screen: two mapped tables, Sessions and Proposals, both active, with counts of records in sync, pending, in conflict and errored, above the form for mirroring another kind of record.
Mapping a record type to a table, shot against the in-memory provider that ships for development. The screen is the same for every sync provider.
Always on

You get this without installing anything.

136 named events, 22 API scopes, and a public schedule your CDN can cache. This part is not a plugin.

A REST API with scopes that mean something

Read and write are separate scopes, and personal data is a scope on top. A key for your marketing site reads the schedule and cannot read a review or a speaker's email. Keys are scoped to named events, expire, and are shown once.

Signed webhooks on every change

Every fact the platform records is published as a named event: a proposal accepted, a task completed, a schedule published. Each arrives signed, with retries and a dead-letter queue you can replay from.

An embeddable schedule your site can cache

The public schedule is an immutable, versioned snapshot. Your site embeds it, a CDN caches it, and it renders with scripts blocked. Nothing public reads your database.

Import and export that go both ways

Bring speakers and proposals in from the tool you are leaving as CSV, and take everything back out the same way. No export ticket, no format only we can read.

The API and webhook reference →

Built for an agent to drive

The caller might not be a person.

A conference team is increasingly one organizer and the agent they work through. The management surface is one versioned API, 190 endpoints with the agenda grid among them, built for a caller that retries and cannot ask what a field meant.

What the API doesWhat that stops
Every write takes an idempotency key, stored and replayed for 24 hoursA retried call that books the room twice
Errors are typed and name the rule that was brokenA caller that reads a bare 400 and guesses
A write can carry the version it read; a stale one is refused with the current stateAn agent overwriting the edit a human made while it was thinking
Read and write are separate scopes, and personal data is a scope on topA schedule integration reading a speaker's phone number
Keys are scoped to named events and expireOne leaked key that reaches every event you have ever run
Named events arrive on a signed webhook, at least oncePolling, and the staleness that comes with it
The specification is a document a model can readGuessing what an entitlement is

The agents in this repository build Podium. They do not run your conference. Podium is written by coding agents working to a specification that comes before the code. One refuses a request the model does not cover. Another checks the code back against the model, and fails the build in CI.

What ships for you is the API above and the model it was built from: a document your own agent can read. There is no bundled assistant, no server your agent connects to and no machine-readable schema file. Anything driving Podium today is driving HTTP.

Not built yet

Specified, with no adapter shipped.

The contracts exist and the install screen knows about them. Nobody has written the provider yet. They are listed so the catalogue above can be read as complete.

  • Calendar — Push a speaker's session and tech check into their own calendar.
  • CRM — Sponsor fulfilment visible to the sales side without a manual export.
  • SSO — OIDC discovery, for organizations that want it for staff and reviewers.
  • SMS — For the day-of messages that email is too slow for.
  • Video — For the recording pipeline after the event.

What running this costs →

Install one against the demo and watch it work.

The demo signs you in as the program chair, with the install screen and the outbox both open to you.