Classifieds: buy, sell & trade with offers, tracked deals and seller reputation

Classifieds: buy, sell & trade with offers, tracked deals and seller reputation [Paid] 1.7.1

No permission to buy (€49.00)
And sorry, I think this may be a bug. Not all members are allowed to view the Classified (usergroup based). Those who can't view the Classifieds can't search the forum at all. Our techie person asked me to give you this in case it is helpful:
Thank you for both reports, and for the stack trace in particular. Both are bugs on my side, and both are fixed in 1.0.9, which is up now.

The search error

This one was serious and you were right to flag it: any member who could not view the classifieds could not search the forum at all, whatever they were searching for.

The cause: the add-on tells XenForo which content a member may see through a search handler. Mine returned false when the member lacked the view permission, where XenForo expects an array, and it passes that value straight into a typed method. Hence the TypeError, thrown before any search could run.

It now returns a constraint that excludes classifieds results instead of refusing to answer. I tested it both ways: a member with permission searches normally and finds listings; a member without permission searches normally and simply gets no classifieds in the results, which is the intended behaviour.

Photo URLs missing from the form

Also my fault. The URL field genuinely existed, and disappeared from the posting form during a redesign, but the help text above the upload box kept promising it. So the wording you saw was correct and the field was not there. It is back, as a "Photo URLs" box under the upload field, one URL per line, on both the new-listing and edit forms.

Limiting how many images you host

This is exactly what you asked for, and it is now an ACP option: Options > Classifieds > Photos hosted per listing, default 10, set 0 for no limit.

Set it to 1 and you get the behaviour you described: your server hosts the first photo, and any further photos have to be pasted as URLs hosted elsewhere. Only images stored on your server count towards the limit, so externally hosted ones are never capped, and the hint under the upload box now states the limit you have configured instead of a hard-coded 10.

One thing worth knowing: classifieds photos are not XenForo attachments. They are stored through XenForo's own file system under your data directory, which is why your one-attachment-per-message forum setting has no effect on them, and why the new option was needed.

Thanks again. Reports like these, with a trace and a screenshot, are what make a fix quick.

When there are multiple pages of classifieds listings, we've found that any filters we have set will disappear when we click to the next page. Is this something that can be fixed in a future update?

Thanks in advance!
Confirmed, and thank you for reporting it. That was a bug, not a design choice, and it is fixed in 1.0.9, which is up now.

The pagination links were only carrying a few of the filters (keywords, condition, price range and sort), so anything else was silently dropped on page 2. They now carry every active filter: category, keywords, condition, price range, listing type, urgent only, location and radius, sort order, view mode (gallery, list or map) and any custom field filters your categories define.

Same fix applies to the sort dropdown and the removable filter chips, so switching sort or removing one filter no longer loses the others either.
 
@SenseiXS Thank you for the detailed response. I appreciate the straightforward answers, particularly where the add-on has not yet been tested at BladeForums scale.

I also saw that 1.0.9 was released while I was reviewing this, and it appears to address a couple of things that were relevant to us, including the search error for members who do not have permission to view Classifieds and adding a limit on the number of images the site will host per listing.

A few follow-up points came out of our review:

1. Paid-member access

Our absolute minimum requirement is that use of the Classifieds system can be restricted to our paid subscribers.

Based on your explanation of the global user-group permissions, it sounds like we can simply deny the Classifieds member permissions to our Registered group and grant the appropriate permissions to our paid membership groups.

With the search-permission issue corrected in 1.0.9, can you confirm that this would now work cleanly — i.e. a non-paid member can continue using the rest of BladeForums, including normal XenForo search, while having no access to the Classifieds system?

The more granular category/listing-type permissions we discussed would still be useful, but they are not necessarily a prerequisite for our initial evaluation as long as the entire system can reliably be limited to paid members.

2. Image storage / deleted listings

The lack of a cumulative per-user image quota is not really a concern specific to your add-on. XenForo itself does not currently provide the cumulative attachment-storage quota system we would like, so I would not hold Classifieds to a requirement the core software does not meet.

The new per-listing hosted-image limit in 1.0.9 is also helpful.

The issue I am more concerned about is the one you identified where deleting a listing currently leaves the image files behind. On a site with our volume that would accumulate indefinitely.

You mentioned treating this as a defect to be fixed. Has that been corrected in 1.0.9, or is that still pending? I would prefer to have that resolved before we begin a serious staging evaluation.

3. Historical sold listings

I found the 1.0.4 change allowing members to browse and search sold listings, including category, keyword and price filtering. That is exactly the sort of historical functionality we want.

Our existing Exchange has decades of transaction history, and we consider completed listings useful for price history, provenance, seller history, and occasionally moderation or fraud investigations.

Can you confirm that sold listings can be retained indefinitely and are not subject to any automatic pruning or deletion?

Ideally, expired or otherwise closed listings could also remain as historical records rather than being physically deleted, even if they are excluded from the normal active-listing view.

4. Classifieds feedback in forum posts

If we eventually use the Classifieds feedback system instead of, or alongside, our existing XenCentral Feedback system, is there currently any way to display a member's Classifieds reputation in XenForo's message user info/postbit underneath their avatar and other user information?

Something compact such as a feedback count/percentage would be useful when members are interacting in the Exchange and elsewhere on the forum.

