> ## Documentation Index
> Fetch the complete documentation index at: https://docs.vein.finance/llms.txt
> Use this file to discover all available pages before exploring further.

# Roles and permissions

> What each role can do, and why a control you expected is not on your screen.

export const Diagram = ({kind = "chain", steps = [], feedback = null, sources = [], decision = null, result = null, source = null, hub = null, branches = [], pairs = []}) => {
  const glyph = k => <svg viewBox="0 0 20 12" fill="none" aria-hidden="true" key={k}>
      <path d="M1 6h15.5" stroke="currentColor" strokeWidth="1.75" strokeLinecap="round" />
      <path d="M13.5 1.5 18.5 6l-5 4.5" stroke="currentColor" strokeWidth="1.75" strokeLinecap="round" strokeLinejoin="round" />
    </svg>;
  const arrow = k => <span className="vein-flow__chevron" key={`a${k}`}>
      {glyph(k)}
    </span>;
  const box = (n, k, variant) => n ? <div key={`n${k}`} className={variant ? `vein-flow__node vein-flow__node--${variant}` : "vein-flow__node"}>
        <span className="vein-flow__label">{n.label}</span>
        {n.note ? <span className="vein-flow__note">{n.note}</span> : null}
      </div> : null;
  const spine = paths => <div className="vein-flow__spine">
      <svg viewBox="0 0 100 100" preserveAspectRatio="none" fill="none">
        {paths.map(d => <path key={d} d={d} stroke="currentColor" strokeWidth="1.5" strokeLinecap="round" vectorEffect="non-scaling-stroke" />)}
      </svg>
    </div>;
  if (kind === "merge") {
    return <div className="vein-flow">
        <div className="vein-flow__branching">
          <div className="vein-flow__stack">
            {sources.map((s, i) => <div className="vein-flow__row" key={s.label}>
                {box(s, i)}
              </div>)}
          </div>
          {}
          {spine(["M0 25C55 25 45 50 100 50", "M0 75C55 75 45 50 100 50"])}
          {arrow("d")}
          {box(decision, "d", "decision")}
          {arrow("r")}
          {box(result, "r", "strong")}
        </div>
      </div>;
  }
  if (kind === "fan") {
    return <div className="vein-flow">
        <div className="vein-flow__branching">
          {box(source, "s")}
          {arrow("s")}
          {box(hub, "h")}
          {}
          {spine(["M0 50C55 50 45 16.667 100 16.667", "M0 50H100", "M0 50C55 50 45 83.333 100 83.333"])}
          <div className="vein-flow__stack">
            {branches.map((b, i) => <div className="vein-flow__row" key={b.label}>
                {arrow(`b${i}`)}
                {box(b, `b${i}`)}
              </div>)}
          </div>
        </div>
      </div>;
  }
  if (kind === "compare") {
    return <div className="vein-flow">
        <div className="vein-flow__compare">
          {pairs.map((p, i) => <div className="vein-flow__pair" key={p.from.label}>
              {box(p.from, `f${i}`)}
              {arrow(`p${i}`)}
              {box(p.to, `t${i}`, "strong")}
            </div>)}
        </div>
      </div>;
  }
  const n = steps.length;
  const centre = i => `${((i + 0.5) / n * 100).toFixed(3)}%`;
  return <div className="vein-flow">
      <div className="vein-flow__track" style={{
    "--vein-flow-n": n
  }}>
        {steps.map((step, i) => <div className="vein-flow__cell" key={step.label}>
            {box(step, i, step.strong ? "strong" : null)}
            {i < n - 1 ? arrow(i) : null}
          </div>)}
      </div>

      {feedback ? <div className="vein-flow__loop">
          <div className="vein-flow__loop-path" style={{
    left: centre(feedback.to),
    right: `calc(100% - ${centre(feedback.from)})`
  }} />
          <span className="vein-flow__loop-chevron" style={{
    left: centre(feedback.to)
  }}>
            {glyph("loop")}
          </span>
          {feedback.label ? <span className="vein-flow__loop-label" style={{
    left: `calc((${centre(feedback.to)} + ${centre(feedback.from)}) / 2)`
  }}>
              {feedback.label}
            </span> : null}
        </div> : null}
    </div>;
};

