Skip to content

Add Zapier section with step-by-step guides - #32

Merged
felipegarcia98 merged 6 commits into
mainfrom
docs/zapier-section
Aug 27, 2026
Merged

felipegarcia98 merged 6 commits into
mainfrom
docs/zapier-section

Conversation

@felipegarcia98

@felipegarcia98 felipegarcia98 commented Aug 26, 2026

Copy link
Copy Markdown

Resumen

En Data Export, Zapier era solo un link externo al directorio de apps. Todo lo que explica cómo funciona la integración vivía fuera de la documentación. Esta PR lo convierte en sección propia, espejando la de Power Automate, y baja el detalle a una guía paso a paso en inglés, español y portugués, con changelog de versiones de la app.

La diferencia estructural con Power Automate es que acá no hay nada que importar: la app está publicada en el directorio de Zapier y lo único que hace falta es la API Key. La sección lo dice explícitamente para que nadie busque un archivo de definición que no existe.

Cambios

  • source/index.html.md: sección ## Zapier nueva, antes de Power Automate para respetar el orden de la tabla "Choosing a method". La fila de Zapier de esa tabla ahora apunta al ancla interna #zapier en vez de salir del sitio, menciona que los Zaps también escriben hacia DataScope, y deja de usar la etiqueta "no-code" que la guía de marca prohíbe. Entrada nueva en el Changelog del sitio.
  • source/zapier/connector_guide_{en,es,pt}.html.md: guía nueva en tres idiomas, con la misma estructura y el mismo selector de idioma que las de Power Automate, más una sección de historial de versiones al final.

Cómo se verificó el contenido

Cada afirmación de comportamiento se contrastó contra el backend en datascope-rails antes de escribirla, no contra las descripciones de la app:

  • Triggers y actions listados: solo los que tienen hidden: false. Los pollers internos (tasks_forms, users, form_state, findings_types, test) y los legacy ocultos quedaron fuera porque el usuario no los ve en el editor de Zaps. Se usan los labels literales de Zapier, no las keys internas.
  • Un Zap activo por formulario y por trigger: la unicidad real es sobre (account, hook_type, form, platform) en Webhooks::MakerService#find_or_create_webhook. Triggers distintos sobre el mismo formulario conviven, algo que la descripción de la app no aclara.
  • La excepción de Forms: New Form Entry: CustomWebhook::FORM_HOOK_TYPES omite new_answer, así que ese trigger cae al branch legacy que nunca rechaza un duplicado, y ManagerService#retrieve_form_hooks despacha a todas las filas Webhook del formulario. Dos Zaps sobre el mismo formulario reciben ambos.
  • Tickets: Create Ticket no crea ubicaciones: Finding#set_location! anula la ubicación cuando nada coincide, para Location y NestableLocation, y solo busca por ID y por Name. El error nestable location not found es exclusivo de Assign Task V2.
  • Send Data genera el PDF solo si se completa Emails: create_pdf llama a Alert.send_pdf únicamente if answers_saved > 0 && params[:emails].present?, y ese mismo camino dispara Forms: New PDF.
  • Nombres de los módulos de ubicación en ES y PT: config/locales/es.yml y pt.yml los llaman Lugares (antiguo/nuevo módulo) y Locais (antigo/novo módulo). Los dos módulos comparten el sustantivo; solo el paréntesis los separa.
  • Fallback silencioso de usuario en Assign Task: MobileUser.where(account_id:).last if mu.blank?. Un email que no coincide asigna la tarea a un usuario arbitrario de la cuenta, con respuesta 200. Documentado como aside class="warning" en las tres guías.

No se publicó nada del JSON del source ni de los endpoints internos: la guía habla de labels, campos y comportamiento observable.

Changelog de versiones

Pasó por tres iteraciones a medida que apareció información. Estado final: 9 versiones publicadas itemizadas (2.1.3 a 2.0.1 y 1.14.3 a 1.14.0), idénticas en los tres idiomas, con la plantilla de entrada como comentario en el source.