Ideally we would be able to display it either site-wide or only in selected forums.

If that is not currently supported, is it something that would be reasonably straightforward to add?

5. Moderator audit logging

For clarification, the lack of XenForo moderator-log entries is not a pass/fail issue for us. It would be useful, but I would not hold up an evaluation or deployment solely on that feature.

As far as testing goes, the €39 license cost is not really the issue. I am perfectly comfortable purchasing a license when we reach that point. My hesitation is spending time setting up and evaluating the system while we still know that one or more minimum operational requirements are unresolved.

Once those core points are settled, I think the next logical step would be a staging installation followed by the larger synthetic-data/performance testing you offered.

Thanks again for taking the time to answer all of this.
 
Thank you for both reports, and for the stack trace in particular. Both are bugs on my side, and both are fixed in 1.0.9, which is up now.

The search error

This one was serious and you were right to flag it: any member who could not view the classifieds could not search the forum at all, whatever they were searching for.

The cause: the add-on tells XenForo which content a member may see through a search handler. Mine returned false when the member lacked the view permission, where XenForo expects an array, and it passes that value straight into a typed method. Hence the TypeError, thrown before any search could run.

It now returns a constraint that excludes classifieds results instead of refusing to answer. I tested it both ways: a member with permission searches normally and finds listings; a member without permission searches normally and simply gets no classifieds in the results, which is the intended behaviour.

Photo URLs missing from the form

Also my fault. The URL field genuinely existed, and disappeared from the posting form during a redesign, but the help text above the upload box kept promising it. So the wording you saw was correct and the field was not there. It is back, as a "Photo URLs" box under the upload field, one URL per line, on both the new-listing and edit forms.

Limiting how many images you host

This is exactly what you asked for, and it is now an ACP option: Options > Classifieds > Photos hosted per listing, default 10, set 0 for no limit.

Set it to 1 and you get the behaviour you described: your server hosts the first photo, and any further photos have to be pasted as URLs hosted elsewhere. Only images stored on your server count towards the limit, so externally hosted ones are never capped, and the hint under the upload box now states the limit you have configured instead of a hard-coded 10.

One thing worth knowing: classifieds photos are not XenForo attachments. They are stored through XenForo's own file system under your data directory, which is why your one-attachment-per-message forum setting has no effect on them, and why the new option was needed.

Thanks again. Reports like these, with a trace and a screenshot, are what make a fix quick.


Confirmed, and thank you for reporting it. That was a bug, not a design choice, and it is fixed in 1.0.9, which is up now.

The pagination links were only carrying a few of the filters (keywords, condition, price range and sort), so anything else was silently dropped on page 2. They now carry every active filter: category, keywords, condition, price range, listing type, urgent only, location and radius, sort order, view mode (gallery, list or map) and any custom field filters your categories define.

Same fix applies to the sort dropdown and the removable filter chips, so switching sort or removing one filter no longer loses the others either.
I will install the update and let you know if there are any issues... but thank you so much!! I am excited by these fixes and updates. Thank you so much for being so responsive. It is super appreciated. :)
 
@SenseiXS Thank you for the detailed response. I appreciate the straightforward answers, particularly where the add-on has not yet been tested at BladeForums scale.

I also saw that 1.0.9 was released while I was reviewing this, and it appears to address a couple of things that were relevant to us, including the search error for members who do not have permission to view Classifieds and adding a limit on the number of images the site will host per listing.

A few follow-up points came out of our review:

1. Paid-member access

Our absolute minimum requirement is that use of the Classifieds system can be restricted to our paid subscribers.

Based on your explanation of the global user-group permissions, it sounds like we can simply deny the Classifieds member permissions to our Registered group and grant the appropriate permissions to our paid membership groups.

With the search-permission issue corrected in 1.0.9, can you confirm that this would now work cleanly — i.e. a non-paid member can continue using the rest of BladeForums, including normal XenForo search, while having no access to the Classifieds system?

The more granular category/listing-type permissions we discussed would still be useful, but they are not necessarily a prerequisite for our initial evaluation as long as the entire system can reliably be limited to paid members.

2. Image storage / deleted listings

The lack of a cumulative per-user image quota is not really a concern specific to your add-on. XenForo itself does not currently provide the cumulative attachment-storage quota system we would like, so I would not hold Classifieds to a requirement the core software does not meet.

The new per-listing hosted-image limit in 1.0.9 is also helpful.

The issue I am more concerned about is the one you identified where deleting a listing currently leaves the image files behind. On a site with our volume that would accumulate indefinitely.

You mentioned treating this as a defect to be fixed. Has that been corrected in 1.0.9, or is that still pending? I would prefer to have that resolved before we begin a serious staging evaluation.

3. Historical sold listings

I found the 1.0.4 change allowing members to browse and search sold listings, including category, keyword and price filtering. That is exactly the sort of historical functionality we want.

Our existing Exchange has decades of transaction history, and we consider completed listings useful for price history, provenance, seller history, and occasionally moderation or fraud investigations.

Can you confirm that sold listings can be retained indefinitely and are not subject to any automatic pruning or deletion?

Ideally, expired or otherwise closed listings could also remain as historical records rather than being physically deleted, even if they are excluded from the normal active-listing view.

4. Classifieds feedback in forum posts