Everyone in Vein belongs to one company and holds one role inside it. That role
decides which controls you see.

The important thing to know up front is that Vein **hides** controls you cannot
use rather than showing them greyed out. If a colleague describes a button you
cannot find, you are almost certainly on a lower role rather than looking in the
wrong place.

Companies and investment firms use different ladders, because they do different
work. Both run from least to most permissive, and each role includes everything
below it.

## If you are a company

<Diagram
  kind="chain"
  steps={[
{ label: "Viewer", note: "read only" },
{ label: "Member", note: "builds drafts" },
{ label: "Admin", note: "sends and connects" },
{ label: "Owner", note: "everything", strong: true },
]}
/>

| You can                                    | Viewer | Member | Admin | Owner |
| ------------------------------------------ | :----: | :----: | :---: | :---: |
| Read reports, metrics, and the Vault       |   Yes  |   Yes  |  Yes  |  Yes  |
| Create and edit draft reports              |   No   |   Yes  |  Yes  |  Yes  |
| Send a report to investors                 |   No   |   No   |  Yes  |  Yes  |
| Connect, sync, or disconnect a data source |   No   |   No   |  Yes  |  Yes  |
| Manage the team                            |   No   |   No   |  Yes  |  Yes  |

The line that catches people out is **sending**. A member can assemble an entire
report and never find the control that delivers it, because sending is the step
that puts numbers in front of an outsider. If you are building reports but cannot
send them, ask an admin either to send yours or to raise your role.

## If you are an investor

<Diagram
  kind="chain"
  steps={[
{ label: "Viewer", note: "read only" },
{ label: "Member", note: "read only, for now" },
{ label: "Admin", note: "requests and adds companies" },
{ label: "Owner", note: "everything", strong: true },
]}
/>

| You can                                     | Viewer | Member | Admin | Owner |
| ------------------------------------------- | :----: | :----: | :---: | :---: |
| Read the portfolio, reports, and dashboards |   Yes  |   Yes  |  Yes  |  Yes  |
| Create an ad-hoc report request             |   No   |   No   |  Yes  |  Yes  |
| Add a portfolio company                     |   No   |   No   |  Yes  |  Yes  |
| Manage reporting schedules                  |   No   |   No   |  Yes  |  Yes  |
| Manage request templates                    |   No   |   No   |  Yes  |  Yes  |
| Manage the team                             |   No   |   No   |  Yes  |  Yes  |

Every outbound action toward a portfolio company — a one-off request, a
standing schedule, a saved template, adding a company in the first place — is
an admin decision, because each one puts an ask in front of an outsider on the
firm's behalf. A member currently has the same access as a viewer; the role
exists for firms that want to bring someone on before deciding how much they
should be able to commit the firm to.

<Tip>
  The **API Keys** panel in Settings is an investor-side feature and requires
  admin or above. It does not appear on a company's Settings page at all, so if
  you are at a company and following the [API keys](/api-keys) page, you will not
  find a key to issue.
</Tip>

## Changing someone's role

Team management is not yet self-serve. The Team section in Settings lists your
company, but inviting someone, changing a role, and removing a member are still
handled by us rather than in the product.

Email [team@vein.finance](mailto:team@vein.finance) with the company name, the
person's email address, and the role you want them on. Both ladders use the
same four names, so say which company you mean — "admin" alone doesn't say
whether you're talking about a company or an investment firm.

<Warning>
  Roles govern what someone can do inside **your** company. They are unrelated to
  what an investor can see of you, which is decided per investor by
  [approving data access](/guides/approve-data-access) and by what you choose to
  put in each report.
</Warning>