Las entradas se construyeron diffeando las definiciones de la app, no solo leyendo las notas de publicación de Zapier, y eso importó: dos notas describen mucho menos de lo que su versión trae. 2.0.0 y 2.1.0 nunca se publicaron, así que las notas de 2.0.1 y 2.1.1 describen el delta contra un draft que ya no existe. Casos concretos:

  • 2.1.1 tiene como nota "Fixed bug with creation date and relative expiration date", pero además renombra los dos disparadores de Findings: a Tickets: ... (FKA Issue) y agrega la action Tickets: Create Ticket.
  • 2.0.1 tiene como nota "Better default value", pero es la primera versión publicada de la línea 2.x: trae los tres disparadores de firma, los dos de tickets, y el prefijo de área en todos los nombres.

Otras dos correcciones de fondo:

  • 2.0.0 dejó de ser una entrada. No es una versión publicada, es el umbral contra el que compara el backend (general_webhooks_job.rb). Pasó a un aside, que ahora además puede decir algo más claro: como nunca existió una 2.0.0, el corte cae limpio entre la línea 1.14 y la 2.x.
  • Los drafts se itemizan. Se liberan a cuentas de clientes y están en uso, así que tratarlos como no publicados era incorrecto. La introducción avisa que una versión puede estar liberada a cuentas seleccionadas antes de ser la predeterminada.

En la línea 1.14 el diff destapó algo contraintuitivo que quedó documentado: 1.14.3 no es un superset de 1.14.2. Perdió el disparador Status Changed y la action Send Data, y agregó los campos de obligatoriedad y respuesta tardía a Assign Task. Un cliente en 1.14.3 tiene menos disparadores que uno en 1.14.2.

Esto también corrigió una afirmación del cuerpo de la guía: el campo Location Type, con la opción Places, existe solo desde 2.1.3, que está liberada a cuentas seleccionadas. La sección de Locations o Places ahora avisa que quien esté en una versión anterior no va a ver el campo.

No se publica la actividad por versión (usuarios y tareas son datos de clientes), y la plantilla lo prohíbe explícitamente.

Dos afirmaciones que se cayeron en la verificación

  1. "Zapier valida la API Key al conectar". El test de autenticación resuelve a GET /api/external/ping, que tiene un typo en la rama de token inválido: status => :unauthorized arma la clave 200 => :unauthorized en vez de la opción status:, así que la respuesta sale 200 con cuerpo "Bad Token". La guía ahora dice lo observable: pegar la clave sin espacios y, si la conexión se acepta pero el trigger no devuelve datos, revisar la API Key primero.
  2. "Dejar Form en blanco crea una suscripción que nunca se dispara". Es cierto en producción hoy, pero hay un fix pendiente en datascope-rails que hace que el subscribe falle con 400. El texto quedó neutro respecto a la versión: dejar Form en blanco no entrega nada, y hay que elegir un formulario siempre.

Los dos bugs de backend van aparte, fuera del scope de esta PR de documentación.

Test plan

  • Frontmatter, consistencia de columnas de todas las tablas y anclas internas verificadas en los 4 archivos, simulando el parameterize de Slate
  • Links cruzados entre idiomas y el link del index al ancla del changelog apuntando a destinos que existen
  • Sin em dashes, sin voseo en español, sin etiquetas de posicionamiento prohibidas, sin versión de plataforma, sin datos de uso por versión
  • Comentarios HTML sin líneas en blanco internas, para que Redcarpet no los rompa
  • middleman build en CI: verde en 2.3, 2.4, 2.5 y 2.6. Localmente no corre porque el repo pide Ruby 2.3.3 y no está instalado en la máquina
  • Revisión de contenido por alguien que haya armado Zaps de DataScope, sobre todo el paso 4 (test trigger) y la terminología en portugués
  • Decisiones de estilo pendientes: regionalismos en español, actions vs acciones, y assinatura en portugués usado a la vez para suscripción y para firma

Nota

La guía en portugués usa "ticket", alineada con los labels de la app (Tickets: ... (FKA Issue)) y con las guías EN/ES. La guía PT de Power Automate todavía dice "não conformidade" porque el rename de #28 no la alcanzó, y la EN todavía dice "issue"; no lo toqué acá para no mezclar scope, pero conviene alinearlas en una PR aparte.

felipegarcia98 and others added 2 commits August 26, 2026 17:15
Data Export listed Zapier only as an outbound link to the Zapier app
directory, so everything about how it actually works lived outside the
docs. This adds it as a real section, mirroring the Power Automate one,
and moves the detail into a step-by-step guide in three languages.

