diff --git a/server/src/v1/team.ts b/server/src/v1/team.ts
index a12609eb7adbbcddafef31b9ec3a00a43630a9cb..46b54d3ae9c11fe30665a5165199447bfed91276 100644
--- a/server/src/v1/team.ts
+++ b/server/src/v1/team.ts
@@ -397,6 +397,99 @@ team.get('/:uuid/work', async (req, res) => {
     }
 });
 
+team.get('/:uuid/activity', async (req, res) => {
+    try {
+        const id = req.params.uuid;
+        if (validate(id)) {
+            const since = (req.query.since ?? 0) as number;
+            const to = (req.query.to ?? Date.now()) as number;
+            const activity = await database({ ut: 'team_members' })
+                .innerJoin('team_members', 'ut.team_id', 'team_members.team_id')
+                .innerJoin('workhours', 'team_members.user_id', 'workhours.user_id')
+                .select({
+                    day: database.raw('Date(`workhours`.`started` / 1000, \'unixepoch\')'),
+                })
+                .sum({ time: database.raw('`workhours`.`finished` - `workhours`.`started`') })
+                .where({
+                    'ut.user_id': req.body.token.id,
+                    'ut.team_id': id,
+                })
+                .andWhereNot({ 'workhours.finished': null })
+                .andWhere('workhours.started', '>=', since)
+                .andWhere('workhours.started', '<=', to)
+                .groupBy('day');
+            res.status(200).json({
+                status: 'success',
+                activity: activity,
+            });
+        } else {
+            res.status(400).json({
+                status: 'error',
+                message: 'malformed uuid',
+            });
+        }
+    } catch (e) {
+        res.status(400).json({
+            status: 'error',
+            message: 'failed get activity',
+        });
+    }
+});
+
+team.get('/:uuid/completion', async (req, res) => {
+    try {
+        const id = req.params.uuid;
+        if (validate(id)) {
+            const since = (req.query.since ?? 0) as number;
+            const to = (req.query.to ?? Date.now()) as number;
+            const completion = await database(
+                    database('team_members')
+                        .innerJoin('team_projects', 'team_members.team_id', 'team_projects.team_id')
+                        .innerJoin('tasks', 'team_projects.project_id', 'tasks.project_id')
+                        .leftJoin('task_requirements', 'tasks.id', 'task_requirements.task_id')
+                        .leftJoin('workhours', 'tasks.id', 'workhours.task_id')
+                        .select({
+                            id: 'tasks.id',
+                            status: database.raw(
+                                'Case When `tasks`.`status` = \'open\' '
+                                + 'And Sum(`task_requirements`.`time` * 60 * 1000) < Sum(`workhours`.`finished` - `workhours`.`started`) '
+                                + 'Then \'overdue\' Else `tasks`.`status` End'),
+                        })
+                        .where({
+                            'team_members.user_id': req.body.token.id,
+                            'team_members.team_id': id,
+                        })
+                        .andWhere('tasks.edited', '>=', since)
+                        .andWhere('tasks.created', '<=', to)
+                        .groupBy('tasks.id')
+                )
+                .select({
+                    status: 'status',
+                })
+                .count({ count: 'id' })
+                .groupBy('status') as any[];
+            res.status(200).json({
+                status: 'success',
+                completion: completion.reduce((object, { status, count }) => ({
+                    ...object,
+                    [status]: count,
+                }), {}),
+            });
+        } else {
+            res.status(400).json({
+                status: 'error',
+                message: 'malformed uuid',
+            });
+        }
+    } catch (e) {
+        console.error(e);
+        res.status(400).json({
+            status: 'error',
+            message: 'failed get completion',
+        });
+    }
+});
+
 interface AddRoleBody {
     name: string;
     token: Token;