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

# Quickstart

> Send your first profile and event to Glyph in a few minutes.

This guide sends a customer profile and event to a new Glyph workspace. To use a coding agent for the integration, see [Set up with AI](/docs/ai-setup).

## Prerequisites

* A Glyph workspace — [start free](https://glyphhq.io), no card required.
* Node.js 18+ (browser or Node SDK) or Python 3.9+ (Python SDK).

## Get started

<Steps>
  <Step title="Get a write key">
    In your workspace, switch to **Test**, then open **Settings** → **SDK keys**. Click **Create key**, name it (for example, `Local development`), choose whether it will be used by a server, browser, direct HTTP integration, or backfill, and copy the value.

    * `glyph_test_...` — sends events to your workspace's isolated test environment. Use this to verify an integration without touching live data.
    * `glyph_pk_...` — sends live customer traffic. Use this in production.

    Glyph shows the full key only when it is created or rotated. Store server-side keys in an environment variable such as `GLYPH_WRITE_KEY`. Create a separate live key when the integration is ready for production.
  </Step>

  <Step title="Install an SDK">
    <CodeGroup>
      ```bash Browser theme={"dark"}
      npm install @glyphhq/browser
      ```

      ```bash Node.js theme={"dark"}
      npm install @glyphhq/node
      ```

      ```bash Python theme={"dark"}
      pip install glyphhq
      ```
    </CodeGroup>
  </Step>

  <Step title="Send a profile and an event">
    Send the profile first, then record an event. `userId` is the stable identity key. Every profile must include `email`.

    <CodeGroup>
      ```ts Browser theme={"dark"}
      import { GlyphBrowser } from "@glyphhq/browser";

      const glyph = new GlyphBrowser({ writeKey: "glyph_test_..." });

      glyph.profile("user_123", {
        email: "sarah@example.com",
        plan: "pro",
      });
      glyph.track("user_123", "Project created");
      ```

      ```ts Node.js theme={"dark"}
      import { GlyphNode } from "@glyphhq/node";

      const writeKey = process.env.GLYPH_WRITE_KEY;
      if (!writeKey) {
        throw new Error("GLYPH_WRITE_KEY is not set");
      }

      const glyph = new GlyphNode({ writeKey });

      await glyph.profile("user_123", {
        email: "sarah@example.com",
        plan: "pro",
      });
      await glyph.track("user_123", "Invoice paid", {
        amount: 4900,
        currency: "USD",
      });

      await glyph.flush();
      ```

      ```py Python theme={"dark"}
      from glyphhq import Glyph

      glyph = Glyph(write_key="glyph_test_...")

      glyph.profile("user_123", {"email": "sarah@example.com", "plan": "pro"})
      glyph.track("user_123", "Invoice paid", {"amount": 4900, "currency": "USD"})
      glyph.flush()
      ```
    </CodeGroup>

    Messages are queued locally and sent in batches. `flush()` sends the current queue immediately. Call it before a script or serverless function exits.
  </Step>

  <Step title="Verify in Glyph">
    Open your workspace and switch to the test environment. The customer profile and event should appear on the same timeline. Test traffic never mixes with live customer data.

    If nothing appears, check the key's **last used** value in **Settings**. A value of "never" means Glyph has not received a request for that key. See [Troubleshooting](/docs/guides/troubleshooting) for the next checks.
  </Step>
</Steps>

## Next steps

<Columns cols={2}>
  <Card title="What to capture" icon="list-check" href="/docs/guides/what-to-capture">
    Choose events and traits that add useful customer context.
  </Card>

  <Card title="Configuration & delivery" icon="sliders" href="/docs/reference/configuration">
    Batching, flush behavior, retries, and error handling across SDKs.
  </Card>
</Columns>

Stuck? Email [hello@glyph.app](mailto:hello@glyph.app) and a founder answers.