Every trigger, action and field description was checked against the
published Zap definitions and the Rails endpoints they call, so the
tables name the labels users see in Zapier rather than internal keys.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The connection test hits /api/external/ping, which answers 200 with a
"Bad Token" body instead of 401, so a wrong key is not guaranteed to
fail at that step. Point at the symptom that is actually observable.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@felipegarcia98 felipegarcia98 self-assigned this Aug 26, 2026
felipegarcia98 and others added 4 commits August 26, 2026 18:48
The guides had no place to record what a new version of the app brings,
so every release would have landed as an undated edit somewhere in the
body. This adds a Changelog section to all three languages with an
entry template in the source, seeded with the current published version
and the one earlier boundary that can still affect a live connection.

Versions before 2.1.3 are left unlisted on purpose: there is no
reliable record of what each changed, and the gap is more useful
visible than filled in.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
… history

Two things, both in the three language guides.

**Claims the backend contradicts.** A review against the Rails code found
statements the product does not do:

- Locations and Places behaved as one table for two actions. Create
  Ticket never creates a location and never fails when nothing matches;
  it attaches none and reports success. Assign Task V2 keeps its own row,
  now noting that legacy creation needs a Location Name.
- One active Zap per form did not hold for Forms: New Form Entry, which
  is excluded from the uniqueness check, so two Zaps both fire.
- Send Data generates the PDF only when Emails is filled, and that same
  path does fire Forms: New PDF.
- Spanish and Portuguese named location modules the product UI does not
  use. Both modules are Lugares in Spanish and Locais in Portuguese; only
  the parenthetical separates them.

Also adds the silent-assignee caveat on Assign Task, drops the no-code
label from the comparison table, and stops asserting that a blank Form
creates a subscription, which a pending backend fix will change.

**Changelog.** The first pass had only a placeholder entry, and it named
2.1.3 as the published version and carried the Zapier platform version.
Both were wrong to publish: 2.1.3 is a draft, 2.1.2 is what new Zaps get,
and the platform version is Zapier's own build number, not ours. It now
itemizes 2.1.2 down to 2.0.1 from the real changelog notes, keeps the
2.0.0 delivery boundary, and summarizes the 1.14.x line by what it does
and does not provide. The entry template now says never to publish the
per-version user and task counts.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Drafts are released to customer accounts and are in use, so treating them
as unpublished was wrong on both counts: 2.1.3 was described as running
no Zaps, and the 1.14.x line was collapsed into a single summary.

Every version now has its own entry, and the intro says a version can be
released to selected accounts before becoming the default, so a reader on
a draft finds their version listed. The 1.14.x entries come from diffing
the app definitions:

- 1.14.1 adds the Change Status trigger
- 1.14.2 adds the Send Data action, renames that trigger to Status
  Changed and makes its Form field optional
- 1.14.3 adds the mandatory and late-response fields to Assign Task but
  carries neither Status Changed nor Send Data, so it has fewer triggers
  than 1.14.2

Where a version has no release note recorded, the entry says so and
describes what its definition provides instead of inventing a change.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
With the 2.x definitions in hand, the entries no longer rest on release
notes alone, and two of those notes turned out to undersell their version
badly. 2.0.0 and 2.1.0 were never released, so the notes on 2.0.1 and
2.1.1 describe a delta from a draft that no longer exists.

- 2.0.0 is no longer an entry. It is a threshold the backend compares
  against, not a release, so it moved into a note that also says why the
  split lands cleanly between the 1.14 and 2.x lines.
- 2.0.1 is the first released 2.x version: the three signature triggers,
  the two ticket triggers (then Findings), and the area prefixes on every
  name.
- 2.1.1 renames Findings to Tickets and adds Create Ticket, neither of
  which its release note mentions.
- 2.1.2 keeps the Assign Task V2 note, now confirmed against the diff.
- 2.1.3 adds Location Type and Find Location / Place by ID. Previously
  the entry could only say it "carries" them, because 2.1.2 was unknown.

That last one also gates a claim in the body: Location Type only exists
from 2.1.3, which is released to selected accounts, so the Locations or
Places section now says a reader on an earlier version will not see the
field at all.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@felipegarcia98
felipegarcia98 merged commit 48dc53a into main Aug 27, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant