> ## Documentation Index
> Fetch the complete documentation index at: https://invopop-link-fix.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# NO VERI*FACTU onboarding guide

> Register and manage suppliers in Spain with NO VERI*FACTU.

export const esNoverifactuSummaryEventWorkflow = {
  "name": "NO VERI*FACTU summary event",
  "description": "Build a NO VERI*FACTU summary event (cron-driven)",
  "schema": "org/party",
  "steps": [{
    "id": "f6a7b8c0-0006-11f1-a000-000000000001",
    "name": "Build status for NO VERI*FACTU",
    "provider": "gov-es.noverifactu.build.status",
    "summary": "Build status: 10 - Summary event",
    "config": {
      "event_type": "10"
    }
  }, {
    "id": "4f527c60-3a95-11f1-a472-21be9722e465",
    "name": "Create a job",
    "provider": "transform.job.create",
    "summary": "Send to NO VERI*FACTU process event (bill/status)",
    "config": {
      "silo_entry_meta_key": "",
      "workflow_id": ""
    }
  }],
  "rescue": [{
    "id": "f6a7b8c0-0006-11f1-a000-000000000003",
    "name": "Set state",
    "provider": "silo.state",
    "summary": "Set state to `error`{.state .error}",
    "config": {
      "state": "error"
    }
  }]
};

export const esNoverifactuEventWorkflow = {
  "name": "NO VERI*FACTU process event",
  "description": "Generate and store a NO VERI*FACTU event record",
  "schema": "bill/status",
  "steps": [{
    "id": "e5f6a7b0-0005-11f1-a000-000000000004",
    "name": "Set state",
    "provider": "silo.state",
    "summary": "Set state to `processing`{.state .processing}",
    "config": {
      "state": "processing"
    }
  }, {
    "id": "bbf19740-3a6b-11f1-9a44-6748aa5d4a91",
    "name": "Modify silo entry",
    "provider": "silo.modify",
    "summary": "Default series to \"NVF\"",
    "config": {
      "jq": ".series //= \"NVF\"",
      "merge_type": "application/jq",
      "scope": "doc"
    }
  }, {
    "id": "a1b2c3d0-0001-11f1-a000-000000000002",
    "name": "Add sequential code",
    "provider": "sequence.enumerate",
    "summary": "Dynamic · NO VERI*FACTU · 000001",
    "config": {
      "name": "NoVerifactu",
      "padding": 6,
      "start": 1
    }
  }, {
    "id": "e5f6a7b0-0005-11f1-a000-000000000006",
    "name": "Sign envelope",
    "provider": "silo.close"
  }, {
    "id": "f8df5470-3c97-11f1-8c73-6dd226144d30",
    "name": "Generate event for NO VERI*FACTU",
    "provider": "gov-es.noverifactu.generate.event"
  }, {
    "id": "050b05a0-3c98-11f1-8c73-6dd226144d30",
    "name": "Record for NO VERI*FACTU",
    "provider": "gov-es.noverifactu.record"
  }, {
    "id": "e5f6a7b0-0005-11f1-a000-000000000005",
    "name": "Set state",
    "provider": "silo.state",
    "summary": "Set state to `registered`{.state .registered}",
    "config": {
      "state": "registered"
    }
  }],
  "rescue": [{
    "id": "e5f6a7b0-0005-11f1-a000-000000000003",
    "name": "Set state",
    "provider": "silo.state",
    "summary": "Set state to `error`{.state .error}",
    "config": {
      "state": "error"
    }
  }]
};

export const esNoverifactuUnregisterWorkflow = {
  "name": "NO VERI*FACTU unregister supplier",
  "description": "Unregister a supplier from NO VERI*FACTU and generate the end-of-mode event",
  "schema": "org/party",
  "steps": [{
    "id": "d4e5f6a0-0004-11f1-a000-000000000007",
    "name": "Set state",
    "provider": "silo.state",
    "summary": "Set state to `processing`{.state .processing}",
    "config": {
      "state": "processing"
    }
  }, {
    "id": "3e4bd770-3a92-11f1-a472-21be9722e465",
    "name": "Unsubscribe from periodic execution",
    "provider": "cron.unsubscribe"
  }, {
    "id": "f46dfa20-3ca3-11f1-90b7-0d81b4010093",
    "name": "Build status for NO VERI*FACTU",
    "provider": "gov-es.noverifactu.build.status",
    "summary": "Build status: 02 - End of NO VERI*FACTU mode",
    "config": {
      "event_type": "02"
    }
  }, {
    "id": "2fbe2590-3caf-11f1-ae77-65667068cb42",
    "name": "Create a job",
    "provider": "transform.job.create",
    "summary": "Send to NO VERI*FACTU process event (bill/status)",
    "config": {
      "silo_entry_meta_key": "",
      "workflow_id": ""
    }
  }, {
    "id": "9a9235e0-3cb0-11f1-ae77-65667068cb42",
    "name": "Unregister supplier from NO VERI*FACTU",
    "provider": "gov-es.noverifactu.unregister"
  }, {
    "id": "d4e5f6a0-0004-11f1-a000-000000000004",
    "name": "Set state",
    "provider": "silo.state",
    "summary": "Set state to `void`{.state .void}",
    "config": {
      "state": "void"
    }
  }],
  "rescue": [{
    "id": "d4e5f6a0-0004-11f1-a000-000000000006",
    "name": "Set state",
    "provider": "silo.state",
    "summary": "Set state to `error`{.state .error}",
    "config": {
      "state": "error"
    }
  }]
};

