Gå til indhold

Verificeret mod app@9d146f9, 16 skal genverificeres, 0 brudt

Bankmatch

Alt på siden er læst mod origin/main på den SHA, atlas.config.ts låser. Anker er fil og symbol, aldrig et linjenummer.

Nordstjernen

domaene.bankmatch

Faste regler 49

Vis alle 49

Eksterne services 7

  • AiiaHenter konti og transaktioner for en samtykket bankforbindelse.
  • AnthropicOCR af bilag, filter-AI på indgående mail og kontoforslag på bilag og leverandørfakturaer.
  • BillyBogføring, spejling af posteringer og kortet over Billy-vedhæftninger.
  • DineroBogføring, spejling af poster og kortet fra bilagsnummer til fil.
  • e-conomicBogføring af bilag, spejling af poster, kontoplan, kassekladde-kladder og dokumentkortet economic_documents.
  • RevolutHenter transaktioner og, for Revolut Business, udgiftsbilag.
Vis alle 7
  • YapilyHenter konti og transaktioner for en samtykket bankforbindelse.
0

På 30 sekunder

For alle

Et bilag er først færdigt, når det hører til en linje i banken. Bankmatch er det, der finder parret. Det sker på to måder.

  • Systemet foreslår. Hver time kigger systemet på nye bilag fra mail og scorer de banklinjer, der kunne passe. Et godt bud bliver et forslag (begreb.bankmatch.forslag). Et forslag binder ingenting.
  • Et menneske kobler. Fra Kvitteringer, Indbakken eller Bank kan en medarbejder bekræfte, vælge eller fortryde et par. Først når der er skrevet en række i bank_transaction_matches, er det et match (begreb.bankmatch.match).

Uden at nogen trykker på noget kan systemet i tre tilfælde koble selv: kvitteringer der kommer ind med en klar banklinje, indtægtslinjer med en tydelig faktura, og onboarding-sweepet, der parrer med regnskabets egne poster. Resten venter på et menneske.

Hvorfor blev denne kvittering matchet til en forkert banklinje?

Sektion kaldt “Hvorfor blev denne kvittering matchet til en forkert banklinje?”

Gå i denne rækkefølge.

  1. Hvilken motor? Er bilaget et mailbilag, der kom via Indbakken, er det e-mail-armen. Er det en kvittering, der blev koblet fra Kvitteringer, Bank eller af et job, så skriver tabel.bank-transaction-matches hvem og hvordan: match_source (system eller human), match_strategy og match_confidence.
  2. Hvilken strategi og hvilken score? På mailbilaget står bank_match_strategy (scored eller unique_amount) og bank_match_confidence (0 til 100). På match-rækken står match_strategy og match_confidence (0 til 1). Se faelde.bankmatch.to-skalaer.
  3. Hvorfor den linje? Strategien siger hvilket signal der bar parret. tabel.match-explanations gemmer de rangerede kandidater og signalerne for udgiftsbilag, så man kan se hvad der ellers var i spil.
  4. Er der et alias? Et lært alias i tabel.supplier-aliases giver op til 30 point og virker uden deploy. Afstemningsmotoren lærer et alias efter hvert match uden navnetjek, så ét forkert match kan avle det næste. Se faelde.bankmatch.alias-laerer-forkert.
  5. Hvad var match_source? human betyder, at en bruger bekræftede. system betyder en maskine. Status manual_matched siger intet om det, se faelde.bankmatch.manual-matched-er-ikke-et-menneske.

Hvorfor matchede den ikke, selvom beløbet er ens?

Sektion kaldt “Hvorfor matchede den ikke, selvom beløbet er ens?”

Se faelde.bankmatch.matchede-ikke-selv-om-beloebet-er-ens. Kort: et eksakt beløb giver 40 point og en dato højst 20, så uden navn eller alias nås mindste bankmatch (regel.bankmatch.min-confidence, 70) ikke. Et unikt beløb stopper på 60 og er kun et forslag (regel.bankmatch.unikt-beloeb). På udgiftssiden er amount_exact 0,85, men ikke blandt de fem strategier, der må auto-matche (regel.match.auto-tilladte-strategier).

Hvad er forskellen på et forslag og et match?

Sektion kaldt “Hvad er forskellen på et forslag og et match?”
ForslagMatch
HvorKolonner på mailbilaget, eller en kandidat i panelets køEn række i bank_transaction_matches
Banklinjens match_statusUændretGenberegnes
Binder det?NejJa, og det kan blokere andre matches
Hvem skriverE-mail-armen og forslagspassetReconciliationMatchService og voucher-indgangen

Kan jeg fortryde et automatisk match, og hvad sker der så med bogføringen?

