Skip to content

Recipe: a weekly signup report on Telegram

Every Monday at 8:00, n8n reads your Newsletter signups data table, counts the people who signed up in the last 7 days, Claude writes a 3-line summary, and you get it on Telegram.

Time needed 20 minutes
You need An n8n agent with your Claude key (Sign in and build your first AI agent), your Telegram bot saved in n8n (step 1 of the contact form recipe), your numeric Telegram ID, and a data table with a datetime column for the signup date (the signup form recipe makes one)
Result A Telegram message every Monday such as This week we had 3 new newsletter signups. They are Rita, Ana, and Bruno. ...

This is the finished workflow:

The finished workflow

Every Monday at 8:00 (Schedule Trigger) → Signups of the last 7 days (Data table) reads the new rows → Collect the names (Aggregate) puts them in one list → Basic LLM Chain (with Anthropic Chat Model) writes the 3 lines → Send a text message sends them to Telegram.

1. Run every Monday at 8:00

  1. Create a new workflow and name it, for example Weekly signup report.
  2. Click Add first step and choose On a schedule. Rename the step Every Monday at 8:00 (click its name at the top of the panel).
  3. Set it:

    The Schedule Trigger step

    1. Trigger Interval: Weeks.
    2. Weeks Between Triggers: 1.
    3. Trigger on Weekdays: Monday.
    4. Trigger at Hour: 8am (and Trigger at Minute 0).

The hour follows the workflow's time zone (check it).

2. Read the signups of the last 7 days

  1. Close the panel. Click the + at the right of the trigger, type data table, press Enter and choose Get row(s). Rename it Signups of the last 7 days.
  2. Set it:

    The Get row(s) step after a test

    1. Data table: From list → Newsletter signups.
    2. Conditions → Add Condition: Column signup_date (date), Condition Greater Than, Value: click Expression and paste {{ $now.minus(7, 'days') }}. Under the box n8n shows the date and time 7 days ago.
    3. Return All: on.
    4. After a test, the OUTPUT lists the rows newer than that date: in our test, 3 items.
  3. In the Settings tab of the same step, switch Always Output Data on. In a week with no signups, the workflow then still goes on and tells you so, instead of stopping silently.

Our table had 5 rows. The two older ones (signed up on 20 October and 1 November) were correctly left out; the 3 rows from 10 and 15 November were returned.

3. Put the names in one list

The AI step should get all the names at once and write one message, not one per person.

  1. Add an Aggregate step after Signups of the last 7 days (the +, search Aggregate). Rename it Collect the names.
  2. Set it:

    The Aggregate step

    1. Aggregate: Individual Fields.
    2. Input Field Name: name (the column of your table).
    3. The OUTPUT is 1 item with a list name: Rita Gomes, Ana Costa, Bruno Lima.

4. Let Claude write the 3 lines

  1. Add a Basic LLM Chain step after Collect the names.
  2. Set it:

    The Basic LLM Chain step

    1. Source for Prompt (User Message): Define below.
    2. Prompt (User Message): click Expression and paste:

      You write a short weekly report for the owner of a small shop.
      In the last 7 days, {{ ($json.name || []).length }} people joined our newsletter: {{ ($json.name || []).join(', ') || 'nobody' }}.
      
      Write exactly 3 short lines in plain English:
      1. How many new signups there were this week.
      2. Who they are (first names are fine).
      3. One practical idea to welcome them.
      No title, no markdown, no emoji.
      

      n8n counts the names (.length) and writes them one after the other (.join(', ')), so Claude gets the exact number and does not have to count. || [] and || 'nobody' handle a week without signups.

    3. After a test, the OUTPUT shows the text Claude wrote.

  3. At the bottom of the panel, click the + under Model and choose Anthropic Chat Model (your Anthropic account credential is picked by itself).

5. Send it to Telegram

  1. Add a Telegram step after Basic LLM Chain: search Telegram and choose Send a text message.
  2. Set it:

    The Telegram step after a test

    1. Chat ID: your numeric Telegram ID. (Credential: your Telegram bot.)
    2. Text: click Expression and paste:

      Weekly newsletter report
      
      {{ $json.text }}
      
    3. Additional Fields → Add Field → Append n8n Attribution, switch off.

    4. After a test, the OUTPUT shows ok true and the text that was sent.

6. Test it now

You do not have to wait until Monday. Close the panel and click Execute workflow at the bottom of the canvas: the whole workflow runs once, now. All steps get a green tick, and the message arrives on Telegram. Ours said:

Weekly newsletter report

This week we had 3 new newsletter signups. They are Rita, Ana, and Bruno. Consider sending them a friendly welcome email with a small discount on their next purchase.

We also tested a week with no signups (we changed the condition for a moment so that no row matched). Claude then wrote This week we had 0 new newsletter signups. and suggested a way to get more.

7. Publish it

Click Publish at the top right, then Publish in the window. From now on the report arrives every Monday at 8:00. To stop it, click the arrow next to Published and choose Unpublish (details).

Note

For this guide we tested with Execute workflow only and did not leave the workflow published, so we did not wait for a real Monday run. How the schedule itself behaves is shown in Run a workflow on a schedule.

Check that it worked

  • The test with Execute workflow sent the message, and the Telegram step shows ok true.
  • The number in the message matches your table: count the rows whose signup_date is in the last 7 days.
  • The workflow says Published, and after Monday 8:00 Executions shows a run without the flask icon.

Make it yours

  • Every day or every month: change Trigger Interval, and change minus(7, 'days') to minus(1, 'days') or minus(1, 'months').
  • Your language: add Answer in European Portuguese to the prompt.
  • Also the total: add a second Get row(s) step without a condition, or open the table: the Total at the bottom is the number of rows.

Common problems

The count is 0 but people did sign up

Check that signup_date is filled in for the new rows (the signup form recipe uses {{ $now }}) and that the Column in the condition is signup_date (date), the Condition Greater Than.

The workflow stops after the Data table step in a quiet week

Switch Always Output Data on in its Settings tab (step 2).

The message has stars or a title

Keep No title, no markdown, no emoji in the prompt.

Telegram says: Bad Request: chat not found

The Chat ID is wrong, or you never pressed Start in your bot. See the contact form recipe.

Next steps