If we eventually use the Classifieds feedback system instead of, or alongside, our existing XenCentral Feedback system, is there currently any way to display a member's Classifieds reputation in XenForo's message user info/postbit underneath their avatar and other user information?

Something compact such as a feedback count/percentage would be useful when members are interacting in the Exchange and elsewhere on the forum.

Ideally we would be able to display it either site-wide or only in selected forums.

If that is not currently supported, is it something that would be reasonably straightforward to add?

5. Moderator audit logging

For clarification, the lack of XenForo moderator-log entries is not a pass/fail issue for us. It would be useful, but I would not hold up an evaluation or deployment solely on that feature.

As far as testing goes, the €39 license cost is not really the issue. I am perfectly comfortable purchasing a license when we reach that point. My hesitation is spending time setting up and evaluating the system while we still know that one or more minimum operational requirements are unresolved.

Once those core points are settled, I think the next logical step would be a staging installation followed by the larger synthetic-data/performance testing you offered.

Thanks again for taking the time to answer all of this.
Thanks for the follow-up. Three of your five points needed code rather than an opinion, so I built them first and tested them before answering. 1.0.10 is up now.

1. Paid-member access

Confirmed, and I tested exactly your scenario rather than reasoning about it: take the classifieds permissions away from a group, then use the forum as a member of that group.

  • Forum-wide search: works normally, returns its usual results, zero classifieds among them, no error.
  • /classifieds/: blocked with the standard "You do not have permission" page, not an error.
  • Search form tab: hidden.
  • Navigation entry: hidden (it is conditional on the view permission).

So denying the member permissions to Registered and granting them to your paid groups gives you exactly what you described. That was broken before 1.0.9 and is the one thing I would have wanted you to retest anyway, so I am glad you asked.

2. Image storage on deleted listings

Fixed in 1.0.10, and it turned out to be worse than I described.

Deleting a listing now deletes its photo files. While testing that I found the same call was already wrong in the uninstall routine, so uninstalling the add-on was leaving the entire image directory on disk too. Both used a Flysystem method name that does not exist in this version, and both failures were swallowed by a catch block, which is why nobody noticed. Fixed in all three places.

There is also a new ACP tool, Maintenance > Purge orphaned photos, for files left behind by earlier versions. It walks the classifieds image directory, deletes any folder whose listing no longer exists, and reports how many files it removed and how much space it freed. On your volume that first run may be worth watching.

Tested end to end: create a listing with a hosted photo, delete the listing, file is gone; create a folder for a listing that does not exist, run the tool, folder is gone and real listings are untouched.

3. Historical sold listings

Confirmed, and this is by design rather than by accident.

Nothing in the add-on deletes a listing automatically. The expiry cron only changes a listing's status from active to expired; it never removes rows. Sold and expired listings stay in the database indefinitely, keep their photos, their offer history and their reviews, and remain reachable by direct URL, by search and by the seller's profile.

Browsing them is controlled by an option: sold listings can be included in normal browse and search, or kept out of the active view while remaining accessible. Expired listings behave the same way. The only deletions are ones a member or a moderator performs deliberately.

So your price-history, provenance and fraud-investigation use cases are supported, and I would keep them supported: a marketplace that quietly destroys its own transaction history is not much use to a board that has decades of it.

4. Classifieds reputation in posts

This did not exist. It does now, in 1.0.10.

Options > Classifieds > Show classifieds reputation in posts has three settings: off, every forum, or selected forums only. Choosing "selected forums" reveals a forum picker, so you can show it in the Exchange areas and nowhere else.

It renders under the avatar alongside join date and message count: a star, the average rating, the review count in brackets, and the certified badge where earned, linking to the seller's classifieds profile. It only appears for members who actually have reviews, and only when the review system is enabled, so it stays invisible if you keep using XenCentral Feedback instead.

On performance, since it is you asking: it does not query per post. A single listener runs once per thread page, checks whether this forum is even configured to show it, and if so loads every author's reputation in one query. A page with twenty posts from fifteen distinct members costs one extra query, not fifteen. Measured, not assumed.

5. Moderator audit logging

Noted, and thank you for the clarification. It stays on the roadmap rather than blocking anything.

Where that leaves us

Your three operational blockers are addressed: paid-member restriction verified, image cleanup fixed, historical listings confirmed permanent. The two remaining gaps are the ones you already said are not prerequisites: per-category and per-listing-type permissions, and moderator log entries.

I think your proposed sequence is the right one. Whenever you are ready, say the word and I will issue the staging licence, and I am still happy to run the synthetic-data profiling against numbers that look like yours once you have them to hand.
 
Can the classifieds function as a subdomain, ie classifieds.[website].com without issues?
Short answer: not out of the box, but it is achievable, and I prototyped it before answering you rather than guessing.

What XenForo does today

A XenForo installation has one board URL and no native multi-domain support. I checked what actually happens if you simply point a second hostname at the same installation:

  • Pages return 200. There is no forced redirect back to the board URL.
  • Navigation links are relative, so they follow the hostname you arrived on. The subdomain would therefore mirror your entire forum, threads included, not just the classifieds.
  • Canonical and Open Graph URLs still point at the main board URL, so search engines are told the real address is the main domain.

So the naive approach gives you duplicate hostnames for the whole board with none of the benefit. That is the part I would not recommend.

What the add-on could do