Sektion kaldt “Kan jeg fortryde et automatisk match, og hvad sker der så med bogføringen?”

Ja, så længe matchet ikke er afregnet i regnskabet. Et menneske fortryder fra Kvitteringer (handling.bankmatch.unlink-transaction) eller fra Bank (handling.bankmatch.panel-unmatch). Matchrækken slettes, bilagets banklinje-anker nulstilles, og linjens status genberegnes.

Bogføringen rulles ikke tilbage. Et bogført bilag bliver stående, og et afregnet match (betalt faktura, leverandørafregning) afvises med CannotUnmatchSettledException. Se faelde.bankmatch.fortryd-roerer-ikke-bogfoering. Det natlige unwind (job.reconciliation-unwind-auto-matches) fortryder kun automatiske indtægtsmatches til fakturaer, der ikke længere består reglerne.

Herfra er det teknisk

4

Hvor kommer data fra

Teknisk
Afstemningsmotoren, skala 0 til 1E-mail-armen, skala 0 til 100forslag på mailbilagetmenneske opretter bilagmatchmatchmatchBankTransactionMatchingServiceMIN_CONFIDENCE 70MatchScorer ogReconciliationStrategyServiceauto-apply 0,85IndbakkenReconciliationMatchServiceVoucher-indgangenLinksVoucherTransactionsbank_transaction_matchesbank_transactions.match_status

E-mail-armen (BankTransactionMatchingService) skriver ikke til bank_transaction_matches og ikke til match_status. Den gemmer et forslag på email_voucher_attachments. Rækken i matchtabellen opstår først, når bilaget oprettes med en banklinje (handling.bankmatch.promote-inbox-attachment) eller et menneske matcher i panelet (handling.bankmatch.panel-match).

Skalaforskellen. E-mail-armen scorer i point fra 0 til 100 og gater ved 70. Afstemningsmotoren scorer som andel fra 0 til 1 og gater ved 0,85 for auto-match. 70 og 0,70 er ikke det samme tal. Panelet omregner mailscoren til visning (min(0,99, score / 100)), og dér løftes et bekræftet par til mindst 0,86, kun som rangering. Se faelde.bankmatch.to-skalaer og faelde.bankmatch.86-gulv-er-visning.

E-mail-armen (point, 0 til 100). Porten corroboratesIdentity giver 0, medmindre datoen ligger højst 7 dage fra (regel.bankmatch.korroboration) eller beløbet er inden for 1 %.

SignalPointRegel
Beløb inden for 0,01 kr, 1 %, 5 %, 10 %40, 35, 25, 15regel.bankmatch.beloeb-point
Dato inden for 0,5, 3, 7, 14, 30 dage20, 17, 12, 7, 3regel.bankmatch.dato-point
Lært alias og navne ligner hinanden30regel.bankmatch.alias-point
Navn: ens, indeholdt, fælles ord, platform28, 20, 15, 20regel.bankmatch.navn-point
Afsenderdomæne i modpart eller tekst20regel.bankmatch.navn-point
Søgeord fra emne, afsender eller leverandør15regel.bankmatch.navn-point
Fakturanummer fra emnet i bankteksten10regel.bankmatch.navn-point
Loft på summen100regel.bankmatch.score-loft
Mindste score for at foreslå70regel.bankmatch.min-confidence
unique_amount: ét eksakt beløb, ingen identitet60regel.bankmatch.unikt-beloeb

Blandt kandidater over 70 vinder den nærmeste dato, så højeste score, så laveste id. Kun 50 kandidater inden for regel.bankmatch.kandidat-vindue-beloeb scores pr. bilag.

Hvad må ske uden et menneske, når forslaget findes:

NiveauMå auto-promoveres?Regel
unique_amount (60)Nej, nægtes ved navnregel.bankmatch.unikt-beloeb
Score 70 til 84Ja, hvis OCR er mindst 0,85regel.bilag.auto-promote-ocr
Score 85 og deroverJa, hvis OCR er mindst 0,70regel.bilag.staerk-bank, regel.bilag.ocr-ved-staerk-bank
Firmaets gulvKan være højere end 70indstilling.company.voucher-auto-promote-min-confidence

Auto-promovering opretter bilaget uden banklinje. Linjen bliver i afstemningskøen. Bilaget når først regnskabet via auto-bogføringens egen vagt eller et menneske.

Afstemningsmotoren (andel, 0 til 1), udgiftssiden:

