GenieOS · Data

Marketing, measured against your own tables.

One connection, two jobs. Your agents segment on live production columns instead of stale exports, and every campaign is bound to the column it was meant to move, so the result is read from your database rather than from a dashboard. You choose exactly what GenieOS can see, and the scope stays yours.

agent.tsts
// segment on live production columnssend_transactional({  template: "directory-launch",  segment:    "users.plan = 'free' AND users.activated_at IS NULL",})// who matches right now, not who matched// at the last export
The surface
  • create_listMaterialise a segment as a list any send, sequence or campaign can target.
  • add_list_membersPush people in from your own code. Provenance is recorded on every contact.
  • list_listsWalk what already exists before your agent writes more.
  • read_listOne list, its members and where each of them came from.
  • emit_eventSend a product event in. Sequences and triggers key off it.
  • create_webhookMovement in the columns you care about, pushed back out as data.

The connection itself is deliberately not a tool. You make it once, in the app, at Audience, then Connect, then Production Databases, and you scope it there. Everything above reads through that scope, and nothing reads past it.

GENIEOS CAN SEE

users
id · created_at · activated_at · plan
subscriptions
status · mrr

Nothing else.

READ ONLY · YOURS TO SHRINK · REVOKE ANY TIME

The scope, as the workspace renders it. Two tables, six columns, and a full stop.
Production databasesSupabaseFirestore

You choose exactly what GenieOS can see.

The connection is read only and the scope is explicit. You name the tables and the columns, GenieOS sees those and nothing else, and the workspace renders the scope back to you as a plain list you can read in five seconds. Shrink it whenever you like. Nothing downstream breaks, it simply sees less.

That precision is what makes the rest of this page comfortable to want. An agent segmenting on production data is only acceptable when you can say exactly what it can reach, and here the answer is short enough to read aloud.

AudienceFueld

GENIE · AUDIENCE

Everyone you can reach.

Contacts, lists, and segments in one place. Switch between them up top — every send, sequence, and campaign draws from here.

ContactsListsSegmentsInbox65 CONTACTSNew contactConnect
CONTACTCOMPANYSOURCESSENTOPENSLAST SEEN
Sana Patel[email protected]CSV0013m ago
Omar Diaz[email protected]CSV0013m ago
Femi Sato[email protected]CSV0013m ago
Xavi Cobb[email protected]CSV0013m ago
Jack Ortiz[email protected]CSV0013m ago
Erin Lane[email protected]CSV0013m ago

BRING AN AUDIENCE IN

ApolloProspect and import people, in chat
SegmentSOONSync audiences from your CDP
HubSpotSOONImport lists from your CRM
CSV importUpload a file — columns mapped for you
Auto-captureForms and replies land here on their own
The Audience hub with the Connect menu open. The connector lives where you use it, not in a settings page.

Segment on live production columns.

The connector lives where you use it: in the Audience hub, under Connect, beside the audiences it feeds. Once it is made, segmentation stops being an export. Your agents write segment expressions against your real columns, users still unactivated after seven days, accounts on the free plan approaching a limit, and the send targets who matches right now rather than who matched at the last sync.

Contacts keep their lineage too. Every contact carries provenance chips in a SOURCES column, paste, send, manual, so there is always an answer to where a person came from. It is the same idea as derived artefacts, one level down: nothing in the workspace is unaccounted for.

IN-APP · SUPERVISEYour agent reads the numbers as JSON. Forty artefacts across three channels want a spatial view.
AnalyzeFueld
OverviewEmailSocialPageMessageCampaign

OBJECTIVE · THIS CAMPAIGN

users.activated_atwithin 7 days of sign-up

412of 500 target

Measured in your own database. Missed by 18%, so the next campaign is already drafted against what moved.

Shipped in the last 30 days

18,402

REACH

24

ARTEFACTS LIVE

412

CONVERSIONS

Lands with attribution

BY CHANNEL

Email

9,140

recipients

Pages

4

live

Social

4

live

Campaigns

16

campaigns

TOP PERFORMERS

  • Your health data finally has a homeCampaign · 3d ago4
  • One place for every metricCampaign · 9d ago4
  • What your numbers were telling youCampaign · 16d ago3
  • The week your sleep changedCampaign · 23d ago4

Every campaign is bound to a column.

Measurement is the other half of the same connection. A campaign is bound to a column in your own database, users.activated_at, subscriptions.mrr, whatever the campaign was actually for, and movement in that column is attributed back to it. Not opens. The number your product already keeps.

Attribution has a primitive underneath it: a link GenieOS sent to a known contact comes back IDENTIFIED, so a conversion lands on the campaign and the artefact that produced it. Your agents read all of this as data, and when the loop derives the next campaign, this is the answer it derives it from.

When this happens
  • Whenusers.activated_at still null after 7 days

    ThenA nudge sequence, segmented on your own column

    • enroll_in_sequence

Success is a column in your database.