export const esNoverifactuSupplierRegistrationWorkflow = {
  "name": "NO VERI*FACTU register supplier",
  "description": "Register a supplier with NO VERI*FACTU, generate the start-of-mode event, and subscribe to summary events",
  "schema": "org/party",
  "steps": [{
    "id": "c21b4130-3a65-11f1-a475-db4c42dd4e99",
    "name": "Set state",
    "provider": "silo.state",
    "summary": "Set state to `processing`{.state .processing}",
    "config": {
      "state": "processing"
    },
    "next": []
  }, {
    "id": "78e845e0-3ca3-11f1-90b7-0d81b4010093",
    "name": "Register supplier with NO VERI*FACTU",
    "provider": "gov-es.noverifactu.register",
    "next": []
  }, {
    "id": "8857fe80-3ca3-11f1-90b7-0d81b4010093",
    "name": "Build status for NO VERI*FACTU",
    "provider": "gov-es.noverifactu.build.status",
    "next": [],
    "summary": "Build status: 01 - Start of NO VERI*FACTU mode",
    "config": {
      "event_type": "01"
    }
  }, {
    "id": "d16d34a0-3a91-11f1-a472-21be9722e465",
    "name": "Create a job",
    "provider": "transform.job.create",
    "summary": "Send to NO VERI*FACTU process event (bill/status)",
    "config": {
      "silo_entry_meta_key": "",
      "workflow_id": ""
    },
    "next": []
  }, {
    "id": "03cb3000-3a92-11f1-a472-21be9722e465",
    "name": "Subscribe to periodic execution",
    "provider": "cron.subscribe",
    "summary": "Every 6 hours",
    "config": {
      "workflow_id": "",
      "interval": "hourly",
      "factor": 6
    },
    "next": []
  }, {
    "id": "c3d4e5f0-0003-11f1-a000-000000000002",
    "name": "Set state",
    "provider": "silo.state",
    "summary": "Set state to `registered`{.state .registered}",
    "config": {
      "state": "registered"
    },
    "next": []
  }],
  "rescue": [{
    "id": "c3d4e5f0-0003-11f1-a000-000000000005",
    "name": "Unregister supplier from NO VERI*FACTU",
    "provider": "gov-es.noverifactu.unregister",
    "next": []
  }, {
    "id": "c3d4e5f0-0003-11f1-a000-000000000006",
    "name": "Set state",
    "provider": "silo.state",
    "summary": "Set state to `rejected`{.state .rejected}",
    "config": {
      "state": "rejected"
    },
    "next": []
  }]
};

