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

# n8n

![n8n](https://mintcdn.com/frontic/zwqcoY8MRIYLLSYv/images/connectors/n8n.svg?fit=max\&auto=format\&n=zwqcoY8MRIYLLSYv\&q=85\&s=6951fbf220ce969c4d6a9fb8a16f3baa)

Frontic publishes a community node for [n8n](https://n8n.io), [`@frontic/n8n-nodes-ingest`](https://www.npmjs.com/package/@frontic/n8n-nodes-ingest), that pushes records into a Frontic [Custom integration](https://docs.frontic.com/connectors/custom.md) over the [Ingest API](https://docs.frontic.com/reference/ingest-api.md). Build the workflow in n8n the way you build any other: pick a trigger, transform the data, and put the **Frontic Ingest API** node at the end. Every workflow run lands its records on the Frontic feed.

&#x20;Auth

Ingest API key

&#x20;Update method

Ingest API (push from n8n)

&#x20;Resources

Anything you push

## When to reach for n8n

Use this pattern when:

* You already run n8n to orchestrate data flow between systems and want Frontic to receive the enriched output.
* The source you want to ingest from doesn't have a first-party Frontic connector and you'd rather configure n8n than write code.
* You need a transformation step (deduplication, enrichment from another API, scheduled aggregation) before records get pushed to Frontic.

If your source is a system Frontic already connects to (Shopware, Shopify, Akeneo, …), use that connector directly - there's no advantage to routing through n8n.

## Install the community node

1. In your n8n instance, open **Settings → Community Nodes** and click **Install a community node**.
2. Enter the package name `@frontic/n8n-nodes-ingest` and confirm.
3. n8n installs and registers the node. The **Frontic Ingest API** node becomes available in the node picker for any workflow.

See n8n's [community nodes installation docs](https://docs.n8n.io/integrations/community-nodes/installation/) if your environment needs extra configuration, such as a self-hosted instance with restricted package installs.

## Set up the Frontic side

The node pushes records into a Frontic Data Feed, so set up the Frontic side first.

**1. Create or pick a Custom integration**

In Frontic, create a [Custom integration](https://docs.frontic.com/connectors/custom.md) or open an existing one. The n8n node pushes into it.

**2. Add a Data Feed**

On that integration, add a Data Feed for the resource type you'll push (Content, Products, or Categories). On the feed's **Updates** tab, select the **Ingest** method. The **Ingest Endpoints** section then shows the feed's **Upsert** and **Delete** URLs. Copy both; you'll paste them into n8n in the next step.

**3. Create an Ingest API key**

In the admin app, open **Settings → API Keys**, click **Add API Key**, and select **Ingest API**. Copy the key; n8n needs it for the credential. See [Ingest API → Authentication](https://docs.frontic.com/reference/ingest-api.md#authentication) for details.

## Configure the node in n8n

Add a **Frontic Ingest API** node to your workflow. Under **Frontic Ingest API Credentials**, create a new credential with three fields:

| Field | Value |
| - | - |
| **API Key** | The Ingest API key you created above. |
| **Upsert Endpoint** | The feed's Upsert URL: `https://ingest-<integration-id>.frontic.com/ingest/<feed-token>/upsert`. |
| **Delete Endpoint** | The feed's Delete URL: the same shape, ending in `/delete`. |

The node has one setting, **Ingest Operation**, with two values:

* **Create or Update** (the default) - POSTs the workflow's input items as a JSON array to the Upsert endpoint. Records that already exist get updated; new ones get created.
* **Delete** - POSTs the input items to the Delete endpoint to remove those records from the feed. Each item only needs the feed's Source ID field, for example `{ "id": "product-123" }`.

The node collects every input item from the previous node, sends them in one POST, and passes Frontic's response (the [correlation ID](https://docs.frontic.com/reference/ingest-api.md#response-format)) on to the next node. One workflow run can push or delete any number of records in a single call.

> [!WARNING]
>
> Delete operations are permanent. Make sure your workflow's output is the set of records you actually want gone - piping a "fetch everything" node into a Delete operation removes all of it.

## What the data looks like

You define the record shape - the node passes through whatever JSON your previous nodes produce. Match the [Custom integration's record structure](https://docs.frontic.com/connectors/custom.md#record-structure) so Frontic recognises the `@channel`, `@translation`, and `@currency` annotations:

```json theme={"theme":"css-variables"}
{
  "id": "product-123",
  "name": "Example Product",
  "@translation": {
    "de-DE": { "name": "Beispielprodukt" },
    "en-GB": { "name": "Example Product" }
  },
  "@currency": {
    "EUR": { "price": { "amount": 1999, "currency": "EUR", "precision": 2 } }
  }
}
```

Every record needs the **Source ID** field configured on the feed (defaults to `id`). Records without it aren't processed.

## Example workflows

A few patterns that work well with the node:

* **Schedule Trigger → Source API → Frontic Ingest API (Create or Update)** - keep Frontic in sync with a system that doesn't have a native connector, on a fixed cadence.
* **Webhook → Edit Fields (Set) / Code → Frontic Ingest API** - react to events from a CRM, ERP, or third-party SaaS the moment they happen.
* **Google Sheets Trigger → Frontic Ingest API** - drive Frontic content from a spreadsheet your team already edits.
* **Schedule Trigger → Source API → Compare Datasets → Frontic Ingest API (Delete)** - a periodic reconciliation pass that removes records which disappeared upstream.

When the workflow works, activate it in n8n. From then on, every run pushes its output into Frontic.

## Troubleshooting

If the workflow runs but records don't show up where you expect:

* **401 errors** - the API key is wrong or isn't an Ingest API key, or the integration ID in the endpoint URL is wrong. Check the key under **Settings → API Keys** and re-copy both endpoint URLs from the feed's **Updates** tab.
* **422 errors** - the response's `code` says why: `invalid_payload` means the body wasn't valid JSON, and `ingest_api_limit_exceeded` means your team has used up its [API Updates](https://docs.frontic.com/admin/billing-and-plans.md) quota.
* **The call succeeds but records never reach the feed** - Frontic accepts the call before it checks the feed. Confirm the feed token in the URL is the current one and that the feed's update method is **Ingest**. Open the Data Feed's **Recent Records** to see what arrived.
* **Records arrived but didn't reach the storage** - the issue is downstream. Walk through the [Custom integration troubleshooting steps](https://docs.frontic.com/connectors/custom.md#troubleshooting): typically a missing Data Sync, an incomplete locale mapping (don't forget the fallback translation), or a Value Composer chain raising a transformation error.

## Good to know

* **You own the schema.** No normalization happens on the connector side - what you push is what's stored on the feed (reshaping into your storage schema is the Data Sync's job).
* **No webhooks back to n8n.** This is a one-way push from n8n into Frontic. If you need Frontic to notify n8n of changes in Frontic, use a separate webhook source on the n8n side.
* **Quota counting.** Records you push from n8n count against your **API Updates** quota the same as any other Ingest API push. Deletes don't. Schedule deliberately.

## Without the community node

If you can't install community nodes, for example on a locked-down n8n instance, the same workflow runs against an **HTTP Request** node:

* **Method**: `POST`
* **URL**: the feed's Upsert (or Delete) endpoint
* **Authentication**: Header Auth - header name `Authorization`, header value the Ingest API key (no `Bearer ` prefix)
* **Body**: a JSON array of records, matching the [Custom integration's record structure](https://docs.frontic.com/connectors/custom.md#record-structure)

The request and Frontic's response are the same as with the community node, which wraps exactly this HTTP call.

## Related

> [card] [Custom Integration](https://docs.frontic.com/connectors/custom.md)
>
> The Frontic-side configuration n8n posts to.

> [card] [Ingest API](https://docs.frontic.com/reference/ingest-api.md)
>
> The HTTP endpoints, payload shape, and auth model.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.