XenForo builds every link through a router it looks up by name, and both the router and the request paths can be replaced early in the request. I built a working prototype on that basis. With a hostname configured, on a request arriving at the subdomain:

Code:
forum home:       https://www.example.com/
a member page:    https://www.example.com/members/admin.1/
a thread:         https://www.example.com/threads/x.2254/
classifieds page: https://classifieds.example.com/classifieds/
a listing:        https://classifieds.example.com/classifieds/view/158/

That is the behaviour you want: the classifieds live on the subdomain, everything else points back to the main domain instead of being mirrored. Scripts and member data stayed on the serving host in my test. Stylesheet URLs were the one thing still following the main domain, which is a detail to settle rather than a blocker.

What I am not claiming

That is a prototype, not a feature. Turning it into something you would run in production means handling: an ACP option for the hostname, switching the add-on's own links to the dedicated router, 301s for anything else requested on the subdomain, a shared cookie domain (.[website].com) so members stay logged in across both, and canonical, Open Graph and emailed alert links pointing at the right host. Each of those is straightforward; together they are a proper piece of work that needs testing against real sessions and POST requests, not a config toggle.

If a classifieds subdomain is a genuine requirement for you rather than a nice-to-have, tell me and I will scope it as a feature with a timeline. I would rather build it once, properly, than have you discover the rough edges on a live board of your size.

In the meantime

A server-level 301 from classifieds.[website].com to https://www.[website].com/classifieds/ gives you the memorable address today, with no duplicate content, no session issues and nothing to maintain. That is what I would run until the real thing exists.
 
I'm sorry to keep asking so many questions and making requests.

First, is it possible for sellers to leave feedback for buyers? If not, could this be added in a future update?

Second, is it possible to "bump" listings to bring them to the first page? If so, what is the mechanic for it? We have members saying that their listing are getting buried under newer listings. Alternately, if/when listing expire, can members renew them or do they need to make new listings?
 
I'm sorry to keep asking so many questions and making requests.

First, is it possible for sellers to leave feedback for buyers? If not, could this be added in a future update?

Second, is it possible to "bump" listings to bring them to the first page? If so, what is the mechanic for it? We have members saying that their listing are getting buried under newer listings. Alternately, if/when listing expire, can members renew them or do they need to make new listings?
Keep them coming, these are good questions and one of them found a real gap.

1. Feedback on buyers

That already exists, it is just not obvious. Once an offer is accepted, both sides get a Leave a review button on the deal in My offers, not just the buyer. The criteria change depending on which side is being rated:

  • Rating a seller: item as described, communication, shipping cost, shipping time, packaging.
  • Rating a buyer: payment time, communication. Asking a buyer about packaging would be noise, so those fields are not shown.
  • Rating a trade: item, communication, shipping time, packaging.

A member's classifieds profile then breaks their reputation down by role, so you can see how someone behaves as a seller and as a buyer separately. That matters on a board where the same people do both.

The honest limit: this hangs off the offer system. If a sale happens through a conversation and the seller then marks the listing sold by hand, there is no accepted offer for the review to attach to, so neither side gets the button. Telling members to use "Make an offer" even at the asking price is the workaround today, and I would rather fix it properly than keep giving that advice.

2. Bumping and expiry

Two separate things here, and the answers differ.

Renewing works today. When a listing is within seven days of expiring, or has already expired, its owner sees a Renew button on the listing. It pushes the expiry date out by whatever you set in Options > Classifieds > Listing expiry and puts an expired listing back on sale. Nobody has to repost anything, and the listing keeps its photos, its offers, its views and its URL.

Bumping does not exist yet. Browse is ordered by featured first, then newest, and nothing moves an older listing back up. So your members are describing something real. The two things that do lift a listing today are the Featured flag, which you can hand out yourself or sell as a paid upgrade, and editing a listing, which changes nothing about its position either.

I would rather build this than leave it, so unless you tell me otherwise it goes into the next release: a bump action with a cooldown you control per user group, so members can lift a listing but not spam the front page. It will use its own timestamp rather than rewriting the posted date, because a listing quietly claiming to be newer than it is would break exactly the trading record I have just spent a release protecting.

Two questions on that, since you are the one running it:

  1. What cooldown feels right on your board, and should paying members get a shorter one?
  2. Should a bump be visible, as in a small "bumped" marker, or silent?

No need to apologise for asking. This is the second time your questions have turned into code, which is a better use of a support thread than most.
 
I'm glad the feedback is two-way. That's great! :) I can see the limitations with using the offer system as the trigger for setting up the buyer feedback... maybe you could set it so that if the seller manually marked it sold, they would be prompted to enter the username of the buyer before they could submit?

It would be awesome if you could add a bump system!

I'm good with having something that said "Last bumped datetime." It would be helpful for knowing the last time the seller interacted with the thread (which could be helpful if members are trying to figure out if a listing is still active.)

On the old forum that had a thread-based marketplace, we allowed members to bump once every 24 hours. We would most likely go with that again. Though one of our staff members says that 24 hours is annoying and would do it longer... so having it be something we could adjust in the admin panel would be helpful.

At this stage we don't have paid memberships, and I don't know if we would need to have more frequent bumping as a benefit for paid users.
 
Last edited:
I'm glad the feedback is two-way. That's great! :) I can see the limitations with using the offer system as the trigger for setting up the buyer feedback... maybe you could set it so that if the seller manually marked it sold, they would be prompted to enter the username of the buyer before they could submit?