export const WorkflowDiagram = ({workflow}) => {
  const stateColors = {
    processing: "yellow",
    sent: "blue",
    received: "blue",
    registered: "green",
    completed: "green",
    error: "red"
  };
  const StateChip = ({state, label}) => <Badge size="sm" color={stateColors[state] || "gray"} icon="square-small" iconType="solid">
      {label.charAt(0).toUpperCase() + label.slice(1)}
    </Badge>;
  const providerIcons = {
    "silo.state": "https://silo.invopop.com/images/status.svg",
    "silo.close": "https://silo.invopop.com/images/check-badge.svg",
    "silo.if": "https://assets.invopop.com/apps/silo/if.svg",
    "silo.folder": "https://silo.invopop.com/images/folder.svg",
    "silo.modify": "https://silo.invopop.com/images/modify.svg",
    "silo.correct": "https://silo.invopop.com/images/replace.svg",
    "silo.sleep": "https://assets.invopop.com/icons/sleep.svg",
    silo: "https://assets.invopop.com/apps/silo/icon.svg",
    "sequence.enumerate": "https://sequence.invopop.com/images/enumerate.svg",
    "transform.job.create": "https://transform.invopop.com/images/jobs.svg",
    webhook: "https://webhook.invopop.com/icon.svg",
    lookup: "https://lookup.invopop.com/icon.png",
    dropbox: "https://dropbox.invopop.com/icon.png",
    pdf: "https://pdf.invopop.com/file-pdf.svg",
    peppol: "https://assets.invopop.com/apps/peppol/icon.svg",
    ubl: "https://assets.invopop.com/apps/ubl/logo.svg",
    cii: "https://assets.invopop.com/apps/cii/logo.svg",
    "gov-fr": "https://assets.invopop.com/flags/fr.svg",
    "chorus-pro": "https://assets.invopop.com/apps/chroruspro/icon.svg",
    "gov-es": "https://assets.invopop.com/apps/gov-es/icon.svg",
    "gov-es.sii": "https://assets.invopop.com/apps/sii/icon.svg",
    "gov-es.ticketbai": "https://assets.invopop.com/apps/ticketbai/icon.svg",
    "gov-es.facturae": "https://assets.invopop.com/apps/facturae/icon.svg",
    verifactu: "https://assets.invopop.com/apps/verifactu/icon.svg",
    "gov-pl": "https://assets.invopop.com/apps/ksef/icon.svg",
    "gov-sa": "https://assets.invopop.com/apps/zatca/icon.svg",
    "gov-ar": "https://assets.invopop.com/apps/arca/icon.svg",
    "at-pt": "https://assets.invopop.com/apps/at-pt/icon.svg",
    "sat-mx": "https://assets.invopop.com/apps/sat-mexico/icon.svg",
    "sw-sapien": "https://assets.invopop.com/apps/sw-sapien/icon.svg",
    "sdi-it": "https://assets.invopop.com/apps/sdi-italy/icon.svg",
    "ticket-it": "https://assets.invopop.com/apps/agenzia-entrate/icon.svg",
    "nfe-br": "https://assets.invopop.com/apps/notas-fiscais-eletronicas-brazil/icon.svg",
    chargebee: "https://assets.invopop.com/apps/chargebee/icon.svg",
    stripe: "https://assets.invopop.com/apps/stripe/icon.svg",
    email: "https://assets.invopop.com/apps/email/icon.svg",
    cron: "https://assets.invopop.com/apps/cron/icon.svg",
    ilyda: "https://assets.invopop.com/apps/ilyda/icon.svg",
    invoicexpress: "https://assets.invopop.com/apps/invoicexpress/icon.svg",
    plemsi: "https://assets.invopop.com/flags/co.svg"
  };
  const iconFor = provider => {
    const parts = (provider || "").split(".");
    for (let i = parts.length; i > 0; i--) {
      const url = providerIcons[parts.slice(0, i).join(".")];
      if (url) return url;
    }
    return null;
  };
  const StepIcon = ({provider}) => {
    const url = iconFor(provider);
    return <span title={provider} className="flex h-7 w-7 shrink-0 items-center justify-center rounded-md border border-gray-950/10 bg-white dark:border-white/10 dark:bg-white/5">
        {url ? <img src={url} alt="" className="h-4 w-4" /> : null}
      </span>;
  };
  const renderSummary = summary => {
    const nodes = [];
    const re = /`([^`]+)`(\{[^}]*\})?/g;
    let last = 0;
    let m;
    let k = 0;
    while ((m = re.exec(summary)) !== null) {
      if (m.index > last) nodes.push(summary.slice(last, m.index));
      const attrs = m[2] || "";
      if (attrs.indexOf(".state") >= 0) {
        const state = (attrs.match(/\.state\s+\.([\w-]+)/) || [])[1] || m[1];
        nodes.push(<StateChip key={k++} state={state} label={m[1]} />);
      } else if (attrs) {
        nodes.push(<span key={k++} className="text-sm font-medium text-gray-700 dark:text-gray-300">
            {m[1]}
          </span>);
      } else {
        nodes.push(<code key={k++} className="text-sm rounded bg-gray-100 px-1 font-mono text-sm dark:bg-white/10">
            {m[1]}
          </code>);
      }
      last = m.index + m[0].length;
    }
    if (last < summary.length) nodes.push(summary.slice(last));
    return nodes;
  };
  const NoteRow = ({text}) => <div className="mt-4 mb-1 font-mono text-sm leading-5 text-gray-400 dark:text-gray-500">{"// " + text}</div>;
  const renderSteps = (steps, counter) => (steps || []).map(step => {
    counter.n += 1;
    const n = counter.n;
    const branches = (step.next || []).filter(b => b.steps && b.steps.length > 0);
    return <div key={step.id || "step-" + n}>
          {step.notes ? <NoteRow text={step.notes} /> : null}
          <div className="mt-2.5 flex items-center">
            <span className="absolute left-0 w-10 text-center font-mono text-sm text-gray-400 select-none dark:text-gray-500">
              {n}
            </span>
            <div className="flex min-w-0 flex-1 items-center gap-2 rounded-xl border border-gray-950/5 bg-white px-2 py-2 dark:border-white/10 dark:bg-gray-900">
              <StepIcon provider={step.provider} />
              <span className="text-sm shrink-0 font-medium text-gray-900 dark:text-gray-100">{step.name}</span>
              {step.summary ? <span className="text-sm min-w-0 truncate text-gray-500 dark:text-gray-400">{renderSummary(step.summary)}</span> : null}
            </div>
          </div>
          {branches.length > 0 ? <div className="ml-5 border-l border-gray-200 -my-1 py-1 pl-6 dark:border-white/10">
              {branches.map((branch, bi) => <div key={branch.code || branch.status || bi}>
                  <div className="mt-4">
                    <span className="rounded-md bg-gray-200/70 px-2 py-1 font-mono text-sm text-gray-600 dark:bg-white/10 dark:text-gray-300">
                      {branch.code || branch.status}
                    </span>
                  </div>
                  {renderSteps(branch.steps, counter)}
                </div>)}
            </div> : null}
        </div>;
  });
  const counter = {
    n: 0
  };
  const wf = workflow || ({});
  return <div className="not-prose relative my-5 rounded-2xl border border-gray-950/5 bg-gray-50 py-3 pr-4 pb-5 pl-12 dark:border-white/10 dark:bg-white/[0.03]">
      {renderSteps(wf.steps, counter)}
      {wf.rescue && wf.rescue.length > 0 ? <div className="mt-6 border-t border-dashed border-gray-300 dark:border-white/10">
          <NoteRow text="If any step fails" />
          {renderSteps(wf.rescue, counter)}
        </div> : null}
    </div>;
};

## Introduction

NO VERI\*FACTU is one of the two compliance modalities defined by Spain's Real Decreto 1007/2023 for Computerized Billing Systems (SIF). Unlike VERI\*FACTU, where invoicing records are sent to the AEAT in real time, in NO VERI\*FACTU mode records are **digitally signed and stored locally** — they are only submitted to the AEAT upon explicit requirement.

This guide walks you through the process of registering suppliers for NO VERI\*FACTU, including:

1. Setting up the necessary workflows.
2. Registering suppliers via the API.
3. How automatic event generation works.

<Note>
  NO VERI\*FACTU supplier registration does not require an agreement signing process or identity verification. Registration is immediate upon execution.
</Note>

## Setup

<Steps>
  <Step title="Connect the Spain and Cron apps">
    1. Go to **Configuration** → **Apps** in the [Console](https://console.invopop.com).
    2. Find **Spain** in the app list and click **Connect** to activate it.
    3. Find **Cron** in the app list and click **Connect** to activate it.

    No additional configuration is needed. The [Cron app](/apps/cron) handles the periodic generation of summary events every 6 hours, as required by the regulation.
  </Step>

  <Step title="Create the event processing workflow">
    Before setting up the other workflows, you need a workflow to process event records. This workflow is used by the registration, unregistration, and summary event workflows to generate and store signed event XML records.

    <Card title="NO VERI*FACTU event processing workflow" icon="code-branch" iconType="duotone" href="https://console.invopop.com/redirect/workflows/new?template=es-noverifactu-event" horizontal>
      Add to my workspace →
    </Card>

    <Tabs>
      <Tab title="Workflow">
        <WorkflowDiagram workflow={esNoverifactuEventWorkflow} />
      </Tab>

      <Tab title="Code">
        Copy and paste into a new [Empty Status workflow](https://console.invopop.com/redirect/workflows/new?template=empty-status) code view.

        ```json Example NO VERI*FACTU event processing workflow expandable theme={null}
        {
            "name": "NO VERI*FACTU process event",
            "description": "Generate and store a NO VERI*FACTU event record",
            "schema": "bill/status",
            "steps": [
                {
                    "id": "e5f6a7b0-0005-11f1-a000-000000000004",
                    "name": "Set state",
                    "provider": "silo.state",
                    "summary": "Set state to `processing`{.state .processing}",
                    "config": {
                        "state": "processing"
                    }
                },
                {
                    "id": "bbf19740-3a6b-11f1-9a44-6748aa5d4a91",
                    "name": "Modify silo entry",
                    "provider": "silo.modify",
                    "summary": "Default series to \"NVF\"",
                    "config": {
                        "jq": ".series //= \"NVF\"",
                        "merge_type": "application/jq",
                        "scope": "doc"
                    }
                },
                {
                    "id": "a1b2c3d0-0001-11f1-a000-000000000002",
                    "name": "Add sequential code",
                    "provider": "sequence.enumerate",
                    "summary": "Dynamic · NO VERI*FACTU · 000001",
                    "config": {
                        "name": "NoVerifactu",
                        "padding": 6,
                        "start": 1
                    }
                },
                {
                    "id": "e5f6a7b0-0005-11f1-a000-000000000006",
                    "name": "Sign envelope",
                    "provider": "silo.close"
                },
                {
                    "id": "f8df5470-3c97-11f1-8c73-6dd226144d30",
                    "name": "Generate event for NO VERI*FACTU",
                    "provider": "gov-es.noverifactu.generate.event"
                },
                {
                    "id": "050b05a0-3c98-11f1-8c73-6dd226144d30",
                    "name": "Record for NO VERI*FACTU",
                    "provider": "gov-es.noverifactu.record"
                },
                {
                    "id": "e5f6a7b0-0005-11f1-a000-000000000005",
                    "name": "Set state",
                    "provider": "silo.state",
                    "summary": "Set state to `registered`{.state .registered}",
                    "config": {
                        "state": "registered"
                    }
                }
            ],
            "rescue": [
                {
                    "id": "e5f6a7b0-0005-11f1-a000-000000000003",
                    "name": "Set state",
                    "provider": "silo.state",
                    "summary": "Set state to `error`{.state .error}",
                    "config": {
                        "state": "error"
                    }
                }
            ]
        }
        ```
      </Tab>
    </Tabs>
  </Step>

  <Step title="Create the summary event workflow">
    The regulation requires a summary event (event type `10`) to be generated every 6 hours the system has been operational. Create this workflow so that suppliers can be subscribed to it during registration.

    <Card title="NO VERI*FACTU summary event workflow" icon="code-branch" iconType="duotone" href="https://console.invopop.com/redirect/workflows/new?template=es-noverifactu-summary-event" horizontal>
      Add to my workspace →
    </Card>

    After adding the template, open the **Process Event** step and set the **Workflow** field to the event processing workflow created in the previous step.

    <Tabs>
      <Tab title="Workflow">
        <WorkflowDiagram workflow={esNoverifactuSummaryEventWorkflow} />
      </Tab>

      <Tab title="Code">
        Copy and paste into a new [Empty Party workflow](https://console.invopop.com/redirect/workflows/new?template=empty-party) code view.

        ```json Example NO VERI*FACTU summary event cron workflow expandable theme={null}
        {
            "name": "NO VERI*FACTU summary event",
            "description": "Build a NO VERI*FACTU summary event (cron-driven)",
            "schema": "org/party",
            "steps": [
                {
                    "id": "f6a7b8c0-0006-11f1-a000-000000000001",
                    "name": "Build status for NO VERI*FACTU",
                    "provider": "gov-es.noverifactu.build.status",
                    "summary": "Build status: 10 - Summary event",
                    "config": {
                        "event_type": "10"
                    }
                },
                {
                    "id": "4f527c60-3a95-11f1-a472-21be9722e465",
                    "name": "Create a job",
                    "provider": "transform.job.create",
                    "summary": "Send to NO VERI*FACTU process event (bill/status)",
                    "config": {
                        "silo_entry_meta_key": "",
                        "workflow_id": ""
                    }
                }
            ],
            "rescue": [
                {
                    "id": "f6a7b8c0-0006-11f1-a000-000000000003",
                    "name": "Set state",
                    "provider": "silo.state",
                    "summary": "Set state to `error`{.state .error}",
                    "config": {
                        "state": "error"
                    }
                }
            ]
        }
        ```

        After pasting the code, switch to the form view, open the **Process Event** step and set the **Workflow** field to the event processing workflow created in the previous step.
      </Tab>
    </Tabs>

    <Note>You won't need to run this workflow manually. The registration workflow will automatically subscribe each supplier to periodic execution of this workflow using the [Cron app](/apps/cron). When a supplier is unregistered, the unregistration workflow will unsubscribe them.</Note>
  </Step>

  <Step title="Create a supplier registration workflow">
    Create a new workflow for registering suppliers. This workflow registers the supplier, generates the mandatory "Start of NO VERI\*FACTU mode" event (event type `01`), and subscribes the supplier to periodic summary event generation every 6 hours.

    <Card title="NO VERI*FACTU supplier registration workflow" icon="code-branch" iconType="duotone" href="https://console.invopop.com/redirect/workflows/new?template=es-noverifactu-supplier-registration" horizontal>
      Add to my workspace →
    </Card>

    After adding the template, open the **Process Event** step and set the **Workflow** field to the event processing workflow. Then open the **Subscribe to summary event cron** step and set the **Workflow** field to the summary event workflow.

    <Tabs>
      <Tab title="Workflow">
        <WorkflowDiagram workflow={esNoverifactuSupplierRegistrationWorkflow} />
      </Tab>

      <Tab title="Code">
        Copy and paste into a new [Empty Party workflow](https://console.invopop.com/redirect/workflows/new?template=empty-party) code view.

        ```json Example NO VERI*FACTU register supplier workflow expandable theme={null}
        {
            "name": "NO VERI*FACTU register supplier",
            "description": "Register a supplier with NO VERI*FACTU, generate the start-of-mode event, and subscribe to summary events",
            "schema": "org/party",
            "steps": [
                {
                    "id": "c21b4130-3a65-11f1-a475-db4c42dd4e99",
                    "name": "Set state",
                    "provider": "silo.state",
                    "summary": "Set state to `processing`{.state .processing}",
                    "config": {
                        "state": "processing"
                    },
                    "next": []
                },
                {
                    "id": "78e845e0-3ca3-11f1-90b7-0d81b4010093",
                    "name": "Register supplier with NO VERI*FACTU",
                    "provider": "gov-es.noverifactu.register",
                    "next": []
                },
                {
                    "id": "8857fe80-3ca3-11f1-90b7-0d81b4010093",
                    "name": "Build status for NO VERI*FACTU",
                    "provider": "gov-es.noverifactu.build.status",
                    "next": [],
                    "summary": "Build status: 01 - Start of NO VERI*FACTU mode",
                    "config": {
                        "event_type": "01"
                    }
                },
                {
                    "id": "d16d34a0-3a91-11f1-a472-21be9722e465",
                    "name": "Create a job",
                    "provider": "transform.job.create",
                    "summary": "Send to NO VERI*FACTU process event (bill/status)",
                    "config": {
                        "silo_entry_meta_key": "",
                        "workflow_id": ""
                    },
                    "next": []
                },
                {
                    "id": "03cb3000-3a92-11f1-a472-21be9722e465",
                    "name": "Subscribe to periodic execution",
                    "provider": "cron.subscribe",
                    "summary": "Every 6 hours",
                    "config": {
                        "workflow_id": "",
                        "interval": "hourly",
                        "factor": 6
                    },
                    "next": []
                },
                {
                    "id": "c3d4e5f0-0003-11f1-a000-000000000002",
                    "name": "Set state",
                    "provider": "silo.state",
                    "summary": "Set state to `registered`{.state .registered}",
                    "config": {
                        "state": "registered"
                    },
                    "next": []
                }
            ],
            "rescue": [
                {
                    "id": "c3d4e5f0-0003-11f1-a000-000000000005",
                    "name": "Unregister supplier from NO VERI*FACTU",
                    "provider": "gov-es.noverifactu.unregister",
                    "next": []
                },
                {
                    "id": "c3d4e5f0-0003-11f1-a000-000000000006",
                    "name": "Set state",
                    "provider": "silo.state",
                    "summary": "Set state to `rejected`{.state .rejected}",
                    "config": {
                        "state": "rejected"
                    },
                    "next": []
                }
            ]
        }
        ```

        After pasting the code, switch to the form view. Open the **Process Event** step and set the **Workflow** field to the event processing workflow. Then open the **Subscribe to summary event cron** step and set the **Workflow** field to the summary event workflow.
      </Tab>
    </Tabs>
  </Step>

  <Step title="Create a supplier unregistration workflow">
    Create a workflow for unregistering suppliers. This workflow unsubscribes the supplier from the periodic summary event cron, removes the NO VERI\*FACTU registration, and generates the mandatory "End of NO VERI\*FACTU mode" event (event type `02`).

    <Card title="NO VERI*FACTU unregister supplier" icon="code-branch" iconType="duotone" href="https://console.invopop.com/redirect/workflows/new?template=es-noverifactu-unregister" horizontal>
      Add to my workspace →
    </Card>

    After adding the template, open the **Process Event** step and set the **Workflow** field to the event processing workflow.

    <Tabs>
      <Tab title="Workflow">
        <WorkflowDiagram workflow={esNoverifactuUnregisterWorkflow} />
      </Tab>

      <Tab title="Code">
        Copy and paste into a new [Empty Party workflow](https://console.invopop.com/redirect/workflows/new?template=empty-party) code view.

        ```json Example NO VERI*FACTU unregister supplier workflow expandable theme={null}
        {
            "name": "NO VERI*FACTU unregister supplier",
            "description": "Unregister a supplier from NO VERI*FACTU and generate the end-of-mode event",
            "schema": "org/party",
            "steps": [
                {
                    "id": "d4e5f6a0-0004-11f1-a000-000000000007",
                    "name": "Set state",
                    "provider": "silo.state",
                    "summary": "Set state to `processing`{.state .processing}",
                    "config": {
                        "state": "processing"
                    }
                },
                {
                    "id": "3e4bd770-3a92-11f1-a472-21be9722e465",
                    "name": "Unsubscribe from periodic execution",
                    "provider": "cron.unsubscribe"
                },
                {
                    "id": "f46dfa20-3ca3-11f1-90b7-0d81b4010093",
                    "name": "Build status for NO VERI*FACTU",
                    "provider": "gov-es.noverifactu.build.status",
                    "summary": "Build status: 02 - End of NO VERI*FACTU mode",
                    "config": {
                        "event_type": "02"
                    }
                },
                {
                    "id": "2fbe2590-3caf-11f1-ae77-65667068cb42",
                    "name": "Create a job",
                    "provider": "transform.job.create",
                    "summary": "Send to NO VERI*FACTU process event (bill/status)",
                    "config": {
                        "silo_entry_meta_key": "",
                        "workflow_id": ""
                    }
                },
                {
                    "id": "9a9235e0-3cb0-11f1-ae77-65667068cb42",
                    "name": "Unregister supplier from NO VERI*FACTU",
                    "provider": "gov-es.noverifactu.unregister"
                },
                {
                    "id": "d4e5f6a0-0004-11f1-a000-000000000004",
                    "name": "Set state",
                    "provider": "silo.state",
                    "summary": "Set state to `void`{.state .void}",
                    "config": {
                        "state": "void"
                    }
                }
            ],
            "rescue": [
                {
                    "id": "d4e5f6a0-0004-11f1-a000-000000000006",
                    "name": "Set state",
                    "provider": "silo.state",
                    "summary": "Set state to `error`{.state .error}",
                    "config": {
                        "state": "error"
                    }
                }
            ]
        }
        ```

        After pasting the code, switch to the form view, open the **Process Event** step and set the **Workflow** field to the event processing workflow.
      </Tab>
    </Tabs>
  </Step>
</Steps>

## Register a supplier

Whether you issue invoices on behalf of third parties ([white label](/guides/white-label)) or under your own name, the registration process is the same.

<Steps>
  <Step title="Upload a supplier">
    Use the [Create an entry](/api-ref/silo/entries/create-an-entry-put) endpoint to upload a new supplier [party](https://docs.gobl.org/draft-0/org/party). Required fields are company `name` and `tax_id`.

    <AccordionGroup>
      <Accordion title="Spanish company">
        To register a company supplier in Spain you must provide:

        * **Company information**: name, NIF (tax identification number), and address
        * **Legal representative information**: full name, government ID type and number (DNI, NIE, or passport), and address

        The legal representative is the person authorized to sign the representation agreement on behalf of the company.

        <Note>
          The supplier must be [previously registered](https://docs.invopop.com/guides/es-verifactu-supplier#create-a-supplier-entry) with the tax authority before invoices can be issued on their behalf.
        </Note>

        <CodeGroup>
          ```json Spain supplier example theme={null}
          {
            "$schema": "https://gobl.org/draft-0/org/party",
            "name": "Invopop S.L.",
            "tax_id": {
              "country": "ES",
              "code": "B85905495"
            },
              "people": [
                  {
                      "name": {
                          "given": "Juan",
                          "surname": "Pérez González"
                      },
                      "identities": [
                          {
                              "key": "national",
                              "code": "123456789A"
                          }
                      ],
                      "addresses": [
                          {
                              "num": "10",
                              "street": "Calle Ejemplo",
                              "locality": "Madrid",
                              "region": "Madrid",
                              "code": "28020",
                              "country": "ES"
                          }
                      ]
                  }
              ],
            "addresses": [
              {
                "num": "42",
                "street": "Calle Pradillo",
                "locality": "Madrid",
                "region": "Madrid",
                "code": "28002",
                "country": "ES"
              }
            ],
            "emails": [
              {
                "addr": "billing@example.com"
              }
            ]
          }
          ```
        </CodeGroup>
      </Accordion>

      <Accordion title="Spanish autónomo">
        An *autónomo* is a self-employed individual in Spain who operates as a sole proprietor. To register them, a NIF (tax id number) with the corresponding full name and address must be provided.

        Unlike company suppliers, autónomos do not require separate legal representative information since the individual is the authorized signatory.

        <Note>
          The supplier must be [previously registered](https://docs.invopop.com/guides/es-verifactu-supplier#create-a-supplier-entry) with the tax authority before invoices can be issued on their behalf.
        </Note>

        <CodeGroup>
          ```json Spain autónomo supplier example theme={null}
          {
            "$schema": "https://gobl.org/draft-0/org/party",
            "name": "Juan Pérez González",
            "tax_id": {
              "country": "ES",
              "code": "B85905495"
            },
            "addresses": [
              {
                "num": "42",
                "street": "Calle Pradillo",
                "locality": "Madrid",
                "region": "Madrid",
                "code": "28002",
                "country": "ES"
              }
            ],
            "emails": [
              {
                "addr": "autonomo@example.com"
              }
            ]
          }
          ```
        </CodeGroup>
      </Accordion>
    </AccordionGroup>

    Set the `folder` to `suppliers` to have the party appear in this section. It should appear with an `Empty` status unless set otherwise.
  </Step>

  <Step title="Send the supplier to the registration workflow">
    * **Via API** — Send the supplier to the registration workflow using the [Create a job](/api-ref/transform/jobs/create-a-job-post) endpoint using the `ID`s of the **silo entry** and **supplier registration workflow**.
    * **Via Console** — From the Silo Entry select "Run workflow" and select the **NO VERI\*FACTU supplier registration workflow**.

    The supplier's status will change to `Registered` immediately upon successful completion. Unlike VERI\*FACTU, there is no agreement signing step or approval waiting period.
  </Step>
</Steps>

<Info>A party can be simultaneously registered in both VERI\*FACTU and NO VERI\*FACTU, as each modality uses distinct meta keys to track registration state. This means integrators can offer both modalities to different suppliers within the same workspace.</Info>

## Unregister a supplier

Unregistering a supplier revokes their NO VERI\*FACTU invoice issuing privileges and generates the required "End of NO VERI\*FACTU mode" event. You might need to unregister a supplier because they are no longer your client, they are switching to VERI\*FACTU mode, or because of a change in their Tax ID.

Send the supplier's silo entry to the **NO VERI\*FACTU unregister supplier** workflow using the [Create a job](/api-ref/transform/jobs/create-a-job-post) endpoint. The supplier's status will change to `Void` when the workflow completes.

## Automatic event generation

NO VERI\*FACTU requires the system to automatically detect and record certain events. The following events are generated automatically by the workflows described in this guide:

| Event                        | Type | When Generated                                                                                                |
| ---------------------------- | ---- | ------------------------------------------------------------------------------------------------------------- |
| Start of NO VERI\*FACTU mode | `01` | When a supplier is registered via the registration workflow                                                   |
| End of NO VERI\*FACTU mode   | `02` | When a supplier is unregistered via the unregistration workflow                                               |
| Summary event                | `10` | Every 6 hours, triggered automatically by the [Cron app](/apps/cron) subscription created during registration |

All event records are digitally signed and stored with the same integrity guarantees as invoicing records. The event processing workflow (`generate.event` → `record`) handles the XML generation, digital signing, and storage for all event types.

***

<AccordionGroup>
  <Accordion title="🇪🇸 Invopop resources for Spain">
    |            |                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
    | ---------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
    | Compliance | <Icon icon="https://assets.invopop.com/flags/es.svg" /> [Invoicing compliance in Spain](/compliance/spain)<br /> <Icon icon="timeline" /> [Compliance timeline](/timelines/spain)                                                                                                                                                                                                                                                                                                                   |
    | Apps       | <Icon icon="https://assets.invopop.com/apps/gov-es/icon.svg" /> [Spain](/apps/spain)<br /> <Icon icon="https://assets.invopop.com/apps/verifactu/icon.svg" /> [VERI\*FACTU Spain](/apps/verifactu-spain)<br /><Icon icon="https://assets.invopop.com/apps/ticketbai/icon.svg" /> [TicketBAI (Spain app)](/apps/spain)                                                                                                                                                                               |
    | Guides     | <Icon icon="book" /> [Facturae guide](/guides/es-facturae)<br /><Icon icon="book" /> [VERI\*FACTU invoicing guide](/guides/es-verifactu)<br /><Icon icon="book" /> [VERI\*FACTU supplier onboarding](/guides/es-verifactu-supplier)<br /><Icon icon="book" /> [SII invoicing guide](/guides/es-sii)<br /><Icon icon="book" /> [SII supplier onboarding](/guides/es-sii-supplier)<br /><Icon icon="book" /> [TicketBAI guide](/guides/es-ticketbai)                                                  |
    | FAQ        | <Icon icon="square-question" /> [Spain FAQ](/faq/spain)                                                                                                                                                                                                                                                                                                                                                                                                                                             |
    | GOBL       | <Icon icon="https://assets.invopop.com/icons/gobl.svg" />  [Spain Tax Regime](https://docs.gobl.org/regimes/es)<br /> <Icon icon="https://assets.invopop.com/icons/gobl.svg" /> [VERI\*FACTU Addon](https://docs.gobl.org/addons/es-verifactu-v1)<br /> <Icon icon="https://assets.invopop.com/icons/gobl.svg" /> [Facturae Addon](https://docs.gobl.org/addons/es-facturae-v3)<br /> <Icon icon="https://assets.invopop.com/icons/gobl.svg" /> [SII Addon](https://docs.gobl.org/addons/es-sii-v1) |
    | GitHub     | <Icon icon="github" /> [gobl.facturae](https://github.com/invopop/gobl.facturae)<br /><Icon icon="github" /> [gobl.verifactu](https://github.com/invopop/gobl.verifactu)<br /> <Icon icon="github" /> [gobl.ticketbai](https://github.com/invopop/gobl.ticketbai)                                                                                                                                                                                                                                   |
  </Accordion>
</AccordionGroup>

<Card title="Spain FAQ" icon="square-question" href="/faq/spain" arrow="true" horizontal>
  Find answers to frequently asked questions about invoicing in Spain →
</Card>

<Card title="Participate in our community" icon="forumbee" href="https://community.invopop.com" arrow="true" horizontal>
  Ask and answer questions about invoicing in Spain →
</Card>
