Aller au contenu

Notion

Extension payante. Chaque soumission crée une page dans une base Notion, pour transformer une réponse en dossier de travail.

Ce document décrit ce que le module garantit et ce qu’il refuse. Le guide utilisateur en donne la version courte, dans la section « Créer une page Notion ».

Ce qui distingue ce module d’Airtable, auquel il ressemble

Les deux écrivent une ligne dans une base. Trois choses les séparent, et ce sont les trois sections qui suivent.

Notion crée l’option manquante, et aucun drapeau ne l’en empêche

Écrire dans une propriété liste de choix un nom qui n’existe pas n’échoue pas : Notion ajoute l’option au schéma de la source de données.

C’est le même danger que le drapeau typecast d’Airtable, à une différence près qui le rend pire : là-bas, il fallait le demander ; ici, c’est le comportement par défaut, et il n’y a rien à éteindre.

Sur un formulaire public, cela veut dire qu’un visiteur qui tape ce qu’il veut dans un champ libre associé à une liste de choix ajoute ce qu’il veut aux options de la base du client. Ce n’est plus écrire une page, c’est modifier le schéma — depuis l’extérieur, et sans que personne ne l’ait demandé.

Le garde-fou est donc dans le module, puisque l’API n’en offre pas. Les options admises sont lues au moment du réglage et conservées avec l’association ; une valeur qui n’y figure pas n’est pas envoyée. La comparaison ignore la casse — une liste « Oui / Non » et une réponse « oui » désignent la même chose.

Quand l’option existe, c’est son identifiant qui part, pas son nom : un nom renommé dans Notion ferait créer un doublon portant l’ancien.

C’est la source de données qui est visée, pas la base

Une base Notion porte désormais une ou plusieurs sources de données, chacune avec son schéma de propriétés.

Tant qu’une base n’en a qu’une, l’ancien identifiant de base fonctionne encore. Le jour où quelqu’un en ajoute une seconde, il cesse de désigner quoi que ce soit, et Notion répond validation_error : l’identifiant n’est plus assez précis.

Ajouter une source de données est un geste d’organisation ordinaire, fait par quelqu’un qui ignore qu’un formulaire écrit là. Enregistrer la base aurait donc été enregistrer une bombe à retardement.

Les propriétés, elles, sont retenues par identifiant et non par nom — pour la même raison qu’Airtable : on renomme une colonne comme on renomme un fichier.

Notion n’a aucune écriture idempotente

Pas de fusion native comme Airtable, pas de PUT sur une empreinte comme Mailchimp : POST /pages crée, toujours. Une requête dont la réponse se perd en route est donc rejouée, et laisse deux pages. La clé unique locale n’y peut rien : le premier appel a bien abouti chez Notion.

La seule parade est de chercher d’abord. Avec une propriété de rapprochement réglée, le module interroge la source de données sur cette valeur : il met à jour la page trouvée, ou en crée une s’il n’en trouve pas. Cela coûte un appel de plus sur un budget de trois par seconde, et c’est ce que coûte l’absence de doublons.

La propriété choisie doit être associée — chercher sur une propriété qu’on n’écrit pas ne retrouverait jamais rien — et d’un type que le filtre de requête sait comparer à une valeur exacte : titre, texte, nombre, liste simple, adresse, courriel, téléphone. Une case à cocher conviendrait au filtre et pas au propos : elle ne distingue personne.

Quand la clé est réglée mais vide sur une soumission, le module crée au lieu de chercher, et l’écrit au journal : chercher sur une valeur vide retrouverait la première page dont cette propriété est vide, c’est-à-dire n’importe laquelle.

L’écran de connexion montre le nombre de pages créées plutôt que mises à jour.

Une intégration ne voit rien par défaut

C’est la cause numéro un d’un panneau qui ne propose aucune base, et elle n’a rien d’une panne : dans Notion, il faut ouvrir chaque base et y ajouter la connexion, une par une.

Les deux écrans le disent avant qu’on cherche, et l’essai de connexion distingue « le jeton ne répond pas » de « le jeton répond mais ne voit aucune base ».

Le titre est obligatoire

Toute page Notion en a un, et Notion l’affiche « Sans titre » quand il est vide. Une base remplie de lignes « Sans titre » ne renseigne personne et ne se trie pas.

Le réglage exige donc qu’une propriété de titre soit associée — c’est sa seule obligation. Et si cette soumission-ci l’a laissée vide, rien n’est écrit : le motif le dit.

Ce que le module convertit

Type de propriétéCe qui est envoyé
Titre, texte, texte enrichila valeur, tronquée à 2 000 caractères
Nombreun nombre — la virgule décimale et les espaces de groupement sont lus
Case à cochervrai, sauf non, no, false, off, 0
Liste simple, liste multiplel’identifiant de l’option si elle existe déjà
DateAAAA-MM-JJ, ou ISO 8601 si la saisie porte une heure
Adresse, courriel, téléphonela valeur, tronquée à la limite de Notion