It would be awesome if you could add a bump system!

I'm good with having something that said "Last bumped datetime." It would be helpful for knowing the last time the seller interacted with the thread (which could be helpful if members are trying to figure out if a listing is still active.)

On the old forum that had a thread-based marketplace, we allowed members to bump once every 24 hours. We would most likely go with that again. Though one of our staff members says that 24 hours is annoying and would do it longer... so having it be something we could adjust in the admin panel would be helpful.

At this stage we don't have paid memberships, and I don't know if we would need to have more frequent bumping as a benefit for paid users.
Both of those are built. Your suggestion about the buyer's username was the right one, and it turned out to be simpler than what I had in mind.

Feedback on hand-closed sales

Closing a listing already asks for the final price and the buyer, so the deal was sitting there unused. Now, when a seller marks a listing sold and names the buyer, both of them get a Rate this deal button on the listing. Same criteria as before, chosen by which side of the deal each person was on. No offer needed.

The buyer field stays optional, because a seller who sold to someone outside the board should not be forced to invent a name. Leave it blank and the listing closes exactly as it did, just without feedback attached.

Bumping

Built to your spec:

  • The cooldown is an option, in hours, default 24. Your staff member who wants longer can have longer, without touching code.
  • It can also be set per user group. You said you have no paid memberships today, so this sits unused, but it is there the day that changes: a group with its own value overrides the board setting, and 0 means "just use the board setting".
  • "Last bumped" is shown on the listing, right above the posted date, so a member can see at a glance that a seller was here two hours ago on a listing from last Tuesday. There is a switch to turn that display off if you would rather not show it.
  • The bump button appears on the listing and on the cards in My listings, and only when the cooldown has actually elapsed. Members do not get a button that refuses them.

One deliberate decision worth flagging, because it affects what your members see. Bumping does not rewrite the posted date. It uses its own timestamp, and browse ordering now sorts on that. So a bumped listing rises to the top, but it still says it was posted last Tuesday, and the price history still knows when it was really listed. A marketplace where old listings quietly claim to be new is a marketplace where nobody can trust a date, and you are running one where provenance matters.

Featured listings still sit above bumped ones, so paying for placement keeps meaning something.

On the cooldown you will actually want

Since you asked what feels right: 24 hours is a sensible default and it is what I have shipped. The thing that usually decides it is how fast your section moves. If a listing drops off the first page in a day, 24 hours is generous and your members will use every one of them. If it takes a week, 48 or 72 hours will feel less like a chore and your front page will look less churned. You can change it in one field, so there is no cost to trying 24 and moving it.

All of this is in the release I am preparing, alongside the sold price history and the per-category permissions. I will let you know when it is on the store.
 
Thank you for getting the requested fixes out in the latest release! Really appreciate it!

We're back with a minor display bug this time: On a classifieds listing page, users without moderator permissions are able to see the "Staff tools" bar at the bottom of their own listings. Luckily, no staff action buttons are displayed, however, seeing the bar is very confusing for our users.

Is this something that can be fixed in a future update?

Thank you!
 
Thank you for getting the requested fixes out in the latest release! Really appreciate it!

We're back with a minor display bug this time: On a classifieds listing page, users without moderator permissions are able to see the "Staff tools" bar at the bottom of their own listings. Luckily, no staff action buttons are displayed, however, seeing the bar is very confusing for our users.

Is this something that can be fixed in a future update?

Thank you!
Found it, fixed it, and you were right that it was only cosmetic. Thank you for the precise description, it pointed straight at the cause.

What was happening

The bar opened whenever the visitor could edit or delete the listing. That test is true of anyone looking at their own listing, so every seller met it. The controls inside were guarded separately and correctly excluded the owner, which is why you saw the label and nothing else: the bar and its contents were asking two different questions.

It has always behaved that way, so it is not something the last release introduced. Nothing was ever exposed by it, since no control was rendered, but an empty box marked Staff tools on your own listing is exactly the kind of thing that makes members wonder what they are not being shown.

The fix

The bar now opens on precisely the conditions its buttons use, computed once and reused, so the two cannot drift apart again. Checked in five situations: a member on their own listing, a member on someone else's, a moderator, a moderator on their own listing, and a listing waiting for approval. Owners see nothing, staff see what they had before.

One case worth mentioning because it is not a bug: a moderator looking at their own listing still sees the bar, holding the feature control. That one is genuinely a staff action on their own content, so it belongs there.

This goes out in the next release, which is close. It is turning into a substantial one, so if the empty bar is bothering your members enough that you would rather not wait, say so and I will send you the corrected template on its own.
 
We’ve purchased Classifieds and are now evaluating/configuring it for BladeForums.

After reviewing the 1.1.0 package more closely, there are several issues we need to resolve before we could put it into production.

1. Category View / Make Offer permissions do not appear to be fully enforced​

BladeForums has an important WTB permission model:

  • Registered users may create WTB listings.
  • Only paid subscribers may view or respond to WTB listings.
Classifieds defines category-level View, Create, and Make Offer permissions, but from reviewing the current code it appears that category-level View and Make Offer permissions are not consistently checked.

In particular, Listing::canView() appears to check the global Classifieds view permission without also checking the listing category's View permission, and several listing/search/profile paths appear to rely on that method.

