Tend.ai Alerts
Admin console. Access is by invitation.
or
Tend.ai Alerts
Checking your invitation…
Support
Connecting…Select a conversation
Read the chat and complete their profile here.
Select an item.
Sales
No codes — their PPRA register page
A company with no codes matches nothing and is told nothing. Find each one on the PPRA register, tap Codes, and screenshot the window that opens. That window does not name the company, so check you opened the right row. The codes are approved when you save them, because they are PPRA's own.
| Company | Contact | Signed up | Register check | Page on file | Window | Last touch |
|---|
Add codes from the register page
Type into the register's Company Name · open the PPRA register
Paste the screenshot here (⌘V / Ctrl+V), or choose a screenshot or PDF.
Show them how to find their own codes
Stalled — needs a person
Stage is derived from system state, never set by hand. The certificate is the gate: nothing matches, and nothing is worth paying for, until it is confirmed.
| Company | Contact | Stage | Waiting | Why | Window | Last contact |
|---|
Trials
| Company | Ends | Days | Delivered | Opened | Tapped | Empty run |
|---|
Log an activity
What was done about a company, so the next person to open the stalled list can see it was already worked.
Extend a trial
Free days are charged to the promo line at the daily rate, so what generosity costs stays visible. The annual cap is enforced when you commit — the allowance below is what is left before you do.
Choose a contractor to see the allowance.
Ad attribution
Only conversations Meta told us came from an ad appear here. Organic arrivals are absent by design rather than bucketed into a fake “direct”. Meta names the ad, not the campaign it sits in — the headline is the column to read.
| Ad id | Headline | Contacts | Certificates | Confirmed | Top-ups |
|---|
CRM
Send guard
Check before any manual send. One paid message per company per day; a customer tap re-opens a free 24-hour window, and everything inside it costs nothing.
At risk
— healthy-ish, and enough of them to bury the two bands that need a call.
| Company | Score | Band | Signals | State | Window |
|---|
Win-back
Lapsed, and worth one more contact. Built server-side since the CRM landed and never shown — the lifecycle count said how many there were and never who.
| Company | Churned | Last win-back | Eligible | Contact |
|---|
Open handoffs
Automated sends stay suppressed until these expire.
| Company | wa_id | Expires in | Last inbound |
|---|
Documents expiring
The highest-value proactive contact we have — an expired tax clearance makes a bid non-responsive.
| Company | Document | Expires | Days |
|---|
Verbatims
The one metric the product is judged on: a contractor saying, unprompted, that they heard about a tender they would otherwise have missed.
| Date | Company | Quote | Tag | By |
|---|
Source health
A source that has gone quiet looks exactly like a quiet week from the contractor's side. Retry runs the same code the scheduler does, so what you see here is what a scheduled poll would have found.
Coverage
What we are missing, not what we hold. An entity counts as covered only when an adapter has actually produced a tender from it in the last 180 days — never because a config exists. The denominator is the Annual Procurement Plan's entity column, which is complete by law rather than by our research, so these percentages mean nothing until a plan has been uploaded.
| Entity kind | Known | Yielding | Stale | Discovered | Unreachable | Not attempted | % yielding |
|---|
How much are we missing
Estimated from the overlap between channels over the last 90 days: if the press saw 40 tenders, the websites saw 30, and 12 are the same tender, the total is about 100. This is a floor, not a total — our channels are correlated, which makes the overlap larger than independence predicts and the estimate too small. A pair with too little overlap reports nothing rather than noise.
| Channels | Seen by each | Both | Held | At least | Share held |
|---|
Gaps
Entities that have never produced a tender, or produced one and went quiet. The work queue, largest first. "Unreachable" is a real answer — notice-board-only procurement exists — but it has to be recorded with what was checked.
| Entity | Kind | State | Surfaces | Last yield | Note |
|---|
Discovered pages
Facebook pages and websites the weekly searches found that no adapter reads. A website's count is the distinct notices one search saw on it. Nothing here has touched the tender table: promoting a page records the surface against an entity, and pointing an adapter at it is still a code change under review. The name suggestion is a similarity score — "Tlokweng District Council" and "Tlokweng SUB District Council" score 0.9 and are different authorities.
| Page | Found by | Notices seen | Suggested entity | Jev | Last seen |
|---|
Rulesets
Every eligibility verdict is read from the row marked active. A ruleset extracted from an OCR-degraded PDF and not yet hand-keyed suppresses hard ceiling verdicts rather than risking a wrong "not eligible".
| Instrument | Reference | Verification | Effective from | Effective to | State | Source |
|---|
Sources
| Source | Kind | Today | Errors | Last OK | Failures | On |
|---|
Ledger operations
Every entry here is permanent. Postings are append-only, so a correction is a new reversing entry. A wallet is found by the contractor's own WhatsApp number — the number they call from, not an id.
Payment methods
Controls what the top-up menu offers in WhatsApp. Takes effect within a minute — no deploy. Unpublishing never repudiates instructions already in a contractor's hand: callbacks for a withdrawn rail still credit the wallet and appear in Reconciliation so you can see it happened.
| Rail | Group | Credentials | Callbacks | Send to | Note shown to contractor | Last changed | On the menu |
|---|
What contractors see now
Settlements
Payments a contractor was told to make on a rail that has no callback. Matching one here credits the wallet exactly as the webhook would — including the bundle they chose — posts the money to that rail's cash account, and sends them the same WhatsApp receipt.
Payment proofs
What contractors sent to show they paid, read for amount, reference and transaction id, against the top-up it most likely settles. Check it against the statement or the phone before accepting.
Top-ups
Statement import
Paste one CSV row per payment. Review the plan; nothing is recorded until you apply it. A company is found by TND- reference, company id or WhatsApp number, never by name, and the transaction id makes each row impossible to record twice.
Affiliates
Partners earn a share of what their contractors actually spend — never the free days — held until each contractor has spent enough to vest.
Partners
Choose a partner to see what they have earned, who they brought and how they are paid — or add a new one.
Attribute a contractor to this partner
For partners who recruit offline. A contractor who arrived through the partner's own click-to-WhatsApp link or share link is attributed automatically and needs nothing here.
Payouts
Drafted on the 2nd for the month before. Approving posts the ledger entry that discharges what we owe; recording the payment says the money left, against a reference. Nothing here moves money — there is no outbound payment integration.
Commission plans
Editing a ladder changes what partners on it earn from tonight. It never restates what has already accrued — every commission row keeps the rate that applied the day it was earned. A partner is put on a ladder from their own pane.
Add or update a plan
Saving against an existing code replaces that plan's whole ladder. One band per
line, as referrals rate% — for example 0 10.
Weekly KPIs
Reports
Subscriptions
Reconciliation
Quarantined payments
A callback arrived with no company to credit — a wrong reference, a duplicate, a test transaction. This is real money sitting unattributed, so it is listed rather than counted. Crediting posts a normal journal entry; dismissing records why it was not owed to anyone.
Compliance nudges
Did warning them work. The window is floored at the attribution period — a renewal rate computed over a shorter one reads artificially low because most of its nudges have not had time to resolve, and a number that gets worse the more recently you measure it is worse than no number.
File a document
What the contractor sent in. Key it exactly as the certificate reads — the expiry date decides which tenders they are shown, and a digit wrong here is not a loud failure.
A CV, a qualification, an ERB certificate and an ID belong to a person. Filing one against the company alone is how a tender demanding three CVs gets satisfied by three CVs belonging to nobody in particular.
Not on the roster?
Awaiting the contractor
Filed by us and not yet confirmed. Never asked comes first: a document filed and never asked about is our failure, one asked three times is a contractor who is not answering, and those need different people.
Record a confirmation the contractor gave us directly
Recorded as an override with your name on it, not as an ordinary correction. The reason is mandatory and needs to be a sentence, because it is the only account of why this document was not verified by the contractor.
| Company | Whose | Document | Issuer | Expires | Filed | Asked |
|---|
Document bank subscriptions
Whether we are managing this client's statutory documents, which is the front door of the compilation product: Compile refuses to accept a job for a client whose documents nobody is keeping current. Until this existed, that gate read document presence instead — so a client who uploaded one certificate and pays nothing read as covered, and a paying subscriber with a lapsed tax clearance was declined for having no subscription. Those are a sales conversation and a two-day errand, and the decline reason has always had a separate value for each.
| Company | State | Started | Renews | Ended | Note | Recorded by |
|---|
Record or change a subscription
Activating supersedes whatever came before it — one live subscription per client, enforced by the schema, because a second active row is not a second bank. A lapse or a cancellation needs a note: without one it is a row nobody can act on.
Statutory obligations
CIPA annual returns and the like, across every client, soonest first. The next due date is computed from the last due date rather than from the filing date — a company that files three weeks late has not moved its next deadline three weeks later.
| Due | Company | Obligation | Every | Last filed | State |
|---|
Add or correct an obligation
The period and the anchor are inputs, not rules this console knows. A CIPA extract carries an incorporation date and not a next-due date, and giving the anchor lets the arithmetic that turns one into the other happen server-side rather than in somebody's head.
Uploads
Government Gazette
Scanned PDF. A Gazette notice auto-publishes only when every eligibility field read cleanly, both OCR engines agreed on the numbers, and segmentation was confident. Everything else lands in the review queue.
Annual Procurement Plan
xlsx or csv. Planned lines never enter the daily digest — a plan is an intention, not a notice. Each line is labelled with PPRA codes from its own words, and the labelled ones reach the quiet-week report and the weekly "Coming up" item. PDF plans go through Gazette Desk's PLAN step instead.
| Who | Kind | Status | Expires | Sent |
|---|
Console access
Everyone who currently holds a role. Withdrawing access clears the role and ends every open session immediately, rather than waiting up to an hour for their sign-in token to expire. External consultants hold accounts here, so this list is the answer to “who can see our contractors' data today”.
| Who | Role | Last signed in | Change to |
|---|
Partner API
Firms outside this company holding an API key — company secretaries and accountants who file a contractor’s statutory documents and can read them back. A key on its own reaches nothing: every contractor is authorised one at a time, on a stated basis, and can be withdrawn here.
| Firm | Status | Keys | Clients | Last call | 7 days |
|---|
Keys
A key is shown once, when it is minted, and is never recoverable — only a digest is stored. A lost key is replaced, not looked up. Revoking takes effect immediately and needs no deploy.
| Key | Environment | Scopes | Rate | Last used |
|---|
Authorised clients
Contractors this firm may act for. Each one names the basis on which the contractor authorised it. Seeing the document record and downloading the files are separate grants.
| Contractor | Files | Filing | Basis | Since | Reads (30d) |
|---|
Disclosure register
Every request this firm has made, reads included. Nothing else on this console logs a read; a third party reading a contractor’s compliance record is a disclosure, and this is where “who saw what, and when” is answered.
| When | Env | Request | Contractor | Disclosed | Status |
|---|
Audit trail
Every ledger posting, review decision, payment-rail change, access change and ruleset verification, with who did it and why. Append-only: nothing here can be edited or removed.
| When | Who | Action | Target | Why | Change |
|---|