Ce qui ne se convertit pas est omis, jamais deviné : Notion refuse la page entière pour une seule propriété invalide.

Une valeur vide n’est pas envoyée non plus : sur une mise à jour, elle effacerait ce que la page portait déjà.

Tronquer un texte vaut mieux que se faire refuser la page pour un message un peu long — et c’est le cas d’un champ « votre message », qui est précisément celui qu’on associe.

Un jeton d’intégration interne plutôt qu’une application

Les deux sont possibles ; l’écran recommande le premier, et cette fois la raison est sévère.

Un jeton d’intégration interne se crée dans l’espace de travail, n’expire pas, et n’a rien à renouveler.

Un jeton OAuth dure environ huit heures, se renouvelle — en faisant tourner le jeton de rafraîchissement — et s’éteint définitivement 180 jours après la première autorisation. Ce plafond ne glisse pas : renouveler ne le repousse pas d’un jour. Un site relié par OAuth cesse d’écrire dans Notion six mois plus tard, quelle que soit son activité.

C’est la seule intégration de cette série dont on puisse écrire la date de décès à l’avance. L’écran l’affiche donc en permanence, en jours restants, et l’avertit en orange dans le dernier mois.

Le renouvellement ne se fait jamais à deux

Notion retire l’ancien couple de jetons dès qu’il en rend un nouveau. Deux tâches qui renouvellent en même temps perdraient l’autorisation sans retour.

Le renouvellement est donc pris sous un verrou atomique — une insertion tranchée par la clé unique de la table des options, comme WordPress verrouille ses propres mises à jour. C’est le même verrou qu’Airtable, partagé plutôt que recopié : une garantie recopiée est une occasion de plus de la rendre fausse.

Notion laisse une fenêtre d’un pas, où le jeton précédent reste accepté une fois de plus. C’est un filet, pas une garantie, et ce n’est pas sur lui qu’on compte.

Trois requêtes par seconde

180 par minute hors forfaits Business et Enterprise, qui montent à 600. Un envoi en consomme une, deux avec une clé de rapprochement. Un dépassement arrive en 429, et la reprise attend une minute, puis cinq, puis trente.

Ce qui n’est pas tenté, et ce qui est rejoué

Rien n’est programmé sans source de données, sans titre associé, sans connexion, ou si la condition du formulaire n’est pas remplie. Une soumission marquée indésirable ou mise à la corbeille ne part pas.

Les refus définitifs ne sont pas rejoués : partage retiré, propriété renommée ou supprimée, source de données effacée, type incompatible. object_not_found ne veut presque jamais dire « supprimé » — il veut dire « cette intégration ne voit plus cette base », et le geste qui répare est d’y retourner dans Notion.

Les 429 et les 5xx le sont.

Une panne de Notion ne bloque jamais la soumission. Elle est enregistrée, confirmée au visiteur et notifiée par courriel avant que ce module ne soit sollicité.

Ce que le journal ne contient pas

Ni la requête, ni la réponse, ni l’identifiant de la page. Les deux premières portent les valeurs de la soumission ; le troisième ouvre une page dont le titre est, le plus souvent, le nom d’une personne.

L’adresse consignée est celle du point d’entrée, sans rien qui désigne un dossier en particulier.

Schéma

slf_notion_pages : une ligne par soumission destinée à Notion, avec la source de données, l’identifiant de la page, si elle a été créée ou mise à jour, l’état, le motif du dernier problème et le nombre de tentatives.

L’adresse publique n’est pas conservée : celle que Notion rend contient le titre de la page. Seul l’identifiant est gardé, et l’adresse se reconstruit à l’affichage.

La connexion vit dans une option : la sorte de connexion, l’identifiant client, le nom de l’espace de travail et la date de première autorisation en clair — cette dernière portant l’échéance —, les jetons et le secret client chiffrés.

Effacer une soumission efface sa ligne de suivi et son journal. La page déjà écrite dans Notion, elle, reste : elle appartient à l’espace de travail du client, et la supprimer d’ici serait décider à sa place — sur un espace dont ce module n’a même pas la portée de lecture.

Ce que la V1 ne fait pas

Pas de bloc dans le corps de la page, pas de fichier, pas de commentaire, pas de relation vers une autre base, pas de propriété calculée, pas de lecture, pas de suppression, pas de synchronisation en sens inverse.

Un bloc arbitraire composé depuis une saisie de visiteur serait un vecteur d’injection dans l’espace de travail du client, et ce que le module a à écrire tient dans les propriétés — qui, elles, sont typées, bornées et consultables en tableau. Un formulaire ouvre un dossier ; il ne tient pas l’espace de travail.