LinkStacked

Team & imports

Two surfaces aimed at agencies and migrating customers.

Manage team membership

mutation Invite($input: InviteTeamMemberInput!) {
  inviteTeamMember(input: $input) {
    membership { _id email role status }
  }
}
{
  "input": {
    "email": "designer@agency.example",
    "role": "EDITOR",
    "profileId": "65f..."
  }
}

Roles are coarse-grained on purpose — ADMIN, EDITOR, VIEWER — and gate the same dashboard surfaces you'd expect. Custom roles are an Enterprise add-on. removeTeamMember, updateTeamMemberRole, and resendTeamInvite round out the surface.

Audit log

Every privileged action emits an audit entry. Read it with teamAuditLog(filter, pagination):

query Audit($filter: AuditLogFilterInput, $pagination: PaginationInput) {
  teamAuditLog(filter: $filter, pagination: $pagination) {
    items {
      _id action actorId profileId metadata createdAt
    }
    total page limit
  }
}

The same data is exportable as CSV via exportTeamAuditLogCSV.

Import from another platform

mutation Import($input: ImportLinksInput!) {
  importLinks(input: $input) {
    job { _id status sourcePlatform totalLinks importedLinks errors }
  }
}

Supported sourcePlatform values: LINKTREE, BEACONS, CARRD. The return is a job — poll importJob(id) to follow the run, or subscribe to your webhook of choice for completion notifications.

Selective imports

importLinks accepts a dryRun: true flag that returns the candidate link list without writing anything. Use it to render an "approve which links to bring across" UI before committing the actual import.