Similarly, the Offer path appears to check the global makeOffer permission rather than the category-specific Make Offer permission.

Could you please confirm this?

For our use case, category-level View and response/offer restrictions need to be reliably enforced throughout:

  • category browsing
  • direct listing URLs
  • search results
  • seller profiles/listing summaries
  • attachments
  • offers/contact actions
This is a production requirement for us.

2. "Wanted to Buy or Trade" appears to require only WTB permission​

BladeForums allows Registered members to create WTB listings, but they are not permitted to create Trade listings.

From the current permission mapping, wanted_trade appears to be authorized using createWanted alone.

That would appear to allow a member with:

  • Create WTB: Yes
  • Create Trade: No
to create a Wanted to Buy or Trade listing.

Could the mixed type either require both permissions or receive its own permission?

3. General seller reviews can apparently be submitted without a completed transaction​

BladeForums transaction feedback requires an actual completed transaction.

The deal-specific feedback workflow looks good: accepted offers and manually closed sales with an identified buyer can both generate buyer/seller feedback.

However, the seller profile also appears to contain a general Rate this seller form that allows anyone with the rate permission to submit a review without an associated completed transaction.

Those reviews then appear to contribute to the seller's overall rating/review count, including the reputation shown under normal forum posts.

For BladeForums we need the ability to enforce:

No completed transaction = no transaction feedback.

Could you add an ACP option to disable general/non-transaction seller reviews while leaving transaction-linked feedback enabled?

Ideally something like:

Allow general seller reviews: Yes / No

We would set that to No.

4. Package/version metadata appears inconsistent​

The package identifies itself as Classifieds 1.1.0, but a number of templates/phrases/XML entries inside the package appear to carry version IDs corresponding to 1.2.0 through 1.5.0.

Is this expected?

I mainly want to make sure this is the intended production 1.1.0 package and that upgrading from it to future releases will behave normally.

Two additional questions / suggestions​

Sold price

When a seller marks a listing sold, Final Price is optional. From the code it appears that if Final Price is left blank, the listing's asking price is stored as the sale price.

Would you consider allowing the completed sale price to remain genuinely unknown/not recorded instead?

An optional keep sold price private control may also be useful. We are still evaluating how BladeForums will handle public sold-price history.

Contact Seller and Conversation permissions

BladeForums currently allows Registered users to receive/reply to Conversations but not initiate ordinary Conversations.

Classifieds' Contact Seller / Offer workflow appears to create the Conversation itself.

Is it intentional that this can provide a listing-specific private contact path even when the buyer lacks XenForo's normal permission to initiate a Conversation?

If so, that may actually work very well for our use case; we just want to understand the intended behavior before configuring it.

Overall, Classifieds is looking very promising for us. Bumping can be completely disabled, the sold-listing locking is useful, and the built-in Classifieds reputation display under normal forum posts addresses another requirement we had.

The first three items above are the main issues we need resolved before production use.
 
Classifieds suggestion: support parent/child categories

We’ve started configuring Classifieds for BladeForums, and one thing that would be very useful for us is nested categories / subcategories.

From reviewing the current package, Classifieds categories appear to be intentionally flat, with no parent/child relationship.

For a larger marketplace like ours, that forces us toward category names such as:

  • Individual – Folding Knives
  • Individual – Fixed Blades
  • Individual – Automatic Knives
  • Dealer – Knives
  • Dealer – Gear
  • Maker – Knives
  • Maker – Supplies
  • WTB – Knives
  • WTB – Gear
It would be much cleaner if we could instead configure:

  • Individual
    • Folding Knives
    • Fixed Blades
    • Automatic Knives
    • Gear
  • Dealer
    • Knives
    • Gear
  • Maker
    • Knives
    • Supplies / Materials
    • Services
  • Want To Buy
    • Knives
    • Gear
For BladeForums, the top-level distinction between Individual, Dealer, Maker and WTB is meaningful for both navigation and permissions, while the child category describes the actual type of item.

Would you consider adding one level of parent/child category support to Classifieds?

We probably would not need unlimited-depth nesting; even a single parent → child level would solve the organizational issue cleanly.
 
Classifieds suggestion: clone/reuse custom fields + bulk permission assignment

A couple of ACP/configuration features would be very useful for larger Classifieds installations.

Clone or reuse custom fields across categories​

For BladeForums, several marketplace categories will need identical structured fields. For example, Individual, Dealer, Maker and WTB knife listings may all use something like:

Knife Type

  • Folding Knife
  • Fixed Blade
  • Automatic Knife
  • Traditional / Slipjoint
  • Other
Since custom fields currently appear to be created separately for each category, we would have to recreate the same field, dropdown choices and configuration several times.

At minimum, could you add a Clone Field action in the ACP that copies:

  • Field name
  • Field type
  • Dropdown choices
  • Required setting
  • Filterable setting
  • Other field configuration
and then allows the copy to be assigned to another category?

An even cleaner solution, if it fits the existing architecture, would be allowing one custom-field definition to be assigned to multiple categories.

Either approach would make maintaining consistent filterable fields across a larger marketplace considerably easier.

Apply Classifieds permissions to multiple user groups​

Another useful ACP improvement would be the ability to apply the same Classifieds permission configuration to multiple user groups at once.

