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

# Pennylane Firm

export const OverviewLegend = ({showTitle = true}) => <blockquote>
    {showTitle && <p>
        <strong>Overview legend 🧭</strong>
      </p>}
    <table>
      <thead>
        <tr>
          <th>Column</th>
          <th>Value</th>
          <th>Meaning</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td>Geography</td>
          <td>🇫🇷 FR · 🇧🇪 BE · …</td>
          <td>Countries where the connector is officially supported.</td>
        </tr>
        <tr>
          <td rowSpan={3}>Software type</td>
          <td>SaaS</td>
          <td>Through API.</td>
        </tr>
        <tr>
          <td>On-premise (local agent)</td>
          <td>
            Software running locally — installation of a local agent is
            required.
          </td>
        </tr>
        <tr>
          <td>On-premise (API)</td>
          <td>Software running locally — API available.</td>
        </tr>
        <tr>
          <td rowSpan={2}>Status</td>
          <td>🔵 Live</td>
          <td>Connector is generally available and production-ready.</td>
        </tr>
        <tr>
          <td>🟣 Beta</td>
          <td>
            Connector is in beta — usable in production but may still evolve.
          </td>
        </tr>
        <tr>
          <td>Multi folder</td>
          <td>✅ Yes / ❌ No</td>
          <td>
            Connection to multiple accounting folders at the same time (see{' '}
            <a href="/developer-guides/api-guides/accounting/folders">
              accounting folders guide
            </a>
            ).
          </td>
        </tr>
        <tr>
          <td>Rate limits</td>
          <td>✅ No / ❌ Yes</td>
          <td>Whether the target software sets rate limits on API calls.</td>
        </tr>
        <tr>
          <td rowSpan={3}>API keys</td>
          <td>❎ No</td>
          <td>
            No API keys required (OAuth2 client secret and client ID). No
            requirements to activate the connector — you can create a
            connection.
          </td>
        </tr>
        <tr>
          <td>🔑</td>
          <td>
            Keys are required to activate the connector. Chift cannot act as
            intermediary to obtain them; we can still assist with steps to get
            keys directly from the software provider.
          </td>
        </tr>
        <tr>
          <td>🔑 ☑️ via Chift</td>
          <td>
            Keys are required to activate the connector. You can go through
            Chift to get the keys (intermediary or partnership keys). An
            approval process may still apply, but you do not need to request
            keys from the vendor on your own.
          </td>
        </tr>
        <tr>
          <td rowSpan={3}>Approval / certification process</td>
          <td>⚡ Instant</td>
          <td>
            No keys required, or Chift can encode their keys for you when
            requested. Activation is instantaneous.
          </td>
        </tr>
        <tr>
          <td>🟢 Approval — [Duration]</td>
          <td>
            Approval will be granted. The vendor may require information or app
            configuration in a developer portal before issuing keys.
          </td>
        </tr>
        <tr>
          <td>🟠 Approval — [Duration]</td>
          <td>
            Approval is not guaranteed — often due to integration strategy; the
            vendor may do a deeper assessment (competitors, partnership
            requirements, and similar).
          </td>
        </tr>
        <tr>
          <td rowSpan={2}>Activation time</td>
          <td>⚡ Instant</td>
          <td>
            If no keys are required, or Chift has keys ready to share with you.
          </td>
        </tr>
        <tr>
          <td>Time</td>
          <td>
            Estimated time to get the connector activated in production as a
            result of the approval or certification process (e.g. ⏱️ 2 days, 1
            week).
          </td>
        </tr>
        <tr>
          <td rowSpan={3}>Extra fees — software editor</td>
          <td>❎ No</td>
          <td>No fees charged by the software editor.</td>
        </tr>
        <tr>
          <td>💰 🕹️</td>
          <td>Fees associated with obtaining a testing account.</td>
        </tr>
        <tr>
          <td>💰 🔑</td>
          <td>Fees charged to get API keys.</td>
        </tr>
        <tr>
          <td rowSpan={2}>Extra fees — end user</td>
          <td>❎ No</td>
          <td>The end user does not pay extra to get integrated.</td>
        </tr>
        <tr>
          <td>💰 Yes</td>
          <td>The end user must pay extra to get integrated.</td>
        </tr>
        <tr>
          <td>Comments on costs</td>
          <td>—</td>
          <td>Additional notes on fees or pricing when relevant.</td>
        </tr>
        <tr>
          <td rowSpan={4}>Sandbox account</td>
          <td>✅ via Chift</td>
          <td>Chift can provide you with a sandbox.</td>
        </tr>
        <tr>
          <td>🟠 Only through integrator</td>
          <td>Only the software's integrator can provide a sandbox.</td>
        </tr>
        <tr>
          <td>✅ Self-service</td>
          <td>You can create your own sandbox.</td>
        </tr>
        <tr>
          <td>✅ Trial account</td>
          <td>It is possible to create a trial account.</td>
        </tr>
      </tbody>
    </table>
  </blockquote>;

