Member reports
What the member report tells a business about its listings, where members read it (portal, member API, PDF, monthly digest), how to configure the digest, the peer comparison and the improvement prompts, scheduled organisation reports for a board, and the report commands.
engine-dmo
The member report shows one organisation its own numbers for a period: how often its listings were seen, what visitors did next, the enquiries it received, where its visitors came from, how it compares with similar businesses, what people searched for, and what it could do to its listing to do better. It is computed once and served in four places, so they never disagree:
| Where | How |
|---|---|
| The portal | The report screen, /organisations/{org}/report, for people whose role grants report.view |
| The member API | GET /api/member/v1/organisations/{id}/report |
| A PDF | engine-dmo analytics report --format pdf |
| The monthly digest | An email to the organisation’s contacts, scheduled from config/analytics/reports.yaml |
The report needs analytics to be on (analytics.enabled: true in engine.yaml, see Analytics) and listings linked to their organisations.
What is in it
| Section | Contents |
|---|---|
| Seen | listing_impression (appeared in lists), widget_impression (seen on a partner’s page through a widget), listing_view (the listing’s own page) |
| Referrals | website_click, phone_reveal, directions_click, booking_click, email_click, social_click, each with its total |
| Enquiries | enquiry_submitted: enquiry forms that reached the business. Shown on its own, never added to referrals. |
| Paid placements | offer_impression and promotion_impression, counted separately so they never inflate the listing’s figures |
| Conversion | How many of the people who saw the listing went on to act, in percentage points, and referrals per day |
| Sources | Where visitors came from: search engines, direct, other websites, social media, within the site, campaigns, partner pages |
| Twelve months | A month by month series for the chart |
| Peer comparison | The organisation against the median of similar businesses on the site; see below |
| Search terms | Terms that brought people to the listing, and searches near it that found nothing |
| Improvement prompts | “Make your listing work harder”: what to change, and the evidence for it |
| Sites | For an organisation listed on several sites, its figures on each and their total |
| Owner activity | What the organisation’s own people did on its own listings while signed in, excluded from every figure above and shown so the exclusion is visible |
| Methodology | What is counted, what is excluded and why, how the comparison is protected, and the rule set the figures were rolled up under |
Each figure carries its change on the same period a year earlier and a direction (up, down or level). The events are recorded by the public pages; see Counting what visitors do.
The monthly digest
The digest is one email per organisation per site, sent to every current contact who may edit the listing and has not opted out (a link in the email stops it). It is declared as a member report:
reports:
- key: member-monthly
name: { en-GB: Your monthly performance }
audience: member
schedule: "0 8 2 * *"
format: [email]
range: previous_month
compare: previous_year
tiers: { min: bronze } and switched on in the portal’s file:
portal:
report:
email_digest:
enabled: true
report: member-monthly
skip_when_no_data: true The digest uses the report’s schedule, range and tiers, and needs email among its formats. It sends to each organisation with an active membership in the report’s tiers. A period with no impressions and no interactions is skipped when skip_when_no_data is on. A run is recorded per site and per report, so a restart or a second scheduler tick never sends twice, and a contact whose address is suppressed leaves an entry on the organisation’s timeline instead.
engine-dmo analytics digest queues the digest for the current period now, whatever the schedule says; --run also works through the mail queue in the command rather than leaving it to the server.
Report definitions
config/analytics/reports.yaml holds every scheduled report. engine-dmo config schema --file reports prints its schema.
| Key | Required | Default | Meaning |
|---|---|---|---|
key | yes | Unique handle | |
id | written by check --fix | The stable id (rep_) | |
name | no | The report’s name per locale | |
audience | yes | member (the digest) or organisation (a report for a board or funder) | |
schedule | yes | A five-field cron expression, evaluated in UTC. The period it reports on is cut in the site’s reporting timezone, but the send time is not: 0 8 2 * * sends at 08:00 UTC, which is 09:00 in London during British Summer Time. Write the hour in UTC for the season that matters most. | |
format | organisation reports | One or a list of email, pdf, csv, json | |
range | no | previous_month; this_financial_year for an organisation report with metrics | previous_month, previous_quarter, previous_year, previous_financial_year, this_month, this_quarter, this_financial_year |
compare | no | previous_year | previous_year, previous_period or none |
tiers | no | every tier | Member reports: the tiers whose organisations receive it. none is not allowed. |
to | organisation reports | The recipients, always a ${VAR} interpolation of a comma separated list, never addresses written in the file | |
dashboard | organisation reports, or metrics | A dashboard declared in config/analytics/dashboards.yaml | |
metrics | organisation reports, or dashboard | KPI rows: key (a metric), optional kind (measured or entered), label per locale, target for the range (a percentage for a rate) | |
sites | no | every site | Organisation reports: the sites it runs for, one run each |
Organisation reports
An organisation report sends the destination’s own figures against targets to the recipients the environment names, for a board or a funder:
- key: board-quarterly
name: { en-GB: Quarterly board report }
audience: organisation
schedule: "0 9 5 1,4,7,10 *"
format: [email, pdf]
range: previous_quarter
compare: previous_year
to: ${BOARD_REPORT_RECIPIENTS}
metrics:
- { key: visits, target: 120000 }
- { key: member_referrals_total, target: 9000 } BOARD_REPORT_RECIPIENTS="board@example.org,chair@example.org" A metric is one of the engine’s measured metrics (such as visits, page_views, listing_views, enquiries, member_referrals_total, searches, members_active) or a figure staff enter, declared in config/analytics/dashboards.yaml. The full list of metric keys is in Analytics; no command prints it. Staff see each run under the admin’s Reports screen in Insight, and engine-dmo analytics report-run --report board-quarterly [--site <site>] [--run] queues one for its current period now.
Report settings
config/portal/portal.yaml holds the comparison and prompt rules, install-wide.
| Key | Default | Meaning |
|---|---|---|
portal.report.peer_comparison | true | Compare the organisation with similar businesses |
portal.report.peer_min_cohort | 5 | The smallest cohort compared. Below the banding threshold the comparison is shown as a band rather than a median, so no single business’s figures can be recovered. |
portal.report.improvement_prompts.enabled | true | Show prompts |
portal.report.improvement_prompts.max_shown | 4 | The most prompts shown |
portal.report.improvement_prompts.min_impressions | 100 | Impressions below which a prompt carries no claim |
portal.report.improvement_prompts.uplift_min_cohort | 20 | The smallest group of listings an uplift is measured over |
portal.report.improvement_prompts.uplift_min_percent | 10 | The smallest uplift worth claiming |
portal.report.improvement_prompts.filter_min_searches | 50 | Searches needed before a filter’s share is quoted |
portal.report.improvement_prompts.rules | see below | The rules, merged over the defaults |
portal.report.email_digest.enabled | true | The monthly digest |
portal.report.email_digest.report | member-monthly | The member report in reports.yaml the digest sends |
portal.report.email_digest.skip_when_no_data | true | Skip an organisation with nothing to report |
Improvement prompts
Each rule looks at the organisation’s listing and, where the site’s own data supports it, says how much a change is worth. A prompt for a field the member’s tier may not edit is not shown, and a rule with no field on the listing type is not shown.
| Rule | Default | Looks at |
|---|---|---|
photos | { min: 4, target: 8 } | Every image field of the listing, unless field/fields name them |
summary_words | { min: 40 } | The summary’s length |
description_words | { min: 150 } | The first rich text field, unless named |
opening_hours | { required: true, filter: open_now } | The first opening hours field, unless named; evidence from how often searches filter by open_now |
accessibility | { required: true } | Only the fields you name (fields: [accessibility, accessibilityNotes]); filter: names a search filter for evidence |
website | { required: true } | Only the field you name (field: website) |
booking_link | {} | Only the field you name; tiers: limits it to the tiers that may set a booking link (every tier but none when absent) |
stale_after | 180d | How long since the listing was last updated |
zero_result_terms | { min_searches: 10, radius_km: 10 } | Searches near the listing that found nothing |
portal:
report:
improvement_prompts:
enabled: true
max_shown: 4
rules:
accessibility: { fields: [accessibility, accessibilityNotes] }
website: { field: website }
booking_link: { field: bookingUrl, tiers: { min: silver } } The fields named here (accessibility, accessibilityNotes, bookingUrl) must be fields of your listing type: check reports a named field the type does not have, and a tier the tier list does not declare. A rule you leave out of rules: keeps its default.
Commands
| Command | What it does |
|---|---|
engine-dmo analytics report --organisation <id> [--site] [--from] [--to] [--format text|html|pdf] [--out <file>] | One organisation’s report. Dates default to the last year. Text and HTML print to the terminal; a PDF goes to report.pdf unless --out names a file (- is standard output). |
engine-dmo analytics digest [--run] | Queue the member digest for the current period |
engine-dmo analytics report-run --report <key> [--site] [--run] | Queue an organisation report for its current period |
All three need the database. The PDF is printed by a browser the engine drives (analytics.pdf.renderer in engine.yaml); engine-dmo version --require pdf exits 1 when this build cannot produce one.
In the portal’s templates
The report screen renders report.html in the portal’s template directory, and a custom screen can read the report with a report data source (figures: { report: { range: last_month } }, see Portal screens and actions). Copy report.html with engine-dmo portal scaffold --site <site> to restyle it.
Promotions
How to declare promotion slots on a site (across the site or per landing page), how members request them and staff approve them, how promoted() and promotionLabel() render paid placements with the label the law requires, and every slot setting, status and check.
Affiliates
How a site earns as an affiliate publisher: programmes with networks or direct deals, tracked links under /go/, the disclosure templates print, importing conversions by CSV, network connectors or a signed postback, the postback's signature and body, and the affiliate commands.