A fuller application record: why it ended, who referred you, which agency, and merging duplicate companies and contacts #239

Open
opened 2026-09-15 21:23:33 +00:00 by tiagoagueda · 0 comments
Owner

Four things a serious job search wants to know that Postulo cannot record today. Found in the 2026-09-15 code audit.

1. Why an application ended

  • Listings keep a discard reason (jobs/models.py:544-549); a rejection or a withdrawal has none.
  • The funnel shows where applications stop, never why.

Proposal:

  • An optional reason when moving to Rejected, Withdrawn or Ghosted: pay, location, not a match, filled internally, my own choice, other (with a note). It is stored on the status event, not as a loose field, so the log stays the truth.
  • The last stage reached is read from the log, not typed.
  • A widget, Where and why applications end.

2. Who referred you, and through which agency

  • The Referral and Recruiter channels exist (applications/models.py:89-90), but nothing records who.
  • contact means the main contact (:216-223).
  • Agencies are deliberately not a company kind (jobs/models.py:147-156), so a search run mostly through two agencies cannot be compared by agency.

Proposal:

  • An optional referred by contact and an optional through agency company on an application, with the posting's company staying the employer.
  • The sources figures in Insights gain by referrer and by agency.

3. Duplicate companies and contacts

  • Companies match only on a case-insensitive exact name (jobs/services.py:196), so "Acme", "Acme Ltd" and "ACME GmbH" become three employers.
  • Merging exists for industries only (jobs/forms.py:356-389), and ContactForm has no duplicate check at all.

Proposal:

  • A possible duplicates notice based on:
    • the name with legal suffixes removed (Ltd, GmbH, S.A., Lda…);
    • the same website domain;
    • the same identifier (see #211);
    • for contacts, the same email address.
  • A Merge action that moves postings, contacts, identifiers, departments and logos into the kept record. It shows what will move before doing it, writes a timeline entry, and silently discards nothing.
Four things a serious job search wants to know that Postulo cannot record today. Found in the 2026-09-15 code audit. ## 1. Why an application ended - Listings keep a discard reason (`jobs/models.py:544-549`); a rejection or a withdrawal has none. - The funnel shows where applications stop, never why. **Proposal:** - An optional reason when moving to *Rejected*, *Withdrawn* or *Ghosted*: pay, location, not a match, filled internally, my own choice, other (with a note). It is stored on the status event, not as a loose field, so the log stays the truth. - The last stage reached is read from the log, not typed. - A widget, *Where and why applications end*. ## 2. Who referred you, and through which agency - The *Referral* and *Recruiter* channels exist (`applications/models.py:89-90`), but nothing records who. - `contact` means the main contact (`:216-223`). - Agencies are deliberately not a company kind (`jobs/models.py:147-156`), so a search run mostly through two agencies cannot be compared by agency. **Proposal:** - An optional *referred by* contact and an optional *through agency* company on an application, with the posting's company staying the employer. - The sources figures in Insights gain *by referrer* and *by agency*. ## 3. Duplicate companies and contacts - Companies match only on a case-insensitive exact name (`jobs/services.py:196`), so "Acme", "Acme Ltd" and "ACME GmbH" become three employers. - Merging exists for industries only (`jobs/forms.py:356-389`), and `ContactForm` has no duplicate check at all. **Proposal:** - A *possible duplicates* notice based on: - the name with legal suffixes removed (Ltd, GmbH, S.A., Lda…); - the same website domain; - the same identifier (see #211); - for contacts, the same email address. - A *Merge* action that moves postings, contacts, identifiers, departments and logos into the kept record. It shows what will move before doing it, writes a timeline entry, and silently discards nothing.
tiagoagueda added this to the 0.5.0 milestone 2026-09-15 21:33:32 +00:00
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
Postulo/postulo#239
No description provided.