Déclarer une plateforme au fisc : ce que DAC7 change dans le codeReporting a platform to the tax office: what DAC7 changes in the code
Une directive européenne oblige les plateformes à déclarer les revenus que leurs utilisateurs y gagnent. La contrainte n'est pas la déclaration, c'est la collecte, et elle commence au premier euro versé.A European directive requires platforms to report the income their users earn through them. The constraint is not the filing, it is the collection, and it starts with the first euro paid out.

Il existe une catégorie de contraintes que personne n’aime rencontrer en cours de route : celles qui ne se voient pas à l’usage, ne gênent aucun utilisateur, n’apparaissent sur aucune maquette, et qui pourtant décident de la forme des tables. DAC7 en fait partie, et c’est la raison pour laquelle j’en parle ici plutôt que dans une note écrite à la veille d’une échéance.There is a category of constraint nobody likes to meet halfway through: the ones that are invisible in use, bother no user, appear on no mockup, and yet decide the shape of your tables. DAC7 is one of them, and that is why I am writing about it here rather than in a note written the night before a deadline.
djplays verse de l’argent à des DJs : chaque réponse rapporte la moitié du prix d’écoute, chaque passage prouvé les deux tiers du prix de passage. Une plateforme qui fait gagner de l’argent à ses utilisateurs entre dans le champ de la directive. La question n’est donc pas de savoir si cela s’applique, mais quoi en faire au moment où l’on écrit le schéma.djplays pays money to DJs: each reply earns half of the listen price, each proven play two thirds of the play price. A platform through which users earn money falls within the scope of the directive. The question is therefore not whether it applies, but what to do about it at the moment you are writing the schema.
Ce que la directive demande, en une phraseWhat the directive asks for, in one sentence
DAC7 est la directive européenne qui oblige les plateformes à déclarer les revenus que leurs utilisateurs gagnent grâce à elles. Ce n’est pas un impôt nouveau, et ce n’est pas la plateforme qui est imposée : c’est une obligation de transparence, qui fait de l’intermédiaire le déclarant de ce qui passe par lui. Le principe est simple à énoncer, et beaucoup moins simple à préparer.DAC7 is the European directive that requires platforms to report the income their users earn through them. It is not a new tax, and the platform is not the one being taxed: it is a transparency obligation, which makes the intermediary the reporting party for what passes through it. The principle is simple to state, and a good deal less simple to prepare for.
Je ne détaillerai ni le texte, ni les seuils, ni le contenu exact du dépôt. Je ne suis pas conseil fiscal, et ces éléments se valident avec un comptable, pas avec un développeur. Ce qui m’intéresse ici est la seule partie qui me revient : la forme que cette obligation impose aux données, et le fait que cette forme doit exister avant qu’on sache précisément ce qui sera demandé.I will not go into the text, the thresholds or the exact content of the filing. I am not a tax adviser, and those points are settled with an accountant, not with a developer. What interests me here is the only part that falls to me: the shape this obligation imposes on the data, and the fact that the shape has to exist before you know precisely what will be asked for.
Une déclaration se prépare dans les tables, pas en janvierA filing is prepared in the tables, not in January
La vision naïve est séduisante : en fin d’année, on écrit une requête, on exporte, on dépose. Elle tient tant qu’on ne remarque pas ce qu’elle suppose, à savoir qu’un export ne peut sortir que ce qui a été écrit. Il ne reconstitue rien, il ne devine rien, il ne rattrape rien. Une requête de fin d’année est un révélateur, pas une source.The naive view is appealing: at the end of the year you write a query, you export, you file. It holds up right until you notice what it assumes, namely that an export can only output what was written. It reconstitutes nothing, guesses nothing, catches up on nothing. A year-end query reveals what is there; it does not create it.
Or une partie de ce qu’il faut déclarer n’est vraie qu’au moment où l’argent part. Un DJ peut changer de nom, d’adresse ou de statut au regard de la TVA, ou simplement quitter la plateforme. Si l’on relit sa fiche onze mois plus tard, on lit ce qu’il est devenu, pas ce qu’il était quand il a été payé. L’écart est invisible, et il porte sur exactement la donnée qu’on déclare.And part of what has to be reported is only true at the moment the money leaves. A DJ can change their name, their address or their VAT status, or simply leave the platform. If you read their record back eleven months later, you read what they have become, not what they were when they were paid. The gap is invisible, and it falls on exactly the data being reported.
Trois choses ne sont connues qu’au bon moment, et seulement là.Three things are only known at the right moment, and nowhere else.
- À qui on a versé, tel que cette personne se déclarait ce jour-là : un versement se rattache à une identité datée, pas à une fiche qui continue de vivre sa vie.Who was paid, as that person declared themselves on that day: a payout attaches to a dated identity, not to a record that carries on living its own life.
- À quel titre : une écoute, un passage prouvé, et pour quelle période d’activité, parce que la nature de la somme est aussi une information.On what grounds: a listen, a proven play, and for which period of activity, because the nature of the sum is information too.
- Combien exactement, et quand le mouvement est parti : un montant au centime et une date, pas un total reconstitué après coup.Exactly how much, and when the movement left: an amount to the cent and a date, not a total reconstructed after the fact.
C’est pour cette raison que la collecte se fait au moment du versement et non au moment de la déclaration. Ce n’est pas de la prévoyance de bon élève, c’est la seule fenêtre pendant laquelle l’information est juste.That is why collection happens at the moment of the payout and not at the moment of the filing. It is not diligent forward planning, it is the only window during which the information is correct.
Les deux tables qui portent la matièreThe two tables that carry the material
Le projet distingue deux tables qu’on pourrait croire redondantes : les gains et les versements. Les gains enregistrent ce qui est acquis au DJ, ligne par ligne, au fur et à mesure que les réponses et les passages prouvés arrivent. Les versements enregistrent ce qui est effectivement parti vers lui. Deux notions différentes, et deux calendriers différents.The project keeps two tables that might look redundant: earnings and payouts. Earnings record what the DJ has become entitled to, row by row, as replies and proven plays come in. Payouts record what actually left towards them. Two different notions, and two different calendars.
Les confondre serait pratique, et faux. Un gain acquis n’est pas une somme payée : il peut être en attente, groupé avec d’autres, ou annulé avant d’être versé. Une déclaration parle de ce qui a été payé sur une période, donc d’événements de paiement datés, et non de droits accumulés. Garder les deux permet de répondre aux deux questions sans avoir à déduire l’une de l’autre, et une déduction est exactement ce qu’on ne veut pas avoir à faire devant une administration.Merging them would be convenient, and wrong. An earning is not a sum paid: it can be pending, grouped with others, or cancelled before it is paid out. A filing talks about what was paid over a period, so about dated payment events, not about accumulated entitlements. Keeping both allows each question to be answered without deducing one from the other, and a deduction is exactly what you do not want to be making in front of an authority.
Cette séparation a un second effet, plus prosaïque : l’argent ne sort qu’à un seul endroit du système, la tâche planifiée qui prépare les versements, chaque matin à heure fixe. Un seul endroit qui écrit, c’est un seul endroit à instrumenter correctement. Si la collecte est juste là, elle est juste partout, et il n’y a pas de chemin parallèle par lequel une ligne incomplète pourrait entrer.That separation has a second, more prosaic effect: money leaves at only one point in the system, the scheduled job that prepares the payouts, every morning at a fixed time. One place that writes means one place to instrument properly. If collection is right there, it is right everywhere, and there is no parallel route by which an incomplete row could get in.
Un script dédié, pas une page d'administrationA dedicated script, not an admin page
La déclaration a son propre script en ligne de commande, à part, comme les tâches d’exploitation du projet. Le choix mérite une justification, parce qu’on aurait pu en faire un bouton dans l’interface d’administration, ce qui est plus confortable à l’usage.The filing has its own command line script, separate, like the operational jobs of the project. The choice deserves a justification, because it could have been a button in the admin interface, which is more comfortable to use.
Trois raisons l’ont écarté. Un dépôt annuel n’est pas un geste d’interface : il se prépare, se relit et se recommence. Le script doit pouvoir tourner plusieurs fois sur la même année sans rien changer à la base, ce qui est bien plus facile à garantir dans un script que derrière un formulaire. Et le résultat de deux exécutions doit pouvoir être comparé, donc produit sous forme de fichier plutôt qu’affiché dans une page qu’on fait défiler.Three reasons ruled it out. An annual filing is not an interface gesture: it is prepared, reread and started over. The script has to be able to run several times on the same year without changing anything in the database, which is far easier to guarantee in a script than behind a form. And the result of two runs has to be comparable, so produced as a file rather than displayed in a page you scroll through.
L’avantage que je n’avais pas anticipé est ailleurs : ce script est le meilleur test de la collecte. Le faire tourner sur une année en cours, sur des données volontairement incomplètes, met immédiatement en évidence les lignes pour lesquelles il manque quelque chose. Chaque trou qu’il signale est un trou qu’on peut encore combler, puisque les versements concernés sont récents et les personnes encore joignables.The benefit I had not anticipated lies elsewhere: this script is the best test of the collection. Running it on a year in progress, on deliberately incomplete data, immediately highlights the rows where something is missing. Every gap it reports is a gap that can still be filled, since the payouts concerned are recent and the people still reachable.
Un script de déclaration ne sert pas qu’à déclarer : c’est le seul moment où l’on découvre ce qu’on n’a pas collecté. Le lancer tôt, sur des données incomplètes, apprend davantage que de le lancer juste à temps.A reporting script is not only for reporting: it is the one moment when you find out what you failed to collect. Running it early, on incomplete data, teaches you more than running it just in time.
Ce qui est irrattrapableWhat cannot be recovered
Il y a une asymétrie à garder en tête, et elle est au cœur de cette note. Un calcul se refait : si une somme a été mal répartie, on reprend la règle et on recalcule. Une donnée non collectée, elle, ne se refait pas. Il n’existe aucune requête qui retrouve l’adresse qu’avait quelqu’un il y a dix-huit mois, ni le statut qu’il déclarait au moment où on l’a payé.There is an asymmetry worth keeping in mind, and it is the heart of this note. A calculation can be redone: if a sum was split wrongly, you take the rule and recompute. Data that was not collected cannot be redone. There is no query that recovers the address somebody had eighteen months ago, nor the status they declared at the moment they were paid.
La règle qui en découle est courte : tout ce qui pourrait être demandé plus tard s’écrit au moment où il est vrai, et s’écrit daté. Pas parce que la directive l’exige sous cette forme, mais parce que c’est la seule forme qui survit au temps. Si la question posée plus tard est un peu différente de celle qu’on avait anticipée, une matière brute et datée permet encore de répondre. Un total agrégé, non.The rule that follows is short: anything that might be asked for later is written down at the moment it is true, and written down dated. Not because the directive requires that form, but because it is the only form that survives time. If the question asked later is slightly different from the one you anticipated, raw dated material still lets you answer. An aggregated total does not.
C’est le même réflexe que celui qui fait garder, sur chaque facture, une copie de tout ce qui est imprimé dessus. Même problème, même réponse : une information qui décrit un instant doit être conservée comme telle, et non reconstruite à partir de l’état actuel du monde. Je ne m’attendais pas à ce que la conformité et la facturation aboutissent à la même règle d’écriture, mais c’est le cas, et cela m’a rassuré sur le choix fait de part et d’autre.It is the same instinct that keeps, on each invoice, a copy of everything printed on it. Same problem, same answer: information describing a moment has to be stored as such, not reconstructed from the current state of the world. I was not expecting compliance and invoicing to arrive at the same writing rule, but they do, and that reassured me about the choice made on both sides.
Garder le nécessaire, et seulement luiKeeping what is needed, and only that
Le raisonnement précédent conduit tout droit à un excès : collecter largement, au cas où. C’est une mauvaise idée, et une obligation en sens inverse s’y oppose. Les informations dont on parle sont des données personnelles, et elles ne se stockent pas par précaution. Deux contraintes tirent donc dans des directions opposées, et il faut tenir les deux à la fois.The reasoning above leads straight to an excess: collect widely, just in case. That is a bad idea, and an obligation pulling the other way stands against it. The information we are talking about is personal data, and it is not stored as a precaution. Two constraints therefore pull in opposite directions, and both have to be held at once.
La façon dont je l’ai tranché est pragmatique : on ne garde rien que la plateforme n’ait déjà besoin de connaître pour faire son travail. Pour verser de l’argent à un DJ et pour émettre une facture à son nom, il faut déjà son identité, ses coordonnées et son statut au regard de la TVA. Le recouvrement entre ce qui est nécessaire au service et ce qui sera utile à la déclaration est large, et je m’y tiens : si une information ne sert qu’à une déclaration hypothétique, elle n’est pas collectée.The way I settled it is pragmatic: nothing is kept that the platform does not already need to know in order to do its job. In order to pay a DJ and to issue an invoice in their name, their identity, their contact details and their VAT status are needed anyway. The overlap between what the service needs and what the filing will use is wide, and I stick to it: if a piece of information only serves a hypothetical filing, it is not collected.
Une contrainte de conception, pas une formalitéA design constraint, not a formality
Voilà le point que je voulais faire tenir dans une note. DAC7 n’a rien changé à l’interface du site, et un utilisateur ne la rencontrera jamais. Elle a changé le schéma : des colonnes, des dates, une séparation entre deux tables, un script à part. Ce sont des décisions de conception, et les décisions de conception se prennent au début.That is the point I wanted to fit into one note. DAC7 changed nothing in the site interface, and a user will never meet it. It changed the schema: columns, dates, a separation between two tables, a script of its own. Those are design decisions, and design decisions are taken at the start.
La base du projet est versionnée par un numéro de version de schéma et se met à jour par migrations successives, donc ajouter une colonne plus tard est trivial. La remplir rétroactivement ne l’est pas, et c’est exactement là que la distinction compte. Une migration peut créer un emplacement vide ; elle ne peut pas inventer ce qui aurait dû s’y trouver.The project database is versioned by a schema version number and updated through successive migrations, so adding a column later is trivial. Filling it retroactively is not, and that is exactly where the distinction matters. A migration can create an empty slot; it cannot invent what should have been in it.
La plateforme est en accès anticipé, et c’est le bon moment : la seule échéance qui compte vraiment n’est pas la date de dépôt, c’est le premier euro versé. Tout ce qui est en place avant lui sera complet ; tout ce qui arrive après laissera un trou qu’on ne comblera pas. Pour le reste, le contenu du dépôt, les seuils et la forme attendue, c’est le comptable qui tranche, et je m’en tiens à préparer une matière qu’il puisse lire sans avoir à me croire sur parole.The platform is in early access, and this is the right moment: the only deadline that really counts is not the filing date, it is the first euro paid out. Everything in place before it will be complete; everything that arrives after will leave a gap that will not be filled. As for the rest, the content of the filing, the thresholds and the expected format, the accountant decides, and I stick to preparing material they can read without having to take my word for it.
Le projet derrière cette noteThe project behind this note
Tout est parti de djplays, la place de marché. La fiche détaille le contexte, ce qui a été construit et ce que le client en a tiré.It all started with djplays, la place de marché. The project page covers the context, what was built and what the client got out of it.