Ir al contenido

Sincronizar clientes con un CRM o ERP

El cliente existe en su CRM o ERP y en Faturei Hoje. Esta guía muestra cómo llevar el registro de un lado al otro sin crear clientes repetidos.

Son dos sentidos, y cada uno tiene su herramienta:

SentidoCómo
De su sistema a FatureiBuscar, y después crear o editar. Es lo que muestra esta página
De Faturei a su sistemaLos eventos client.created, client.updated y client.deleted avisan en el momento, y la sincronización incremental garantiza que nada quedó atrás
PermisoPara qué
clients:readBuscar el cliente antes de grabar
clients:createRegistrar a quien no existe
clients:updateActualizar a quien ya existe

La forma más segura de vincular los dos registros es el id. La primera vez que encuentre o cree el cliente, guarde el id de Faturei Hoje en el registro de su sistema. De ahí en adelante, edite directamente por él, con PATCH /public/v1/clients/{id}, sin buscar de nuevo.

Buscar por correo, teléfono o documento sirve para el primer vínculo, cuando todavía no tiene el id.

POST /public/v1/clients no verifica si el cliente ya existe: dos llamadas con el mismo correo crean dos registros. Así que busque primero. GET /public/v1/clients acepta tres filtros de coincidencia exacta:

FiltroCómo compara
emailEl mismo correo, sin distinguir mayúsculas de minúsculas
phoneEl mismo teléfono, con o sin el noveno dígito. Un teléfono inválido responde 422
cpf_cnpjLos mismos dígitos, con o sin puntuación

También está search, la misma búsqueda de la pantalla de clientes, por nombre, correo, teléfono o documento. Sirve para personas que buscan, no para decidir sola si el cliente es el mismo.

La base puede tener registros repetidos de antes de la integración. Si la búsqueda trae más de uno, no elija a ciegas: registre el caso y resuélvalo con la empresa.

Ventana de terminal
# 1. Buscar por el correo
curl "https://api.fatureihoje.com/public/v1/clients?email=contato%40marcenariasouza.com.br&limit=2" \
-H "Authorization: Bearer $FH_API_KEY"
# 2a. No lo encontró: crear
# Genere la clave una vez y guárdela: en un reintento, repita con el mismo valor.
CREATE_KEY=$(uuidgen)
curl -X POST "https://api.fatureihoje.com/public/v1/clients" \
-H "Authorization: Bearer $FH_API_KEY" \
-H "Content-Type: application/json" \
-H "Idempotency-Key: $CREATE_KEY" \
-d '{
"name": "Marcenaria Souza",
"email": "contato@marcenariasouza.com.br",
"phone": "+5511988887777",
"cpf_cnpj": "12345678000190",
"person_type": "pj"
}'
# 2b. Lo encontró: actualizar por el id que vino en la búsqueda
CLIENT_ID="0d9a7c5e-3f1b-4d2a-8c6e-4a2b0c8e6f1d"
curl -X PATCH "https://api.fatureihoje.com/public/v1/clients/$CLIENT_ID" \
-H "Authorization: Bearer $FH_API_KEY" \
-H "Content-Type: application/json" \
-d '{ "phone": "+5511988887777" }'

El registro acepta los mismos campos del formulario del panel, incluidos los fiscales (razón social, inscripciones, dirección fiscal). La lista completa, con el formato y el tamaño de cada uno, está en la Referencia.

RespuestaQué hacer
422 validation_failedCorrija el campo indicado en errors (un teléfono inválido en el filtro, por ejemplo)
404 resource_not_foundEl cliente del PATCH ya no existe, o no es de la empresa
429 rate_limit_exceededEspere el Retry-After y repita. Vea Límites de uso
5xx o falla de redRepita; en el POST, con la misma Idempotency-Key

El PATCH cambia solo los campos que vienen en la llamada. Un campo que no viene queda exactamente como está, y null limpia un campo opcional.

Úselo a su favor: envíe solo los campos de los que su sistema es dueño. Si el equipo cuida las observaciones en el panel y su ERP cuida el documento y la dirección fiscal, el ERP nunca envía notes, y nadie borra el trabajo del otro.

Con los dos sentidos activos, es fácil crear un bucle: su sistema actualiza el cliente, Faturei Hoje envía client.updated, su sistema graba de nuevo, y así sucesivamente.

  • Antes de grabar, compare. Si el valor que llegó es igual al que ya tiene, no grabe ni llame a la API.
  • En un client.updated, changed_fields dice qué cambió. Si son solo campos que su sistema acaba de enviar, con los mismos valores, el evento es el eco de su propia escritura.

Un cliente creado con dirección ya nace con la dirección “Principal” en la lista de direcciones. Las direcciones adicionales (obra, sucursal, casa de playa) están en GET /public/v1/clients/{client_id}/addresses y POST /public/v1/clients/{client_id}/addresses.

DELETE /public/v1/clients/{id} elimina el registro para siempre, como en el panel, con direcciones, observaciones, vínculos de grupo, acceso al portal, inventario y obras. Las órdenes de servicio, ventas, presupuestos, tareas, movimientos, contratos y facturas siguen existiendo, sin el cliente. No se puede deshacer.

Si en su sistema “eliminar” significa “ya no es cliente”, tal vez lo que busca sea status: "inactive" en un PATCH. La decisión es suya; la API hace lo que usted pida.