Clubs
| Club | Seasons | Apps | Goals | Assists |
|---|---|---|---|---|
| Junior | 2017/18 – 2026/27 | 184 | 27 | 18 |
| Portland Timbers | 2020/21 – 2024/25 | 116 | 18 | 14 |
| Colombia | 2014 – 2022 | 16 | 1 | 1 |
| Atlético-MG | 2018/19 – 2019/20 | 68 | 10 | 8 |
| Monterrey | 2014/15 – 2016/17 | 61 | 12 | 6 |
| Dorados | 2015/16 | 16 | 1 | 4 |
| Atletico Nacional | 2015/16 | 26 | 5 | — |
| Deportes Tolima | 2010/11 – 2014/15 | 163 | 39 | — |
Transfers
| Date | From | To | Type |
|---|---|---|---|
| 1 Jan 2024 | Portland Timbers | Junior | — |
| 10 Jan 2020 | Atletico-MG | Portland Timbers | — |
| 14 Jun 2018 | Junior | Atletico-MG | € 5.1M |
| 1 Jul 2017 | Monterrey | Junior | — |
| 1 Jul 2016 | Dorados | Monterrey | — |
| 1 Jan 2016 | Monterrey | Dorados | Loan |
| 1 Jul 2015 | Monterrey | Atletico Nacional | Loan |
| 1 Jan 2015 | Deportes Tolima | Monterrey | — |
Season by season
| Season | Competition | Club | Apps | Starts | Min | Goals | Assists | Yellow | Red | Rating |
|---|---|---|---|---|---|---|---|---|---|---|
| 2026/27 | CONMEBOL Libertadores | Junior | 6 | 4 | 334 | 0 | 0 | 1 | 0 | 6.77 |
| 2026/27 | Primera A | Junior | 21 | 14 | 1158 | 0 | 1 | 0 | 0 | 6.77 |
| 2025/26 | CONMEBOL Sudamericana | Junior | 1 | 1 | 85 | 0 | 0 | 0 | 0 | 7.20 |
| 2025/26 | Primera A | Junior | 52 | 48 | 3965 | 3 | 8 | 2 | 0 | 6.87 |
| 2024/25 | Primera A | Junior | 43 | 40 | 3246 | 6 | 2 | 2 | 0 | 7.15 |
| 2024/25 | Copa Colombia | Junior | 2 | 1 | 152 | 0 | — | 0 | 0 | — |
| 2024/25 | CONMEBOL Libertadores | Junior | 7 | 6 | 456 | 0 | 0 | 0 | 0 | 6.87 |
| 2023/24 | Major League Soccer | Portland Timbers | 17 | 9 | 742 | 1 | 3 | 0 | 0 | 6.71 |
| 2023/24 | Leagues Cup | Portland Timbers | 2 | 1 | 86 | 0 | — | 0 | 0 | 7.30 |
| 2022/23 | Major League Soccer | Portland Timbers | 34 | 33 | 2781 | 4 | 3 | 5 | 0 | 6.91 |
| 2022/23 | US Open Cup | Portland Timbers | 1 | 0 | 24 | 0 | — | 0 | 0 | — |
| 2022 | World Cup - Qualification South America | Colombia | 1 | 0 | 17 | 0 | — | 0 | 0 | 6.70 |
| 2022 | Friendlies | Colombia | 1 | 1 | 90 | 0 | — | 0 | 0 | — |
| 2021/22 | Major League Soccer | Portland Timbers | 34 | 33 | 2724 | 6 | 5 | 1 | 0 | 7.22 |
| 2021/22 | CONCACAF Champions League | Portland Timbers | 4 | 4 | 329 | 3 | — | 0 | 0 | — |
| 2021 | Copa America | Colombia | 4 | 0 | 131 | 0 | — | 0 | 0 | — |
| 2020/21 | Major League Soccer | Portland Timbers | 24 | 15 | 1439 | 4 | 3 | 0 | 0 | 6.96 |
| 2019/20 | Mineiro 1 | Atlético-MG | 8 | 6 | 581 | 1 | — | 0 | 0 | — |
| 2019/20 | Serie A | Atlético-MG | 18 | 17 | 1359 | 3 | 1 | 0 | 0 | 7.05 |
| 2019/20 | Copa Do Brasil | Atlético-MG | 4 | 4 | 360 | 2 | — | 0 | 0 | 6.90 |
| 2019/20 | CONMEBOL Sudamericana | Atlético-MG | 8 | 7 | 646 | 3 | — | 1 | 0 | 7.09 |
| 2019/20 | CONMEBOL Libertadores | Atlético-MG | 8 | 4 | 410 | 0 | — | 0 | 0 | 6.64 |
| 2019 | Friendlies | Colombia | 1 | 0 | 8 | 0 | — | 0 | 0 | — |
| 2018/19 | Serie A | Atlético-MG | 22 | 22 | 1853 | 1 | 7 | 1 | 0 | 6.95 |
| 2018/19 | Primera A | Junior | 11 | 11 | 983 | 3 | 1 | 1 | 0 | 7.42 |
| 2018/19 | CONMEBOL Libertadores | Junior | 10 | 10 | 856 | 2 | 3 | 1 | 0 | 7.55 |
| 2018 | World Cup - Qualification South America | Colombia | 4 | 1 | 144 | 0 | 1 | 0 | 0 | 6.92 |
| 2018 | Friendlies | Colombia | 3 | 0 | 42 | 1 | — | 0 | 0 | — |
| 2017/18 | Primera A | Junior | 18 | 14 | 1345 | 11 | 3 | 2 | 0 | 7.36 |
| 2017/18 | Copa Colombia | Junior | 5 | 4 | 385 | 0 | — | 0 | 0 | — |
| 2017/18 | CONMEBOL Sudamericana | Junior | 8 | 8 | 710 | 2 | — | 0 | 0 | 7.17 |
| 2016/17 | Liga MX | Monterrey | 34 | 22 | 2029 | 3 | 6 | 0 | 0 | 6.92 |
| 2016/17 | Copa MX | Monterrey | 6 | 4 | 417 | 4 | — | 0 | 0 | — |
| 2016/17 | CONCACAF Champions League | Monterrey | 3 | 3 | 270 | 1 | — | 0 | 0 | — |
| 2015/16 | Liga MX | Dorados | 16 | 16 | 1440 | 1 | 4 | 0 | 0 | 6.94 |
| 2015/16 | Primera A | Atletico Nacional | 24 | 24 | 2115 | 5 | — | 1 | 0 | — |
| 2015/16 | Copa Colombia | Atletico Nacional | 2 | 0 | 53 | 0 | — | 0 | 0 | — |
| 2014/15 | Liga MX | Monterrey | 11 | 4 | 439 | 1 | — | 0 | 0 | — |
| 2014/15 | Primera A | Deportes Tolima | 35 | 35 | 3141 | 11 | — | 1 | 1 | — |
| 2014/15 | Copa MX | Monterrey | 7 | 6 | 509 | 3 | — | 0 | 0 | — |
| 2014/15 | Copa Colombia | Deportes Tolima | 11 | 10 | 805 | 5 | — | 1 | 0 | — |
| 2014 | Friendlies | Colombia | 2 | 0 | 35 | 0 | — | 0 | 0 | — |
| 2013/14 | Primera A | Deportes Tolima | 41 | 41 | 3682 | 10 | — | 4 | 0 | — |
| 2013/14 | Copa Colombia | Deportes Tolima | 4 | 3 | 299 | 1 | — | 0 | 0 | — |
| 2013/14 | CONMEBOL Libertadores | Deportes Tolima | 8 | 8 | 713 | 1 | — | 0 | 0 | — |
| 2012/13 | Primera A | Deportes Tolima | 34 | 25 | 2179 | 7 | — | 4 | 0 | — |
| 2012/13 | Copa Colombia | Deportes Tolima | 8 | 5 | 511 | 4 | — | 0 | 0 | — |
| 2012/13 | CONMEBOL Sudamericana | Deportes Tolima | 3 | 2 | 192 | 0 | — | 0 | 0 | — |
| 2011/12 | Primera A | Deportes Tolima | 6 | 0 | 155 | 0 | — | 0 | 0 | — |
| 2011/12 | Copa Colombia | Deportes Tolima | 10 | 3 | 413 | 0 | — | 0 | 0 | — |
| 2010/11 | Primera A | Deportes Tolima | 3 | 0 | 48 | 0 | — | 0 | 0 | — |
Availability history
| Reason | From | Until | Days |
|---|---|---|---|
| International duty | 6 Sept 2018 | 14 Sept 2018 | 8 |
| Muscle Injury | 28 Feb 2023 | 27 Apr 2023 | 58 |
| Injury | 21 Sept 2023 | 29 Sept 2023 | 8 |
| Injury | 30 Sept 2019 | 29 Nov 2019 | 60 |
| Injury | 28 May 2023 | 14 Jul 2023 | 47 |
| Thigh Injury | 2 Aug 2020 | 1 Sept 2020 | 30 |
Trophies
| Competition | Season | Place |
|---|---|---|
| Primera A (Colombia) | 2015 | Winner |
| Primera A (Colombia) | 2010 | 2nd Place |
| Copa Colombia (Colombia) | 2017 | Winner |
| Copa Colombia (Colombia) | 2014 | Winner |
| Mineiro 1 (Brazil) | 2019 | 2nd Place |
| MLS (USA) | 2021 | 2nd Place |
| Superliga (Colombia) | 2024 | 2nd Place |
