Signals unchanged at HOLD / BUY / BUY. Price +5.5% to US$14.96. The Q2 print landed three days before the last report and its effects are now visible in consensus, in the take rate, and in the share register.
The prior report also flagged its own weakness — that its consensus EPS predated the 13 August print. That has resolved favourably: consensus has risen to US$1.14373 from US$1.08[3].
dLocal is a cross-border payments processor built for the places the large global processors find awkward. Global merchants — streaming platforms, marketplaces, ride-hailing, SaaS — want to collect money in Brazil, Mexico, Nigeria, Egypt and thirty-odd other emerging markets, where payment happens through local cards, bank transfers, cash vouchers and wallets rather than international credit cards. dLocal holds the licences and the local rails, takes a percentage of the volume it moves, and handles both collection and payout. Its distinctive position is regulatory and operational rather than technological: a single integration reaching corridors that would each otherwise require their own licence, bank relationships and compliance regime.
Lifecycle & sector: a high-growth emerging-market payments processor, GICS Information Technology but economically an EM payments business — so it is scored on TPV growth, take-rate stability, FCF conversion and geographic concentration rather than on software multiples.
The growth is real and it is accelerating. Q2 2026 revenue was US$399.66M, +55.8% year on year, on total payment volume of US$17.7bn, +92%[1]. Revenue beat consensus by 9.6%. Return on equity is 41.3% and the balance sheet is genuinely strong — but not as strong as I first published. Total cash is US$874.2m against US$67.4m of debt[9], and it would be easy to call that US$0.8bn of net cash. It is not. Most of that balance is merchant float — money dLocal is holding on its customers' behalf against trade payables, not money it can spend. On the basis my own August report established (corporate cash US$369.1m of US$794.9m total, a 46.4% corporate share), corporate cash today is roughly US$406m and corporate net cash roughly US$339m. It pays a dividend on a 28.5% payout, which is unusual at this growth rate and says something real about cash conversion.
And the price of that growth is measurable. I measure the take rate as gross profit ÷ TPV — the same basis my August report used, so the series is comparable: FY24 1.15% · FY25 0.99% · Q2 2025 1.07% · Q1 2026 0.84% · Q2 2026 0.72%. It declines in every period shown and is about a third lower year on year. I am deliberately NOT calling that ‘three consecutive quarterly declines’: the series mixes annual with quarterly observations and skips Q3 and Q4 2025, because no tool in the stack returns quarterly TPV and I did not retrieve those quarters from the releases. Only one adjacent quarter-on-quarter pair (0.84 to 0.72) is actually evidenced. (On a revenue ÷ TPV basis the same quarters read 2.78% to 2.26%, a milder-looking −19%. I am naming the basis because switching between them is exactly the kind of quiet reframing this report criticises elsewhere.) Operating margin went with it: 16.05% against 22.3%. The clearest tell is that EPS missed by one cent while revenue beat by 9.6%[1]. Volume is being bought with price, and it has reached the bottom line.
Industry benchmark — EM Payments (TPV growth + take-rate stability): 58/100. The framework asks for both legs. One is exceptional and one is deteriorating, which is the middle band by construction, not a fudge.
Who it competes with. In its core LatAm corridors dLocal faces Ebanx (private, the closest like-for-like in Brazil and Mexico), Adyen and Stripe moving down-market into emerging corridors, Nuvei, and — increasingly — the merchants themselves, as large global platforms build direct local acquiring once a corridor reaches scale. In Africa the field includes Flutterwave and Paystack (Stripe-owned).
Share trajectory: gaining volume, conceding price. That is not a characterisation, it is what 92% TPV growth alongside a 35-basis-point take-rate decline on the gross-profit basis (52bp on revenue ÷ TPV) means arithmetically. dLocal is winning corridors and wallet share; it is paying for them in pricing. The moat-erosion vector is straightforward: its advantage is regulatory and operational — licences, local rails, payout complexity in places large processors find unattractive — and that advantage decays as each corridor matures and the economics become worth someone else’s while.
Net effect on the moat. Switching costs trimmed to 55 and cost advantage to 52: an integrated payments provider is genuinely sticky, but a merchant that has already integrated once can integrate again, and repricing is evidence that at least some are threatening to. Pricing power is the weakest dimension at 45 — a business raising volume by conceding rate does not have it. Moat 58, threat level elevated.
Quality 62 — down four against 16 August, and I am going to resist decomposing that 4-point fall, because it cannot honestly be done. The prior report published a different build — it had no balance-sheet term at all — so there is no term-by-term bridge between its 66 and this 62. What I can say precisely: the EM Payments benchmark is unchanged at 58 versus 16 August (it went 58 to 62 and back to 58 within this run’s own drafts, a round trip worth nothing against the prior report), so none of the fall is attributable to it. Separately and on a different baseline, 2.0 points of this pillar are corrections relative to THIS report’s own first draft — the balance sheet on the overstated cash (1.2 points) and the benchmark round trip (0.8). Against 16 August, the business-attributable portion of the fall is at least 2.8 points.
The anchor. Discount rate r = 4.95% ten-year[5] + 4.50% equity risk premium + 1.0% risk add-on (Quality 62 is below the 65 line) = 10.45%. Near growth is capped at the secular bucket’s 15% — consensus implies far more, and the 25% haircut still exceeds the cap, so the cap binds. Terminal growth 3%.
That gives a warranted forward multiple of 19.63×. The actual forward multiple is US$14.96 ÷ US$1.144 = 13.08×[3], so the ratio is 0.670 — comfortably inside the Attractive band. The Information Technology guardrail of 33× is nowhere near binding.
Two separate things pushed the warranted multiple down, and they should not be conflated. The ten-year rising from 4.63% to 4.95% takes it from 24.09× to 22.84×. The remaining 22.84× to 19.63× is not rates — it is the risk add-on switching on because Quality fell below 65, which is to say it is the corrected cash balance in §3 arriving in the valuation.
And the ratio got worse, not better. On a like-for-like corrected basis it went 0.546 to 0.670 — about 23% more expensive than a month ago. Consensus EPS rising to US$1.144 helped, but not enough to offset a higher discount rate and a lower Quality score. An earlier draft of this report said the ratio improved. It did not, and the error ran in the flattering direction.
What the anchor alone implies, stated plainly. 19.63× on US$1.144 is US$22.45 a share. I am not publishing that as fair value. The analyst panel’s median is US$18.50 and its high is US$21.00[3]; a single discounted-cash-flow anchor on a business whose take rate is falling 35bp a year on the gross-profit basis deserves less confidence than its arithmetic implies. Fair value is set at US$18.50, the consensus median. The gap between that and US$22.45 is the reason the band is Attractive rather than Fair, and it is also the reason the valuation confidence is 68% rather than higher.
Valuation 80 — the Attractive band. On EV/EBITDA 14.26× and EV/Revenue 2.58× against 55.8% revenue growth and net cash, this is not a demanding price. The question this report keeps returning to is not whether it is cheap; it is whether the take rate stabilises.
The driver is emerging-market digital payment volume — the secular shift of LatAm and African commerce onto cards, wallets and local rails, and global merchants needing someone to collect in those corridors. On volume the driver is working about as well as it can: TPV +92%[1].
But the driver has a second face, and this report is the one where it shows. The same corridor maturity that creates the volume also invites competition, which is what the take rate is measuring. A driver that delivers volume while compressing price is not an unambiguous tailwind.
Macro cross-currents. EM Equities read short Underweight, medium Neutral, long Overweight[6] — the long leg is the one that matters for a structural EM story. The dollar is Neutral near-term and Underweight long, which helps: a weaker dollar eases the FX-convertibility strain that is dLocal’s chronic operational risk.
Drivers 68 — a Tailwind by score, down two. It clears the 65 amplification threshold. It does not get to amplify anything, because the economy does not agree — see below.
The 9 September macro report has the regime as energy-shock stagflation at 48%, with Technology (XLK) Underweight on all three horizons and US Tech (QQQ) short Strong Underweight[6]. dLocal is not in the macro watchlist, so its GICS sector maps to XLK and the pressure is Headwind.
The Neutral-to-Headwind change is mostly a RE-MAPPING, and saying otherwise would mislead. The macro report’s own 12 August watchlist row classified dLocal under Financials (XLF), and my 16 August report used XLF deliberately — for the macro row and for relative strength. Financials reads N/N/N on 9 September. dLocal dropped out of the 9 September watchlist, so the GICS sector map now governs and Information Technology maps to XLK at U/U/U[6]. The pressure did not deteriorate for this name; the mapping moved. No amplification was available on either mapping — Neutral blocks it as surely as Headwind — so the signal is untouched either way.
I apply the sector map because Step 11b says to when a name is not in the watchlist, and because carving out an exception on the grounds that a label is inconvenient is how a mapping stops meaning anything. But the tech call is about US mega-cap concentration and AI earnings quality, and a Uruguayan payments processor at 13× forward earnings has little to do with it. The mismatch is recorded, not corrected.
Pressure Headwind, stance Contrarian, conviction 58 — fading a headwind is justified here on valuation washout and an improving long-horizon EM signal, but not on oversold conditions, because it is not oversold. The consequence is concrete: a Headwind pressure blocks amplification, so this cannot be a STRONG BUY however well the driver scores.
Source: sector map (GICS Information Technology → XLK) · Macro report 2026-09-09
The higher timeframes are constructive and the tape underneath them is not. Monthly and weekly are both uptrends; daily reads weakening and hourly is a downtrend[8]. Price sits 1.1% above a rising 50-DMA of US$14.80 and 11.1% above the 200-DMA of US$13.47[7].
The volume is the problem. The LAST volume-backed close above the 50-DMA was 21 August at US$15.17 on 1.72× the 20-day average. Since then the move has faded: a closing high of US$15.78 on 3 September, a close below the 50-DMA at US$14.66 on 9 September, and 11 September traded 0.22× average volume[7]. Higher-timeframe volume ratios run 0.35-0.5[8]. A trend that holds on thin volume is not the same as a trend that is confirmed.
Relative strength is genuinely good. DLO returned +18.0% over twelve weeks against +2.1% for the S&P 500 and +0.9% for XLK — +15.9pp and +17.0pp of relative strength. But four-week momentum is only +1.4% — the outperformance was earned in July and August, not in the last month.
Timing 62, up one. Improving, not confirmed — and that distinction is what caps the short horizon below.
| Date | Event | Impact | Forecast | Previous | Relevant? | Why |
|---|---|---|---|---|---|---|
| 2026-09-25 | Next scheduled Donatien review | Company-specific | — | — | ✅ Yes | +14d standing ceiling |
| 2026-09-11 | US CPI (August) — LANDED TODAY | High | core +0.2% | core +0.3% ACTUAL | ✅ Yes | Core ran hot; traders raised Fed-hike odds for the following week and the 10-Y sits at 4.95%. The ten-year is the single input the whole anchor keys off. |
| 2026-09-16 | FOMC rate decision | High | hike priced | — | ✅ Yes | A hike would compress the warranted multiple further. IT is Medium macro-sensitivity, so this is a sizing note, not a WAIT-FOR-EVENT override. |
| 2026-09-18 | Bank of Japan decision | Medium | — | — | ⚠ Medium | Global duration; feeds the same rate channel |
| 2026-11-18 | dLocal Q3 2026 results | High | — | — | ✅ Yes | The take-rate line is the number that matters, not revenue |
| Timeframe | Trend | Direction | RSI | MACD | Key S/R | Breakout | Vol |
|---|---|---|---|---|---|---|---|
| Monthly | Uptrend | Bullish | 46.4 | + | S: 13.47 R: 16.78 | Resistance break | 0.35x |
| Weekly | Uptrend | Bullish | 56.5 | + | S: 14.00 R: 15.78 | Resistance break | 0.40x |
| Daily | Weakening | Neutral | 47.5 | flat | S: 14.66 R: 15.78 | None | 0.50x |
| Hourly | Downtrend | Bearish | 46.7 | − | S: 14.66 R: 15.16 | None | 1.60x |
| 15-min | Uptrend | Neutral | 52.7 | flat | S: 14.91 R: 15.16 | None | 4.48x |
The take rate stabilises near 2.2% as the corridor mix matures, TPV growth stays above 50%, and operating leverage finally shows — revenue growth outrunning the pricing give-back. The multiple re-rates toward the panel high as the market stops treating every basis point of take rate as a structural decline. This is the case where volume growth was worth the price paid for it.
Growth stays strong and the take rate keeps grinding down at a decelerating pace. Earnings grow, but more slowly than volume, and the stock works toward the analyst median rather than the anchor. This is the consensus path and it still delivers a respectable return from here.
Take-rate compression accelerates rather than decelerates as Ebanx, Adyen and Stripe press the core corridors and large merchants insource — the competitive trigger, and the one the moat analysis says is live. Compounded by an FX or regulatory event in Nigeria, Egypt or Argentina, or further sponsor supply. Earnings stop growing while volume still does, which is the worst version of this business model.
Probability-weighted value US$17.88 against US$14.96, about 19.5% of upside. The base case is deliberately set at the analyst median rather than at the anchor’s US$22.45: on a business whose central uncertainty is the direction of its own pricing, the discounted-cash-flow number is the least reliable of the estimates available, however precise it looks.
Forecast: Fundamental: already met and likely to stay met — it would take roughly a 24% rally to close it. Technical: the reachable one. It needs a close above the 50-DMA on more than 1.5× average volume; price is already 1.1% above it, so this is a volume problem rather than a price problem, and volume on this name arrives with news. Forecast confidence: Moderate within 4-8 weeks, and High that the Q3 print on 18 November resolves it one way or the other. Catalyst: opens 18 November. The practical read: the next genuine decision point is the Q3 print, and it is the take-rate line that matters, not the revenue line.
Where the return comes from. Not from a re-rating to the anchor. From earnings growing into a multiple of 13.08× while the take rate finds a floor. If it does not find one, the multiple is not the thing that was wrong.
What would make this a STRONG BUY. Two things, and both must hold: the economic pressure turning from Headwind to Tailwind (the macro report moving Technology off Underweight), and the valuation staying out of the Full band. The valuation arm is comfortably satisfied today; the macro arm is not, and it is not in this company’s control.
What would take this to HOLD or lower. A third consecutive quarter of take-rate decline at this pace; operating margin below 14%; a close below US$13.20, which is under the 200-DMA; or a regulatory or convertibility event in a major corridor.
The honest summary. This is a genuinely fast-growing, cash-generative, net-cash business at 13× forward earnings with ten analysts and a bullish consensus, and I would rather own it than not. It is also conceding half a point of take rate a year, has just had its sponsor sell a fifth of a large position below today’s price, and sits in a sector the macro report rates Underweight across every horizon. A BUY on the two longer horizons at half size — not a table-thumper, and not a trade for this week.
You are risking about 12% to the hard stop to gain 20% on the probability-weighted path.
What you are risking. The stop sits at US$13.20, 11.7% below here and beneath the 200-DMA. The bear case is US$11.50, -23%, and it is not exotic: it is simply take-rate compression continuing at the pace shown. You would also be buying with the Technical entry group SHUT — the tape is above a rising 50-DMA but on 0.22x volume, so you are not being paid to wait for confirmation, you are choosing not to.
What you are gaining. The base case is US$18.50 (24%) and the bull US$23.00 (54%). You start collecting a 1.3% dividend on a 28.5% payout immediately, and you own the optionality that the take rate finds a floor — which is the entire bull case and costs nothing extra at this price.
The read: acting now is defensible at half size. Waiting for the 18 November print materially improves the information — it is the quarter that tells you whether the take rate is stabilising — and costs you only the gap between here and wherever it opens.
You would be giving up the base-case upside to protect against a compression trend that has not yet broken the thesis.
What you are giving up. US$18.50 base and US$23.00 bull, the dividend, and a business compounding volume at 92%. You would be selling at 13.08x forward against a 19.63x warranted multiple — below fair value on the anchor, on the consensus median, and on the panel's own low target.
What you are protecting. Nothing mechanical: no exit trigger is live. The stop is 13% away, no thesis-invalidation condition has fired, and the price is below the profit target. You would be protecting against the risk that the take-rate decline shown continues and deepens.
The read: there is no mechanical reason to sell here. This is a hold-or-accumulate zone, and the accumulate half is what the conviction ladder is rationing.
{
"ticker": "DLO",
"date": "2026-09-11",
"version": "v6",
"brand": "dLocal",
"company": "DLocal Limited",
"currency": "USD",
"exchange": "NASDAQ",
"exchange_ticker": "NASDAQ:DLO",
"isin": "KYG290181018",
"api_ticker": "DLO",
"analysis_status": "donatien-pick",
"lifecycle_stage": "high_growth",
"sector": "Information Technology",
"gics_sector": "Information Technology",
"price_at_rating": 14.955,
"signal_short": "HOLD",
"signal_medium": "BUY",
"signal_long": "BUY",
"primary_signal": "BUY",
"short_signal": "HOLD",
"short_hold_reason": "technical_pending",
"short_entry_confirmed": false,
"short_cap_reason": "Technical entry group UNMET. The LAST volume-backed close above the 50-DMA was 21 Aug 2026 at $15.17 on 1.72x the 20-day average; the move has faded since \u2014 price sits 1.1% above a 50-DMA of $14.80 on 0.22x volume, and closed BELOW it on 9 Sep. Catalyst group UNMET: next earnings 18 Nov 2026 is outside the 30-day window. Medium and Long are unaffected.",
"base_signal_short": "BUY",
"base_signal_medium": "BUY",
"base_signal_long": "BUY",
"quality_score": 62,
"valuation_score": 80,
"timing_score": 62,
"driver_score": 68,
"quality_confidence": 62,
"valuation_confidence": 68,
"timing_confidence": 60,
"overall_confidence": 60,
"composite_short": 66,
"composite_medium": 68,
"composite_long": 67,
"economic_alignment_stance": "Contrarian",
"economic_alignment_conviction": 58,
"economic_alignment_pressure": "Headwind",
"economic_alignment_source": "sector-map",
"macro_report_date": "2026-09-09",
"val_band": "attractive",
"warranted_multiple": 19.63,
"actual_multiple": 13.08,
"warranted_ratio": 0.67,
"val_multiple_basis": "clean forward P/E \u2014 price divided by the FY2027 consensus diluted EPS of US$1.14373 (n=10, post-print). BOTH SIDES FORWARD: the warranted multiple below is the forward form (trailing 26.26x divided by 1+g_near), not the trailing one.",
"eps_forward": 1.14373,
"eps_trailing": 0.68,
"trailing_pe": 21.99,
"discount_rate_r": 10.45,
"risk_free_10y": 4.95,
"g_near": 15.0,
"g_term": 3.0,
"nonop_pct_of_net_income": 5.3,
"clean_pe": 13.08,
"clean_peg": null,
"fair_value_est": 18.5,
"target_price": 18.5,
"stop_loss": 13.2,
"scenario_base_target": 18.5,
"scenario_bull_target": 23.0,
"scenario_bear_target": 11.5,
"probability_weighted_target": 17.88,
"entry_groups_met": 1,
"entry_conviction": "Half-Size",
"exit_groups_live": 0,
"exit_action": "Hold",
"hard_gate_state": "caution",
"gates_triggered": [],
"gates_caution": [
"Take-rate compression (Gate 4 adjacent, not triggered) \u2014 measured on the GROSS PROFIT basis the prior report used, so the series is comparable: FY24 1.15% / FY25 0.99% / Q2 2025 1.07% / Q1 2026 0.84% / Q2 2026 0.72%. Declining in every period shown, and about a third lower year on year. (On a revenue-over-TPV basis the same quarters read 2.78% to 2.26%, a milder-looking -19%; the basis is named because switching between them quietly is the reframing this report criticises elsewhere.) Q2 EPS MISSED by US$0.01 while revenue BEAT by 9.6%: the compression reaches the bottom line. Operating margin 16.05% against 22.30% a year ago, on the 64.161M operating income the data tool returns.",
"Sponsor supply overhang \u2014 General Atlantic sold 9,842,559 shares at an average execution price of US$13.60 on 17 Aug 2026, a 21.1% cut leaving 36,814,136. Do-Not-Buy Trigger 4 requires three or more C-suite insiders disposing of over a quarter of their holdings within 60 days outside a 10b5-1 plan; a private-equity sponsor's 13D/A satisfies none of those legs, and dLocal is a foreign private issuer exempt from Section 16 reporting, so routine insider filings do not exist to check. It is still real supply.",
"Regulatory / Binary (Gate 5) \u2014 CAUTION, not triggered. No dated decision pending, but dLocal carries chronic elevated regulatory and FX-convertibility risk across its LatAm, Nigeria and Egypt corridors.",
"Concentration and competition \u2014 merchant concentration plus credible price competition is what the take-rate line is measuring; competitive_threat_level remains elevated."
],
"do_not_buy_triggers": [],
"moat_score": 58,
"competitive_share_trajectory": "gaining volume, conceding price",
"competitive_threat_level": "elevated",
"industry_benchmark_name": "EM Payments: TPV growth + take-rate stability",
"industry_benchmark_value": "TPV +92% to US$17.7bn; take rate (gross profit / TPV) 1.07% -> 0.72%, about -33% year on year, declining in every period shown",
"industry_benchmark_score": 58,
"analyst_consensus_target": 18.7,
"analyst_target_high": 21.0,
"analyst_target_low": 15.0,
"analyst_target_upside_pct": 25.0,
"analyst_coverage_count": 10,
"analyst_grades_consensus": "strong_buy",
"analyst_bullish_pct": 90.0,
"recent_upgrades_30d": 0,
"recent_downgrades_30d": 0,
"relative_strength_vs_spy": 15.9,
"relative_strength_vs_sector": 17.0,
"next_update_date": "2026-09-25",
"next_update_basis": "+14d standing ceiling, which is the governing rule here. Dated events inside the window (CPI on 11 Sep, FOMC 16 Sep, BoJ 18 Sep) are recurring macro releases and are NOT scheduling triggers for a Medium macro-sensitivity sector; Q3 earnings on 18 Nov 2026 is the only company-specific dated event and it is far outside the window.",
"prior_report": "calibration-DLO-20260816-1430.json",
"prior_primary": "BUY",
"changes_note": "Signals unchanged at HOLD/BUY/BUY; price +5.5% to US$14.955 since 16 Aug. Q2 2026 (13 Aug): revenue US$399.7M +55.8% YoY beat consensus by 9.6%, TPV +92% to US$17.7bn, but EPS MISSED by US$0.01; on the gross-profit basis the 16 Aug report used, the take rate fell 1.07% -> 0.72%. Consensus forward EPS rose to US$1.14373 from US$1.08. THIS RUN CORRECTS TWO ERRORS IN THE 16 AUG REPORT: its warranted multiple 27.70x was the TRAILING form scored against a FORWARD actual (forward was 24.09x, ratio 0.546 not 0.475 \u2014 an error in the flattering direction; band and signal unchanged), and next earnings is 18 Nov not 11 Nov. AND IT CORRECTS TWO ERRORS IN ITS OWN FIRST DRAFT, both caught by the independent audit: (1) the General Atlantic sale price was published as US$13.91, which is that day's CLOSING price \u2014 the 13D/A says US$13.60 average execution; (2) '~US$0.91bn net cash' was backed out of provider EV and silently reversed the prior report's correct merchant-float finding \u2014 corporate net cash is roughly US$339m, an overstatement of about US$571m. That correction propagates: Quality 66 -> 62. That 4-point fall is NOT decomposable term by term: the 16 Aug report published a different build with no balance-sheet term. The EM Payments benchmark is unchanged at 58 versus 16 Aug (it went 58 -> 62 -> 58 within this run), so none of the fall is attributable to it, and the business-attributable portion is at least 2.8 points. Separately, 2.0 points of this pillar are corrections relative to THIS run first draft, risk add-on +0.0% -> +1.0%, r 9.45% -> 10.45%, warranted forward 22.84x -> 19.63x, ratio 0.57 -> 0.67. Still Attractive, signals unchanged.",
"delta_vs_prior": "vs calibration-DLO-20260816-1430.json. quality 66 -> 62. valuation 78 -> 80. timing 61 -> 62. driver 70 -> 68. economic alignment 62 -> 58. price 14.17 -> 14.955. warranted_ratio 0.475 -> 0.67. next_update 2026-08-31 -> 2026-09-25. base target 17.45 -> 18.5. bull target 21 -> 23. bear target 10.75 -> 11.5. relative strength vs SPY -6.6 -> 15.9. relative strength vs sector -5.5 -> 17. moat 60 -> 58. overall confidence 62 -> 60. probability-weighted target set to 17.875 (absent in the prior report). scenario weights set to {'bull': 25, 'base': 50, 'bear': 25} (absent in the prior report). gates_caution 1 -> 4 (added Take-rate compression (Gate 4 adjacent, not triggered) \u2014 measured on the GROSS PROFIT basis the prior report used, so the series is comparable: FY24 1.15% / FY25 0.99% / Q2 2025 1.07% / Q1 2026 0.84% / Q2 2026 0.72%. Declining in every period shown, and about a third lower year on year. (On a revenue-over-TPV basis the same quarters read 2.78% to 2.26%, a milder-looking -19%; the basis is named because switching between them quietly is the reframing this report criticises elsewhere.) Q2 EPS MISSED by US$0.01 while revenue BEAT by 9.6%: the compression reaches the bottom line. Operating margin 16.05% against 22.30% a year ago, on the 64.161M operating income the data tool returns.; Sponsor supply overhang \u2014 General Atlantic sold 9,842,559 shares at an average execution price of US$13.60 on 17 Aug 2026, a 21.1% cut leaving 36,814,136. Do-Not-Buy Trigger 4 requires three or more C-suite insiders disposing of over a quarter of their holdings within 60 days outside a 10b5-1 plan; a private-equity sponsor's 13D/A satisfies none of those legs, and dLocal is a foreign private issuer exempt from Section 16 reporting, so routine insider filings do not exist to check. It is still real supply.; Regulatory / Binary (Gate 5) \u2014 CAUTION, not triggered. No dated decision pending, but dLocal carries chronic elevated regulatory and FX-convertibility risk across its LatAm, Nigeria and Egypt corridors.; Concentration and competition \u2014 merchant concentration plus credible price competition is what the take-rate line is measuring; competitive_threat_level remains elevated.; removed Gate 5 - Regulatory / Binary Event: CAUTION, not triggered. No pending FDA-style decision, takeover or antitrust action, so the gate does not fire - but dLocal carries chronic elevated regulatory risk across its LatAm/Nigeria corridors, which is a standing elevated risk rather than a dated binary event, and is why the overall gate state is caution rather than clear.). Carried without change: signal_short, signal_medium, signal_long, val_band, entry_conviction, entry_groups_met, short_entry_confirmed, exit_action, hard_gate_state, analysis_status, industry benchmark score, competitive share trajectory, exit_groups_live. NOTE: PASS at HOLD/BUY/BUY, Q62 V80 T62, ratio 0.67 Attractive, donatien-pick retained.",
"lint": {
"exit": 0,
"assertions": 67,
"errors": 0,
"warnings": 0,
"could_not_run": [],
"at": "2026-09-11T13:38",
"report": "DLO_Signal_v6_20260911_1900.html"
},
"carried_verbatim": [
"competitive_share_trajectory"
],
"carried_verbatim_note": "competitive_share_trajectory carries \"gaining volume, conceding price\" unchanged from 16 Aug. Checked and, for the first time, QUANTIFIED this run rather than re-asserted: TPV +92% to US$17.7bn against revenue +55.8% means the take rate fell from 2.78% to 2.26%, and Q2 EPS missed by US$0.01 while revenue beat by 9.6%. The wording is identical because the conclusion is identical; the evidence behind it is new.",
"cite_audit": {
"round": 1,
"rows": 1,
"supported": 1,
"not_supported": 0,
"partial": 0,
"census_sha256": "6e183b9aa59526163d2045e24cf7c38cef71852b6c0e05efec46166057fe5dab",
"at": "2026-09-11T21:00",
"disposition": "COVERAGE LIMITATION \u2014 and this run PROVED the gate is undersized. The detector returned a near-empty census on an 85KB report with 12 sources and 11 citations, and BOTH source-contradicting figures the Layer-2 auditor found (the General Atlantic sale price and Q2 operating income) passed it. Registered as P0 CENSUS-UNDERCOUNT in data/improvement-debt.json. Read these counts as covering almost nothing; the fabrication sweep on this report was done by a human auditor, not by this gate."
},
"corporate_net_cash_usd_m": 339.0,
"corporate_cash_note": "CORRECTED after audit. The first draft published '~US$0.91bn of net cash', backed out of provider enterprise value (4.401 \u2212 3.491). That silently reversed the 16 Aug report's own correct finding: provider EV nets TOTAL cash, most of which is MERCHANT FLOAT held against trade payables and is not dLocal's money to spend. Restated on the basis that report established \u2014 corporate cash was US$369.1m of US$794.9m total, a 46.4% corporate share. Applying that share to today's US$874.2m total cash gives corporate cash of roughly US$406m and, less US$67.4m of debt, corporate NET cash of roughly US$339m. The first draft overstated it by about US$571m. This is an ESTIMATE carried on the prior report's ratio, not a figure read off a 30 Jun balance sheet \u2014 no balance-sheet endpoint is available in the data layer.",
"layer1_self_audit": "Data pulls: income statement (8 quarters), ratios, yahoo quote, MTF, raw OHLCV 259 sessions auto_adjust off, analyst panel + grades, news 45d, macro state 9 Sep. FAILED: get_economic_series(DGS10) and get_key_economic_indicators both empty; get_earnings_calendar HTTP 401 \u2014 all three recorded in \u00a715 and substituted from named secondary sources. Data-basis traps checked: earnings-quality decomposition run (non-operating 5.3% of net income, under the 15% threshold, so reported and clean multiples agree); share count reconciled (market cap \u00f7 price \u2248 292m \u2248 reported); MERCHANT FLOAT trap \u2014 missed in the first draft and corrected here. Carried-forward diff: competitive_share_trajectory re-examined and quantified; systemic_tail_inherited restated below rather than dropped.",
"systemic_tail_inherited": false,
"systemic_tail_note": "Restated rather than dropped. The 9 Sep macro carries a narrowing-breadth concentration tail, but DLO is not in that cohort: it is not a top-weight index constituent, its earnings carry no AI-related non-operating gains (non-operating income is 5.3% of net income), and at 13.08x forward it is not a multiple levered to the AI trade. Cohort membership requires more than being classified Information Technology.",
"scenario_probabilities": {
"bull": 25,
"base": 50,
"bear": 25
},
"threshold_fragility": "Ratio 0.666 in the ATTRACTIVE band, whose upper edge is 0.80. Reaching it would need the warranted multiple to fall from 19.63x to 16.34x, which at this growth and terminal rate needs r above roughly 12.2% \u2014 a ten-year yield near 7.7%. It survives every rate path in view: at a 5.50% ten-year the ratio is 0.70 and at 6.00% it is 0.73, both still Attractive. The valuation band is NOT the fragile part of this report. Quality is: at 62 it sits THREE POINTS BELOW the 65 line that separates Medium from High, and crossing it would switch the risk add-on from +1.0% to zero and lift the warranted multiple from 19.63x to 22.84x. Two sub-scores moved the pillar this run, both corrections, which is why the build is published in full.",
"post_audit_fixes_round1": "BLOCKER-1 the General Atlantic sale price was published as US$13.91, which is that day's CLOSING price; the 13D/A says US$13.60 AVERAGE EXECUTION. I took it from a search summary instead of the filing. Corrected in all four places; the argument strengthens, since the sponsor sold lower than stated. BLOCKER-2 'roughly US$0.91bn of net cash' was backed out of provider EV and silently reversed the 16 Aug report's own correct merchant-float finding. Restated on the basis that report established (corporate cash US$369.1m of US$794.9m total, a 46.4% corporate share): corporate cash ~US$406m, corporate NET cash ~US$339m \u2014 an overstatement of ~US$571m, disclosed in a callout. MAJOR-1 the published Quality build summed to 64.0 not 65; with the balance-sheet sub-score corrected 78->70 it now sums to 62.8 -> Q63, and the propagation is carried through in full: risk add-on +0.0->+1.0%, r 9.45->10.45%, warranted forward 22.84->19.63x, ratio 0.57->0.67 (still Attractive), composites 68/70/70->67/69/68, Quality band High->Medium. Signals unchanged. MAJOR-2 the take rate is restated on the GROSS PROFIT basis the prior report used, with its series (FY24 1.15 / FY25 0.99 / Q2'25 1.07 / Q1'26 0.84 / Q2'26 0.72 = declining in every period shown; NOTE the \"three consecutive declines\" phrasing used in this round-1 log was SUPERSEDED in round 2 as unsupported), and the revenue-basis figures are shown alongside with the switch named. MAJOR-3 the corrected prior ratio is 0.546 (prior actual 13.15 over the corrected prior warranted 24.09), not 0.543 which mixed periods. MAJOR-4 operating income is 64.161M and the margin 16.05%, matching the cited tool and the ratios note. MAJOR-5 SS14 re-rendered last from the final calibration, with the real census hash and the coverage disposition intact. MAJOR-6 the Neutral->Headwind change is now disclosed as largely a RE-MAPPING: the macro's own 12 Aug row classified DLO under Financials (XLF) at N/N/N, DLO left the 9 Sep watchlist, so the GICS map now governs \u2014 and no amplification was available on either mapping. MAJOR-7 CPI is dated 11 Sep (the report date) with the actual core print, and FOMC/BoJ added. MAJOR-8 the header price box, the what-if box and SS5's driver name/label all rendered EMPTY and are now populated; the SS12 key-contract guard that should have caught this was itself mis-listed and now derives its allowed keys from the renderer. MINORS: eps_trailing 0.68 / trailing P/E 21.99; relative strength restated as +15.9pp vs SPY and +17.0pp vs XLK; prior-cal source filename; nonop restored to 5.3; scenario probabilities recorded; systemic_tail_inherited restated rather than dropped; threshold_fragility and layer1_self_audit published. THREE-AXIS SWEEP caught three surviving siblings after the primary fixes \u2014 the changes box still said 13.91, SS12 still said 16.4%, and the Gate 1 card still said US$0.91bn.",
"audit_route_note": "Round 1: SendMessage to the SAME auditor \u2014 Round 1 by a fresh agent, as required for a first round. The artifact was patched, not rebuilt \u2014 the auditor confirmed every load-bearing analytical call survived re-derivation \u2014 so report-audit.md L51 routes back to the SAME auditor, which retains context and re-checks only what moved.. Verdict FAIL (2 blockers, 8 majors, 12 minors). Round 2: SendMessage to the SAME auditor \u2014 Round 2 findings were two incomplete closures plus three defects the fix round itself introduced. Patched, not rebuilt, so the same auditor continues.. Verdict FAIL (2 blockers, 4 majors, 6 minors). Round 3: SendMessage to the SAME auditor \u2014 One blocker and one major, both propagation rather than analysis; signals unmoved on either branch. Patched, same auditor continues.. Verdict FAIL (1 blocker, 1 major, 2 minors). Round 4: SendMessage to the SAME auditor \u2014 One major and one minor, both prose trailing regenerated arithmetic; nothing analytical in play. Same auditor continues.. Verdict FAIL (0 blockers, 1 major, 1 minor). Round 5: SendMessage to the SAME auditor \u2014 One major, a baseline-mixing defect in the delta narrative. No recomputation, no signal implication. Same auditor.. Verdict FAIL (0 blockers, 1 major, 0 minors). Round 6: SendMessage to the SAME auditor \u2014 One blocker and one major, both CREATED by round 5's fix pass. Same auditor.. Verdict FAIL (1 blocker, 1 major, 0 minors). Round 7: SendMessage to the SAME auditor \u2014 PASS. Seven rounds. Two round-1 MINORs logged rather than fixed, per the auditor, and registered as P2 with this report as the dated instance.. Verdict PASS (0 blockers, 0 majors, 0 minors).",
"valuation_score_note": "Valuation 80, up 2 from 78, while the ANCHOR moved AGAINST the name (ratio 0.546 -> 0.670 on a like-for-like corrected basis). Stated explicitly because the two directions disagree. The anchor carries 40% of the pillar, but both 0.546 and 0.670 sit deep inside the same Attractive band (<=0.80), so the band contribution barely moves. The +2 comes from the relative lenses: the consensus target rose 18.35 -> 18.70 with coverage at n=10, and the grades distribution went from 69% bullish to 90% (3 Strong Buy / 6 Buy / 1 Hold) with a UBS upgrade and no downgrades. If the ratio had crossed 0.80 the band would have governed and the score would have fallen regardless of the panel.",
"post_audit_fixes_round2": "BLOCKER-A, introduced by round 1's own fix round and the worst of them: SS4 still read '0.0% risk add-on (Quality 63 clears the 65 line) = 9.45%' while printing 19.63x in the next sentence - 63 does not clear 65, the add-on is +1.0% and r is 10.45%. I updated the calibration and not the prose, so the report contradicted itself on the single change the round was built around. Also in that paragraph: the 24.09->19.63 move was attributed wholly to the ten-year when rates alone take it to 22.84x and the rest is the risk add-on (i.e. the Quality downgrade), and the claim 'the ratio still improved' was FALSE - it deteriorated 0.546 -> 0.670 on a like-for-like basis, about 23% more expensive, and the error ran in the flattering direction. All three corrected and the deterioration is now stated plainly. BLOCKER-B: SS15 Data Sources was never swept, so the provenance block still carried all three retracted figures - ga-sale US$13.91, ratios 'implying roughly US$0.91bn of net cash', q2-print operating income 65.591M - meaning each citation contradicted the claim it certified. All corrected, each with a note naming the superseded value; ust10y's 'ahead of CPI' also fixed. MAJOR-A: 'three consecutive quarterly declines' was unsupported - the series mixes annual with quarterly and skips Q3/Q4 2025, and only one adjacent pair (0.84->0.72) is evidenced. Narrowed to 'declines in every period shown' with the gap in the evidence stated, and SS12's trigger, the what-if box and the sell-side text all reconciled to that. MAJOR-B: gates_caution[0] and industry_benchmark_value never left the first draft - both were revenue-basis with the 16.4% margin, and they propagate into SS14, delta_vs_prior and the live watchlist tooltip. Restated on the GP basis with 16.05%, and industry_benchmark_score returned 62 -> 58, the prior run's value on the same basis, since there is no case for a 4-point rise in a run whose finding is further deterioration. MAJOR-C: the changes box said 'Quality -1' when it is -3 and never mentioned the US$571m cash overstatement that drove it. MAJOR-D: the Valuation +2 against a worsening anchor is now explained explicitly in the box and in a new valuation_score_note - both ratios sit deep in the same Attractive band so the band contribution barely moves, and the +2 comes from the consensus target and a 90%-bullish panel. MINORS: relative strength restated in the prose as +15.9pp vs SPY and +17.0pp vs XLK; 'the one volume-backed close' -> 'the LAST'; 15.78 named as a close not an intraday high; PEG disclosed as absent with the 45%-of-weight arithmetic; next_update_basis reconciled to SS8; the threshold_fragility garble ('two points above') corrected to TWO POINTS BELOW with the add-on consequence; the '-3 of which two points' arithmetic restated as the real 1.2 points.",
"post_audit_fixes_round3": "BLOCKER: industry_benchmark_score was adopted at 58 in the prose and the calibration while the Quality build line still computed its 12.40 term on 62 \u2014 the same failure mode as rounds 1 and 2, a value changed everywhere except the arithmetic that consumes it. Fixed at the root rather than by editing the total: the Quality build is now a DATA STRUCTURE in the builder, and the callout text, quality_score and the three composites all render from it, with an assert that refuses the build if the published score does not equal the computed one. Resolved on branch (a) as recommended: 11.60 + 16.40 + 8.80 + 10.50 + 8.70 + 6.00 = 62.00 -> Q62, composites 66/68/67, propagated to the lock and the watchlist pill. Signals unchanged HOLD/BUY/BUY; 62 and 63 are both Medium so the add-on, r, the warranted multiple, the ratio and the matrix row are all untouched, and the published sensitivity already covered 62. MAJOR: three live '52bp' figures were orphaned by the basis switch \u2014 the pillar-score header, the Share-trajectory sentence carrying the moat conclusion, and the SS4 anchor paragraph. All now read 35bp on the gross-profit basis, with '(52bp on revenue / TPV)' stated where the comparison is useful. The pillar header also dropped its pre-correction 'net cash' framing. MINORS: the round-1 fix log's 'three consecutive declines' is marked SUPERSEDED in place rather than rewritten; threshold_fragility restated to three points below the 65 line.",
"rounding_note": "composite_short is 66 from a raw 66.5. That is Python round() on an exact .5 \u2014 banker's rounding \u2014 and it is what scripts/build_stock_report.py derive_composites produces, so the published value is self-consistent with the deriver. Do NOT \"correct\" it to 67 on a later pass.",
"pwt_rounding_note": "The \u00a714 embed shows probability_weighted_target 17.88 where this file holds 17.875. BY DESIGN: the builder derives and displays the rounded value, and the embed is a RENDERING of the calibration, not a second copy of it. Degrading the stored precision to match a display rounding would be the wrong direction. Adjudicated with the Layer-2 auditor in round 4 and closed; do not re-raise.",
"post_audit_fixes_round4": "MAJOR: the score regenerated and the delta NARRATIVE did not \u2014 four sites said 'minus three' / 'down three' against a 66 to 62 move, and the decomposition claimed only 1.2 points were corrections. Fixed at the root, as with the build last round: PRIOR is now loaded from cal['prior_report'] and delta(), delta_word() and delta_sign() GENERATE the quantifiers, while CORR_PTS derives the correction share from the two moved sub-scores at their weights ((78-70)*0.15 + (62-58)*0.20 = 2.0). The changes box now renders 'Quality -4', SS3 renders 'down four' and '2.0 of those 4 points are CORRECTIONS rather than business news', and both trace to the same two expressions. changes_note endpoint corrected to 'Quality 66 -> 62'. threshold_fragility corrected to 'Two sub-scores moved the pillar this run, both corrections'. MINOR: the SS4 anchor sentence was the surviving 52bp site and my first replace SILENTLY NO-OPPED (zero occurrences, reported as done) because the wording differed \u2014 caught by counting before writing, then line-targeted. Also recorded two by-design notes so later passes do not 're-correct' them: rounding_note explains composite_short 66 is Python banker's rounding of an exact 66.5 and matches the deriver, and pwt_rounding_note records the auditor's adjudication that the SS14 embed showing 17.88 against a stored 17.875 is a rendering, not a second copy, and closed. VERIFICATION METHOD CHANGED this round on the auditor's instruction: every claim re-read against the BUILT HTML rather than against the intent, which is how the no-op and the surviving SS3 sentence were both caught.",
"post_audit_fixes_round5": "MAJOR: CORR_PTS was an INTRA-RUN figure (this report's first draft -> final) printed as a share of an INTER-RUN delta (66 on 16 Aug -> 62). Verified the auditor's decisive proof directly: the 16 Aug calibration records industry_benchmark_score = 58, so this run's 58 -> 62 -> 58 is a ROUND TRIP worth zero against the prior report, and its 0.8 points cannot be part of a 66->62 fall; and the 16 Aug build had entirely different terms (moat, ROIC percentile, capital allocation, skin-in-game, NO balance-sheet term), so the 4-point fall cannot be decomposed against it at all. The error ran FLATTERING \u2014 it booked half the fall as self-correction when the business-attributable portion versus 16 Aug is at least 2.8 points. Fixed by separating the baselines rather than adjusting the number: SS3 now declines to decompose the 4-point fall and says why, states that the benchmark is UNCHANGED at 58 versus 16 Aug so none of the fall is attributable to it, and reports the 2.0 points separately and explicitly as corrections relative to THIS report's own first draft. The builder constant is renamed CORR_PTS_VS_FIRST_DRAFT with the baseline in the name and a comment recording both proofs, so the mixing cannot recur silently. Also dropped the changes box's 'most of that is a correction' \u2014 2.0 of 4 is half, not most, even on the arithmetic that was wrong. ADJACENCY CHECKED as instructed: the neighbouring build callout's 'two sub-scores moved this run, both corrections' is true within the run and now says so explicitly, so it cannot be read as a claim about the 66->62 delta.",
"post_audit_fixes_round6": "BLOCKER: my round-5 rewrite of SS3 dropped the f-prefix from the build callout, so {QB_LIST} and {QB_TERMS} rendered as LITERAL TOKENS while {QB_SCORE} substituted - a PARTIAL substitution, which is why it read as plausible prose instead of crashing. The effect was the worst available: it deleted the per-term Quality build and its arithmetic from the published report, which is the exact artifact rounds 3, 4 and 5 existed to make auditable and the thing QUALITY_BUILD was introduced to guarantee. Lint, preflight, stale_text and figure_set all passed it. Fixed, and then fixed as a CLASS: PLACEHOLDER-LEAK now runs inside build_stock_report.py against BOTH the built HTML and the spec (the leak was upstream, already in the spec), and fails the build with the surrounding context. Proven by injection: it catches the exact defect. The auditor supplied the regex and had already verified zero false positives against the inline chart JavaScript and the CSS on this artifact. MAJOR: the changes box read 'the benchmark leg is unchanged at 58 against 16 August, so the fall is not the business' - my replacement text had joined to the original sentence's tail and INVERTED the meaning. A benchmark that did not move does not explain the fall, which makes MORE of it business-attributable, not less. It also replaced the flattering claim removed in round 5 with a different sentence meaning the same flattering thing, which is item 3 of my own new fix-round procedure failing on the sentence it was written for. Now reads 'NONE of the fall is attributable to it - which makes MORE of it business-attributable, not less. On the evidence available at least 2.8 of the 4 points are the business.' VERIFICATION: both fixes confirmed by READING the built file as text rather than through the pipeline, per the auditor's closing instruction - the tokens were visible in plain prose and needed no tool to see.",
"post_audit_fixes_round7": "No fixes required \u2014 the auditor verified the round-6 blocker and major closed, re-derived every build term independently, walked the spec tree to confirm the three placeholder tokens appear at exactly one path (the audit-log field that necessarily quotes them, not any rendered surface), and found nothing further. Recording the PASS because lint derives the round count from these keys and a PASS that logged nothing would leave the count and the ledger disagreeing. THE FINDING THAT OUTLIVES THIS REPORT: both round-1 BLOCKERs were caught by the AUDITOR, not by a gate \u2014 the claim census returned a single row on an 85KB report and both source-contradicting figures passed it. The clean gate state on this report must NOT be read as evidence the fabrication sweep works; it does not, and CENSUS-UNDERCOUNT is registered P0 and blocks the next run."
}