StrategiScoreMå auto-matche?
meta_charge_reference0,99Ja
reference_exact0,99Nej, kun panelet (regel.match.reference-eksakt)
supplier_name_match0,85 ved unikt navn og beløb, ellers 0,70Ja, kun ved 0,85 (regel.match.leverandor-navn)
supplier_profileop til 0,97, 0,70 ved bar navnematchJa, ved aliasandel regel.match.profil-alias-andel
payroll_component, payroll_group0,85 (0,60 ved regnskabsspejl)Ja ved 0,85 (regel.loen.konfidens)
voucher_amount_match0,80 unikt, ellers 0,65Nej (regel.match.bilag-beloeb)
amount_exact0,85Nej (regel.match.beloeb-eksakt)
voucher_name_match0,70Nej (regel.match.bilag-navn)
amount_tolerance0,70Nej (regel.match.beloeb-tolerance)

Indtægtssiden (fakturaer): regel.match.reference-eksakt 0,99, regel.match.indkomst-beloeb-dato 0,85, regel.match.indkomst-beloeb-modpart 0,75, regel.match.indkomst-tekstsoegning 0,60, regel.match.indkomst-svagt-fakturanummer 0,55.

Gulv og kontakt: regel.match.auto-apply (0,85), og firmaets egne indstilling.company.reconciliation-auto-approve-enabled, indstilling.company.reconciliation-auto-approve-min-confidence og indstilling.company.reconciliation-auto-approve-threshold. Kun fem strategier må auto-matche: regel.match.auto-tilladte-strategier.

Lofter der overstyrer scoren:

LoftVærdiGælder
regel.match.betaler-navn-loft (PAYER_NAME_CONTRADICTS_CAP)0,75Betalernavnet modsiger kunden
regel.match.foraeldede-vindue0,75Fundet kun i det forfaldne vindue
regel.match.kryds-valuta-loft0,75To valutaer
regel.match.historisk-loft0,75Historisk backfill
regel.match.anden-faktura-loft0,75Betaleren hører til en anden faktura

Et loft på 0,75 ligger under auto-apply på 0,85, så et loftet match er altid et forslag.

HvadVindueRegel
E-mail: kandidatvindue om bilagets dato30 dage hver vejregel.bankmatch.dato-vindue
E-mail: korroboration af navn og beløb7 dageregel.bankmatch.korroboration
E-mail: samme køb uden fælles fakturanummer21 dageregel.bankmatch.samme-koeb
Afstemning, kvittering14 dage, fuld score 3 dageregel.afstemning.dato-kvittering, regel.afstemning.fuld-score-kvittering
Afstemning, regning30 dage, fuld score 7 dageregel.afstemning.dato-regning, regel.afstemning.fuld-score-regning
Afstemning: bund på nedtrapning0,70 af strategiens scoreregel.afstemning.dato-gulv
Onboarding-sweep, eksakt beløb90 dageregel.bankmatch.sweep-eksakt-vindue

Vinduet for kvittering og regning bruges i panelets scoring (scoreExpenseCandidate), ikke af auto-stien, der ikke nedtrapper efter dato. En mailkandidat er først aktuel, så længe bilagsdatoen ikke er mere end 30 dage gammel (scopeMatchWindowOpen). Nøglen RECONCILIATION_AMOUNT_ONLY_CORROBORATION_DAYS (14) har ingen læser og er ikke bankmatchens 7 dage.

tabel.supplier-aliases husker, at et leverandørnavn og en bankmodpart er det samme. Aliaset læses af scoreCandidate ved hver scoring, så en ændring virker ved næste scoring uden deploy.

Skrives fraNavnetjek?
Bekræft forslag i Indbakken (handling.bankmatch.confirm-inbox-match)Ja, namesCorroborate
Opret bilag fra Indbakken, også ubevogtet auto-promoveringJa
Hvert match i afstemningsmotoren (recordEmailInboxAlias)Nej

Kommandoen supplier-aliases:purge-uncorroborated rydder aliaser uden navnestøtte (tør kørsel som standard).

Faktura og kvittering på samme banklinje

Sektion kaldt “Faktura og kvittering på samme banklinje”

En faktura og dens kvittering er to filer om ét køb og må derfor dele banklinje. samePurchase slår dem sammen, hvis fakturanumrene er ens (uden datogrænse), eller hvis beløb, valuta og leverandørnavn er ens, den ene er en regning og den anden en kvittering, og datoerne ligger højst 21 dage fra hinanden (regel.bankmatch.samme-koeb). Søskendebilaget afvises med årsagen same_purchase_duplicate, så køb ikke tæller dobbelt.

Appens tidszone er UTC. Dansk tid er 2 timer senere om sommeren og 1 time senere om vinteren.

01:0001:3002:0002:3003:0003:3004:0004:3005:0005:3006:0006:30Match mailbilag mod banklinjer, hvert Auto-promovér, hvert Genmatch kvitteringer, hvert Fuld regnskabssync 03Fortryd forældede auto-matches 03Bankhentning, reduceret tier 03Backfill kvitteringsmatches 04Scoring af forslag 05Match-audit, invarianter 06Hver timeNat og morgenBankmatch over et døgn, UTC

