BFBambooForge Labs

Chatter Tools: Search, Pin & Bulk Messages

Search every chatter at once, pin what matters, post a template onto hundreds of records, resend failed notifications and purge dead rows.

Buy on the Odoo Apps StoreOpen the live demoDiscuss€174Community & Enterprise

Available for Odoo 16.0, Odoo 17.0, Odoo 18.0, Odoo 19.0. Technical name bambooforge_chatter_tools.

Odoo 16.0Odoo 17.0Odoo 18.0Odoo 19.0
Full walkthrough on a live Odoo 19.0 database, with subtitles. It ends with what this app deliberately does not do.

Chatter Tools: Search, Pin & Bulk Messages

The chatter is Odoo's best idea and its least maintained screen. Five things it cannot do, and every desk needs.

Search every chatter at once

Settings › Chatter Tools › Search the Chatter. Every message on every record: by text, by author, by model, by type, by month, grouped however you like. The chatter itself can only be read one record at a time, which is no use at all when somebody asks "who told the customer that, and when?".

Two filters do most of the work. Typed by a person keeps comment and email — what somebody wrote and what arrived — and gets the twenty million system rows out of the way. Written by the system does the opposite, and is how you look at what a cleanup rule is about to throw away before you let it.

Templates

The paragraph somebody types forty times a week — "rang them about the delay", "credit checked, on hold" — written once.

Placeholders are the ones a mail template uses. {{ object.name }} works in the rich-text box, because QWeb interpolates {{ }} in attributes but never in a text node — which is why a mail template writes {{ }} in the subject and <t t-out=""/> in the body — and the template is converted before rendering, exactly the way core converts it for its own preview. A t-out written by hand keeps working.

A template says whether it posts an internal note (the default) or a message to the followers (which sends email). It can be limited to a role, and to a company.

Posting one at a time is the Post from template entry in the Action menu of that model's list. Five templates on sale.order put one line in that menu, not five: the entry belongs to the model.

Posting on two hundred records at once is the same entry with two hundred rows ticked. The wizard renders the preview against the first record you selected, by name — a placeholder typo shows up there rather than in two hundred chatters where nobody can take it back — and says, in as many words, how many emails a message would send. A template that does not render posts nothing at all rather than half a sentence, and one record that cannot be posted to does not lose the other hundred and ninety-nine.

Each template counts how often it has been used. A template nobody uses is a template to delete.

Pinning

One message on a record that the next person has to read before they do anything. One click in the message's hover menu; the pin records who did it and when, and pinned messages are never deleted by a cleanup rule.

Odoo 18's chatter does not take extra actions in that menu, so pinning there is done from Search the Chatter instead. Everything else in this module is identical on all four series.

Resending what failed

A notification in exception is invisible: the record says the customer was told, and the customer was not. Settings › Chatter Tools › Failed Notifications lists them with the reason and the date, and puts the ones you tick back in the queue.

A notification on a record you may not write to is left alone whatever is ticked, and the wizard says how many it skipped. Sending somebody's mail again is writing on their record.

Throwing the rest away

Every stage change and every tracked field writes a mail_message row. Nobody reads the ones from 2019 and everybody pays for them in backup time, in restore time and in the index.

A cleanup rule says: on this model, messages of this kind, older than this many months. The kinds are

  • Notifications only — stage moves, tracking, "created by";

  • Everything the system wrote — the above plus automated comments and user notifications;

  • Empty — a notification with no body and no file, which is the most common row of all.

Three things survive every rule, whatever it is set to. That is not three checkboxes; it is the shape of the rule, and it is decided in one method so there is one place to read and one place to argue with.

  1. A message somebody typed. The kinds are an allow-list of one message type, notification, so comment and email are outside every rule — and so is a message type invented by a future version, which is kept rather than guessed at.

  2. A message whose body was ever visible outside the company. This is not the same as "somebody typed it", and it is the wall that matters most. The copy of the quotation the customer was sent, the delivery confirmation, the portal invite — core writes all of them into the chatter through message_post_with_source, as message_type='notification' with the customer-facing mail.mt_comment subtype. A rule that trusted the message type alone would throw away the only record of what the customer was promised, and the tracking values and delivery receipts would cascade away with it.

  3. A message an email actually went out from. If somebody was sent it, it is evidence of what they were told.

A tracked-field note has no body at all and falls through all three, which is the point: those are the rows there are twenty million of.

Files, pinned messages and starred messages are kept unless you say otherwise — and if you say the files may go, the files really go, rather than the row alone while the blob stays in the filestore.

Show me what would go counts the rows and opens exactly those rows, by id, so the list and the number are the same thing. The nightly job ships switched off: a cleanup rule that starts deleting the night it is installed is an incident, not a feature. Turn it on in Scheduled Actions once a preview has told you the truth. It runs oldest rule first with a budget per night, in batches, and one rule that fails does not stop the others.

Who can do what

Every internal user is a Chatter Tools user: posts from a template, pins a message, sends a failed notification again — always on records they may already write to. A manager writes the templates everybody uses and the cleanup rules that throw chatter away.

What it needs

mail only. Community. No Enterprise module is required, and none is used.

Screens

Cleanup - bambooforge_chatter_tools
Cleanup
Post - bambooforge_chatter_tools
Post
Resend - bambooforge_chatter_tools
Resend
Search - bambooforge_chatter_tools
Search
Template - bambooforge_chatter_tools
Template