BladeForums has several paid membership groups that will share many of the same Classifieds permissions. Configuring the same category/listing permissions separately for every applicable group becomes repetitive and also increases the chance of one group being configured differently by mistake.

Something along the lines of:

Apply to user groups:

  • Gold
  • Platinum
  • Lifetime Gold
  • Lifetime Platinum
  • etc.
would make initial setup and later permission changes much easier.

This could either be part of the Classifieds permission interface itself or a way to copy a completed Classifieds permission set from one user group to several others.

Feature request priority​

For our use case, I would rank these:

1. Reusable custom fields across multiple categories — preferred solution, since one field definition could be maintained centrally.

2. Clone custom field — very useful fallback if reusable fields would require a larger architectural change.

3. Apply/copy Classifieds permissions to multiple user groups — primarily an ACP quality-of-life improvement, but increasingly valuable on boards with a more complex membership structure.
 
We’ve purchased Classifieds and are now evaluating/configuring it for BladeForums.

After reviewing the 1.1.0 package more closely, there are several issues we need to resolve before we could put it into production.

1. Category View / Make Offer permissions do not appear to be fully enforced​

BladeForums has an important WTB permission model:

  • Registered users may create WTB listings.
  • Only paid subscribers may view or respond to WTB listings.
Classifieds defines category-level View, Create, and Make Offer permissions, but from reviewing the current code it appears that category-level View and Make Offer permissions are not consistently checked.

In particular, Listing::canView() appears to check the global Classifieds view permission without also checking the listing category's View permission, and several listing/search/profile paths appear to rely on that method.

Similarly, the Offer path appears to check the global makeOffer permission rather than the category-specific Make Offer permission.

Could you please confirm this?

For our use case, category-level View and response/offer restrictions need to be reliably enforced throughout:

  • category browsing
  • direct listing URLs
  • search results
  • seller profiles/listing summaries
  • attachments
  • offers/contact actions
This is a production requirement for us.

2. "Wanted to Buy or Trade" appears to require only WTB permission​

BladeForums allows Registered members to create WTB listings, but they are not permitted to create Trade listings.

From the current permission mapping, wanted_trade appears to be authorized using createWanted alone.

That would appear to allow a member with:

  • Create WTB: Yes
  • Create Trade: No
to create a Wanted to Buy or Trade listing.

Could the mixed type either require both permissions or receive its own permission?

3. General seller reviews can apparently be submitted without a completed transaction​

BladeForums transaction feedback requires an actual completed transaction.

The deal-specific feedback workflow looks good: accepted offers and manually closed sales with an identified buyer can both generate buyer/seller feedback.

However, the seller profile also appears to contain a general Rate this seller form that allows anyone with the rate permission to submit a review without an associated completed transaction.

Those reviews then appear to contribute to the seller's overall rating/review count, including the reputation shown under normal forum posts.

For BladeForums we need the ability to enforce:

No completed transaction = no transaction feedback.

Could you add an ACP option to disable general/non-transaction seller reviews while leaving transaction-linked feedback enabled?

Ideally something like:

Allow general seller reviews: Yes / No

We would set that to No.

4. Package/version metadata appears inconsistent​

The package identifies itself as Classifieds 1.1.0, but a number of templates/phrases/XML entries inside the package appear to carry version IDs corresponding to 1.2.0 through 1.5.0.

Is this expected?

I mainly want to make sure this is the intended production 1.1.0 package and that upgrading from it to future releases will behave normally.

Two additional questions / suggestions​

Sold price

When a seller marks a listing sold, Final Price is optional. From the code it appears that if Final Price is left blank, the listing's asking price is stored as the sale price.

Would you consider allowing the completed sale price to remain genuinely unknown/not recorded instead?

An optional keep sold price private control may also be useful. We are still evaluating how BladeForums will handle public sold-price history.

Contact Seller and Conversation permissions

BladeForums currently allows Registered users to receive/reply to Conversations but not initiate ordinary Conversations.

Classifieds' Contact Seller / Offer workflow appears to create the Conversation itself.

Is it intentional that this can provide a listing-specific private contact path even when the buyer lacks XenForo's normal permission to initiate a Conversation?

If so, that may actually work very well for our use case; we just want to understand the intended behavior before configuring it.

Overall, Classifieds is looking very promising for us. Bumping can be completely disabled, the sold-listing locking is useful, and the built-in Classifieds reputation display under normal forum posts addresses another requirement we had.

The first three items above are the main issues we need resolved before production use.
Thank you for going through it at this level of detail. I checked all four points in the code rather than answering from memory, and you are right on all four. On one of them you are being generous.

1. Category View and Make Offer are not enforced

Confirmed, and the honest version is worse than "not consistently checked".

Per-category permissions shipped in 1.1.0, after your earlier request. The permission system itself is real: it is built on XenForo's own content permission framework, the ACP interface works, the values are stored and cached correctly, and Create is genuinely enforced when a listing is posted. What is missing is the enforcement layer for View and Make Offer. The repository even carries a ready-made "categories this visitor may view" method, and nothing in the add-on calls it. The plumbing was built and never connected.

So today the category View permission is applied on no surface at all:

  • Browse and category pages: the listing query filters on status, never on permissions.
  • Direct listing URLs: only the moderation check runs. The global view permission is enforced by the controller, the category one is not enforced anywhere.
  • Search: the permission constraint checks the global view permission only.
  • Attachments: they inherit from the listing's canView(), which is the method missing the category check, so a photo stays reachable.
  • Seller profiles, widgets and member stats: unfiltered.