Hver fjerde time (:15) henter appen også nye banklinjer, og hver halve time fornys Revolut-tokens. Mandage kører replay-audit kl. 07.20 og onboarding-audit kl. 07.40.

Alle poster kører på én server og uden overlap. Sweepet har ingen schedule-post, se nedenfor.

StedHandlingerFælles indgangmatch_source og strategi
Kvitteringerhandling.bankmatch.link-transaction, handling.bankmatch.unlink-transaction, handling.bankmatch.auto-matchLinksVoucherTransactions::linkTransaction, via VoucherMatchActionshuman, manual_voucher_link. Jobs bruger samme indgang uden bruger og får system
Indbakkenhandling.bankmatch.confirm-inbox-match, handling.bankmatch.reject-inbox-match, handling.bankmatch.promote-inbox-attachmentEmailAttachmentLifecycleService, ved oprettelse ReconciliationMatchService::matchBekræft skriver ingen match-række. Oprettelse skriver human med email_bank_match eller manual
Bank, MatchPanelhandling.bankmatch.panel-match, handling.bankmatch.panel-unmatch, handling.bankmatch.panel-ignore, handling.bankmatch.panel-approve, handling.bankmatch.panel-manual-posting, handling.bankmatch.koer-afstemningReconciliationMatchServicehuman, strategi fra panelet, ellers manual. Uden bruger og strategi unknown

Voucher-indgangen og panelet er to veje ind i samme tabel, så et menneske kan koble samme kvittering fra begge steder. Tilladelsen er vouchers.edit på Kvitteringer, vouchers.edit eller vouchers.create i Indbakken og bank.reconcile på Bank.

Onboarding-sweep og rækkefølgen af integrationer

Sektion kaldt “Onboarding-sweep og rækkefølgen af integrationer”

job.sweep-accounting-reconciliation parrer en banklinje med en post i regnskabet, når bankforbindelsen er i gang. Den skriver en match-række med strategien accounting_sweep og match_source system, og linjens status bliver manual_matched. E-mail-armen læser kun linjer uden match-række, så en sweepet linje er usynlig for den. Derfor betyder rækkefølgen noget: kobles regnskabet før mailen, kan sweepet tage linjerne først, og mailbilagene ender som regninger. Se faelde.bankmatch.onboarding-sweep-beslaglaegger.

Sweepet kører kun for forbindelser, hvor autoSweepEnabled er sand, og det startes fra ny bankforbindelse, regnskabssync og den fire-timers bankhentning, ikke fra en schedule-post. Vinduerne er regel.bankmatch.sweep-eksakt-vindue og regel.bankmatch.sweep-navnelighed.

Match-auditen er det stående tilsyn med matchkvaliteten (job.match-audit-run). Den har to lag:

  1. Invarianter, hver dag kl. 06:20 UTC (schedule.match-audit-invariants). 13 skrivebeskyttede detektorer, hver med en forventet værdi. Eksempel: sweep_claimed_before_mail forventer 0.
  2. Fuld kørsel med replay, hver mandag kl. 07:20 UTC (schedule.match-audit-full). Den kører den rigtige MatchScorer mod bekræftede matches og klassificerer hver som enig, tavs eller uenig.

Resultatet ligger i tabel.match-audit-runs og tabel.match-audit-findings og læses i adminappens side Matchkvalitet (system-kpi.matchkvalitet). Replayet kræver en produktionskopi, se faelde.bankmatch.audit-replay-lokalt.

Matchet kræver kun fra banken: linjens dato, beløb og valuta, modpart, tekst og reference. Kilderne er integration.aiia (standard for nye firmaer), integration.yapily og integration.revolut (også Revolut Business). Hver bankforbindelse synkroniserer på sin egen udbyder, uanset firmaets standard. Aiia afleverer modpart og tekst fra betalers eller modtagers navn og linjens beskrivelse. job.sync-bank-transactions opretter linjerne som unmatched.

Herfra er det teknisk

3

Livscyklus

Teknisk

Banklinjens match_status er tilstand.bank-transaction.match-status.

sync opretter linjendelvist matchfuldt match, sweep, manuelbogføringgenmatch af kvittering,auto-apply af indtægtignorerfjern ignoreringfuld dækningfortrydgodkendfortryd eller unwindfortrydfortryd ét af flereunmatchedpartially_matchedmanual_matchedauto_matchedignored

Hver pil har sin udløser og vagt i tilstandsposten. Status genberegnes af RecalculatesMatchStatus og er aldrig et bevis på, hvem der matchede.

Bruges af