export const ConnectorCardIframe = ({api = 'accounting', connectors}) => {
  const [theme, setTheme] = React.useState('light');
  React.useEffect(() => {
    const checkTheme = () => {
      const isDark = document.documentElement.classList.contains('dark');
      setTheme(isDark ? 'dark' : 'light');
    };
    checkTheme();
    const observer = new MutationObserver(checkTheme);
    observer.observe(document.documentElement, {
      attributes: true,
      attributeFilter: ['class']
    });
    return () => observer.disconnect();
  }, []);
  const queryParams = new URLSearchParams({
    api,
    theme,
    ...connectors ? {
      connectors
    } : {}
  });
  const iframeUrl = `https://chift-coverage-matrix.s3.eu-west-3.amazonaws.com/connector-card.html?${queryParams.toString()}`;
  return <iframe src={iframeUrl} title={`Chift connector information - ${api}`} style={{
    display: 'block',
    width: '100%',
    height: '480px',
    margin: 0,
    padding: 0,
    border: 'none'
  }} />;
};

export const PATCH = () => <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" color="orange">
    <path d="M3 12h2a2 2 0 1 0 0 -4h-2v8" />
    <path d="M10 16v-6a2 2 0 1 1 4 0v6" />
    <path d="M10 13h4" />
    <path d="M17 8h4" />
    <path d="M19 8v8" />
    </svg>;

export const DELETE = () => <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" color="red">
        <path d="M3 8v8h2a2 2 0 0 0 2 -2v-4a2 2 0 0 0 -2 -2h-2z" />
        <path d="M14 8h-4v8h4" />
        <path d="M10 12h2.5" />
        <path d="M17 8v8h4" />
    </svg>;

export const POST = () => <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" color="blue">
        <path d="M3 12h2a2 2 0 1 0 0 -4h-2v8" />
        <path d="M12 8a2 2 0 0 1 2 2v4a2 2 0 1 1 -4 0v-4a2 2 0 0 1 2 -2z" />
        <path d="M17 15a1 1 0 0 0 1 1h2a1 1 0 0 0 1 -1v-2a1 1 0 0 0 -1 -1h-2a1 1 0 0 1 -1 -1v-2a1 1 0 0 1 1 -1h2a1 1 0 0 1 1 1" />
    </svg>;

export const GET = () => <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" color="green">
        <path d="M7 8h-2a2 2 0 0 0 -2 2v4a2 2 0 0 0 2 2h2v-4h-1" />
        <path d="M14 8h-4v8h4" />
        <path d="M10 12h2.5" />
        <path d="M17 8h4" />
        <path d="M19 8v8" />
    </svg>;

<ConnectorCardIframe api="accounting" connectors="Pennylane Firm" />

<Accordion title="Overview Legend 🧭">
  <OverviewLegend showTitle={false} />
</Accordion>

# **Introduction**

Pennylane centralizes all financial and accounting flows in real time and streamlines collaboration between business leaders and their accountants. \
Beyond the Company API designed for use by individual businesses, Pennylane also offers a dedicated **Firm API** tailored specifically for accounting practices and the tools they build. This Firm API provides authenticated access to a firm’s entire portfolio of client companies, enabling retrieval of consolidated client lists, detailed accounting reports (trial balance, FEC, analytical ledger), and other firm‑level data. It’s the foundation for integrations that need to operate across multiple client accounts and embed Pennylane data directly into a practice’s workflows or software ecosystem.

## Configure Pennylane

<Info>
  Sandbox and production credentials are identical on Pennylane's side. Before going live, your integration must be certified by both Chift and Pennylane (see Step 3).
</Info>

Follow the steps below to get sandbox access, retrieve your OAuth2 credentials, and go live. Chift can assist you with each step.

### Step 1: Open the partnership & get sandbox access

Fill in the [partnership form](https://www.notion.so/23b2276c03bf8059a59dcb775b546a96?pvs=21):

* **Question 4** — Which entity will be responsible for developing the connector? Select **Chift**.
* **Question 5** — Do you have access to the Pennylane sandbox? Select **No, open access for me**. Question 5b will then appear; enter the email address to associate with the sandbox.

<Tip>
  By default, Pennylane provides sandboxes **without the accounting module**. Once you're connected to your sandbox, notify Chift so we can ask Pennylane to activate it for you.
</Tip>

### Step 2: Get your OAuth2 credentials

Fill in the [OAuth2 request form](https://form.typeform.com/to/Vn0iWTJv) to receive your **Client ID** and **Client Secret**.

### Step 3: Go live — certify your integration

Fill in the [pre-certification form](https://www.notion.so/23e2276c03bf80bc9704c06e99cd059c?pvs=21), then ask Chift to schedule a meeting with Pennylane. During this meeting you'll:

* Present an internal demo of your integration to Pennylane.
* Have Chift on the call to answer any technical questions.

### Step 4: Publish on Pennylane's marketplace & in-app

To appear on Pennylane's public marketplace and in-app, and to benefit from their communication around your partnership, fill in the [app-listing form](https://www.notion.so/2402276c03bf80eea025ffdd8d1b214a?pvs=21).

## Test Pennylane

You will receive sandbox access directly after filling in the partnership form from *Step 1*. Don’t forget to reach out to your Chift point of contact to activate the Accounting module.

## **Connect Pennylane**

To activate a connection with Pennylane, users will have to go through the following steps. \
French article: [**Help Center - Pennylane FR**](https://help.chift.app/articles/9277286785-pennylane?lang=fr) \
English article: [**Help Center - Pennylane EN**](https://help.chift.app/articles/9277286785-pennylane?lang=en)

## Coverage