And Make Offer is read as a global permission in both the offer form and the offer service, never as the category one.

Your WTB model is exactly the case this has to serve, so it is being fixed as a whole rather than surface by surface: the category check goes into canView() itself, so everything that asks that question gets the right answer, including attachments; the browse, profile and widget queries are filtered; and search gets a category constraint. That last one is cheap, because the category is already indexed as search metadata, so it costs you no reindex.

One thing I want to flag while I am in there. Contact Seller currently checks no permission at all beyond being logged in. In your model, "may not respond to WTB listings" has to cover the contact button as much as the offer button, so it is getting its own permission, settable per category.

2. Wanted to Buy or Trade

Confirmed, and the same defect exists in the other direction: For Sale or Trade is authorised by Create Sale alone, so a member allowed to sell but not to trade can post one of those.

Both mixed types will require both permissions. That is the behaviour you asked for, and it is also the only reading that makes the Trade permission mean anything.

3. General seller reviews

Confirmed. The general form on the seller profile needs only the Rate permission, with no transaction behind it, and those reviews do count towards the average rating and the review total, including the reputation shown under forum posts.

You will get the option you described, Allow general seller reviews: Yes / No. With it set to No, the form disappears from seller profiles and the endpoint refuses the submission, while accepted offers and hand-closed sales with a named buyer keep producing feedback exactly as they do now.

4. Version metadata

Expected, and cosmetic. Also untidy, and I will clean it up.

Those records are genuine Classifieds phrases and templates. Their version stamps date from development, when the internal numbering ran ahead of the release numbering, and the export preserved them. Nothing in XenForo reads those stamps when upgrading: phrases are matched by title, templates by type and title, and the stamp is simply overwritten by whatever the incoming package carries. There is no version comparison and no record is ever skipped because of one.

So yes, this is the intended production 1.1.0 package, and upgrading from it to future releases will behave normally. I will renumber the stamps anyway, so the ACP stops telling you a 1.1.0 add-on last changed a phrase in 1.5.0.

Sold price

You read it correctly: a blank Final Price stores the asking price. That is wrong, because it manufactures data that nobody entered, and on a board with your history it would quietly corrupt the price record.

A blank field will mean the sale price was not recorded. The price history already ignores sales without a recorded price, so unknown sales will not distort your averages instead of inventing a figure for them.

A per-listing "do not publish the sale price" control is a good idea and I will add it alongside. Worth knowing in the meantime: you already have a board-level lever, since viewing sold prices is a permission of its own, and the seller and the buyer always see their own transaction regardless of it. So you can keep the entire public price history behind a paid group, or behind nobody at all, while you decide.

Contact Seller and conversations

It is deliberate, and here is exactly how far it goes, because a behaviour that suits you should not rest on a surprise.

The contact and offer flows create the conversation as a trusted recipient operation. That skips four things: your Registered group not having the permission to start conversations, the recipient's permission to receive them, the recipient's privacy setting for who may message them, and whether the recipient is banned or disabled.

The first of those is the behaviour you want, and I would keep it: a marketplace where the contact button silently fails is not a marketplace. The other three are more than you asked for. In particular, a seller who has deliberately closed their inbox still receives a contact message. That is the second reason this path is getting its own permission: the listing-specific channel becomes something you grant, rather than something that happens to bypass your configuration. The default will keep today's behaviour, so nothing changes for boards already relying on it.

Where that leaves us

Points 1, 2 and 3 are defects rather than feature requests, so they go into the next release together with the version cleanup. I would rather tell you when it is out than guess at a date now. The sold price change and the contact permission follow it.

One change of behaviour to expect from the first fix, since you are configuring rather than already live. Once category View is enforced, any category permission you have already set starts taking effect on all the surfaces listed above. On a board being set up that is exactly what you want, but I would rather you hear it from me than find it.

Nothing here needs anything from you. If you want to keep configuring in the meantime, the Create permission per category already behaves as documented, and so does the transaction-linked feedback flow, so the WTB posting side of your model can be set up and tested today.
 
SenseiXS updated Classifieds, give your community a marketplace it'll actually use with a new update entry:

1.4.0: one member area, permissions that hold, and fields your search can finally see

Twelve releases separate the version listed here from the one shipping today. Here is the whole span in one update, and what each part changes for your board.

One place for everything a member does​

Dashboard, My listings, My offers, My searches and My favorites now share one side navigation, built the way XenForo builds Your account, with counts that show what needs an answer. The dashboard gathers the offers waiting on them, the listings about to expire and their...

Read the rest of this update entry...
 
SenseiXS updated Classifieds, give your community a marketplace it'll actually use with a new update entry:

1.5.0: a redesigned marketplace, trades, a deal tracker and prices from real sales

A redesigned marketplace, new ways to trade and follow a deal through, prices taken from real sales, and one hundred and twenty-six fixes, fourteen of them for security and privacy. Every board running 1.4.1 or older should upgrade.

A marketplace that looks like the rest of your board​

The marketplace and listing pages were rebuilt from XenForo's own building blocks, so they follow your style, its light and dark variations and your style properties. The marketplace page...

Read the rest of this update entry...
 
Back
Top Bottom